Unity IAP 5: Что изменилось по сравнению с IAP 4 и как осуществить миграцию?
Daniel Godley - Unity
Senior Content Marketing Manager
В пятой версии Unity In-App Purchasing (IAP) архитектура IAP 4, основанная на интерфейсах, заменена единым классом StoreController, управляемым событиями. Для миграции требуются изменения в коде: удаляются интерфейсы IStoreListener и IDetailedStoreListener, а также ConfigurationBuilder, инициализация становится асинхронной, а обработка покупок осуществляется через события жизненного цикла. IAP 5 также позволяет монетизировать контент с веб-сайтов на мобильные устройства, использовать собственные платежные системы (такие как Stripe и Coda) и создавать автономные интернет-магазины.
Что нужно знать о Unity IAP 5
- В Unity IAP 5 удалены интерфейсы IStoreListener и IDetailedStoreListener, необходимые в IAP 4.
- Вся логика покупок в Unity IAP 5 осуществляется через один класс: Метод UnityIAPServices.StoreController() генерирует события на протяжении всего жизненного цикла покупки.
- Компонент ConfigurationBuilder из IAP 4 удален. Определения продуктов передаются непосредственно в функцию FetchProducts() в виде объектов ProductDefinition, содержащих идентификатор и тип продукта.
- В IAP 5 устаревший класс IDs переименован в StoreSpecificIds.
- Инициализация Unity IAP 5 является асинхронной и требует предварительной инициализации Unity Gaming Services с помощью await UnityServices.InitializeAsync().
- В IAP 5 чеки Apple автоматически проверяются через StoreKit 2, прежде чем попасть к разработчику. Для проверки в Google Play требуется лицензионный ключ Google разработчика, зашифрованный с помощью инструмента, входящего в пакет IAP .
- Поддержка StoreKit 1 возвращается в IAP 5 для устройств, которые не могут обновиться до iOS 15.0 (устройства старше iPhone 6s).
- В комплект поставки входит рабочая эталонная реализация: минимальный пример кода для IAP (скрипт PaywallManager), доступный в менеджере пакетов Unity .

В Unity IAP 5 внесены существенные архитектурные улучшения, структурные изменения в инициализации и упрощены рабочие процессы получения данных о продукте. Кроме того, это открывает путь для появления передовых функций экосистемы в будущем, включая поставщиков прямых платежей (таких как Stripe и Coda) и интернет-магазины, которые позволят вам лучше ориентировать продажи и оставлять себе большую долю выручки от покупок. Независимо от того, переходите ли вы с Unity IAP 4 на IAP 5 или впервые настраиваете мобильные внутриигровые покупки в игровом движке Unity , это пошаговое руководство охватывает весь процесс внедрения.
Архитектура
Unity IAP 4
Интерфейсы IStoreListener / IDetailedStoreListener с фиксированными функциями обратного вызова
Unity IAP 5
Единственный класс StoreController с событиями жизненного цикла
Идентификаторы магазинов
Unity IAP 4
новые идентификаторы()
Unity IAP 5
new StoreSpecificIds()
Настройка продукта
Unity IAP 4
Продукты упаковываются в ConfigurationBuilder перед инициализацией.
Unity IAP 5
Объекты ProductDefinition могут передаваться непосредственно в функцию FetchProducts() в любое время.
Инициирование покупки
Unity IAP 4
Вызов осуществляется с использованием строки идентификатора продукта.
Unity IAP 5
Функция PurchaseProduct(product) вызывается с полным объектом продукта.
Обработка закупок
Unity IAP 4
Обратный вызов ProcessPurchas через IStoreController
Unity IAP 5
Событие OnPurchasePending(Order), подтверждение с помощью ConfirmPurchase(pendingOrder)
Проверка чека (Apple)
Unity IAP 4
Ручная кроссплатформенная проверка
Unity IAP 5
Проверено с помощью StoreKit 2
Обработчики покупок в пользовательском интерфейсе
Unity IAP 4
на основе идентификатора продукта
Unity IAP 5
Без изменений — существующие обработчики пользовательского интерфейса продолжают работать.
Unity IAP 4
Unity IAP 5
Архитектура
Интерфейсы IStoreListener / IDetailedStoreListener с фиксированными функциями обратного вызова
Единственный класс StoreController с событиями жизненного цикла
Идентификаторы магазинов
новые идентификаторы()
new StoreSpecificIds()
Настройка продукта
Продукты упаковываются в ConfigurationBuilder перед инициализацией.
Объекты ProductDefinition могут передаваться непосредственно в функцию FetchProducts() в любое время.
Инициирование покупки
Вызов осуществляется с использованием строки идентификатора продукта.
Функция PurchaseProduct(product) вызывается с полным объектом продукта.
Обработка закупок
Обратный вызов ProcessPurchas через IStoreController
Событие OnPurchasePending(Order), подтверждение с помощью ConfirmPurchase(pendingOrder)
Проверка чека (Apple)
Ручная кроссплатформенная проверка
Проверено с помощью StoreKit 2
Обработчики покупок в пользовательском интерфейсе
на основе идентификатора продукта
Без изменений — существующие обработчики пользовательского интерфейса продолжают работать.
Как перейти с Unity IAP 4 на IAP 5
Миграция проходит в четыре этапа:
Инициализировать и подключиться. Инициализируйте Unity Gaming Services, получите объект StoreController, подпишитесь на его события и вызовите Connect() для доступа к Google Play или Apple App Store. Используйте OnStoreConnected и OnStoreDisconnected для переключения интерфейса покупки.
Получить товары. Создайте объект List из каталога товаров, IAP приложения, в редакторе или в коде (например, new ProductDefinition("gem_chest_01", ProductType.Consumable)) и передайте его в функцию FetchProducts(). Магазин отображает локализованные цены и описания.
Получить информацию о незавершенных покупках. Вызовите функцию FetchPurchases() для восстановления прерванных или отложенных транзакций. Ожидающие заказы поступают через событие OnPurchasePending, но разработчикам также следует обрабатывать orders.PendingOrders, поскольку в некоторых версиях iOS ожидающие события могут быть пропущены. На этом этапе можно повторно активировать подтвержденные товары, не являющиеся расходными материалами, и подписки.
Покупка, предоставление, подтверждение. Вызовите PurchaseProduct(product). В методе OnPurchasePending предоставьте товар, подтвердите получение и вызовите метод ConfirmPurchase(pendingOrder). Обрабатывайте ошибки в методе OnPurchaseFailed — отмена покупки пользователем не требует сообщения, другие ошибки должны отображаться плееру.
Процесс покупки IAP в Unity 5
Используйте представленную ниже инфографику, чтобы ознакомиться со всем процессом покупки Unity IAP5, включая новые функции, интернет-магазины, каталоги и платежные системы.

Скачать PDF-файл высокого разрешения можно здесь.
Распространенные ошибки при обновлении до IAP 5
- Дублирование заказов: один и тот же заказ может появиться как через OnPurchasePending, так и через ручную обработку ожидающего заказа. Отслеживайте обработанные транзакции в HashSet (заполненном из OnPurchasesConfirmed) и проверяйте его перед предоставлением подтверждения.
- Одновременные покупки: отключите кнопки покупки во время обработки заказа, чтобы предотвратить повторные запросы.
- Утечки информации о событии: IAP 5 работает на основе событий — отписка от всех событий StoreController происходит при уничтожении менеджера закупок.
- В StoreKit 1 покупки приостановлены: на устройствах с версиями iOS ниже 15 неподтвержденные покупки могут заблокировать возможность повторной покупки того же товара. Рекомендуется использовать бэкэнд, который отслеживает и обрабатывает эти покупки.
Проверка на стороне сервера
Идентификаторы транзакций из заказов IAP 5 могут быть отправлены в Unity Cloud Code для проверки на стороне сервера, а предметы предоставляются игрокам через Unity Economy.