Если Вы разрабатываете игру или приложение с контентом, который по идее должен приобретаться неоднократно, Вам будет необходимо интегрировать в это приложение потребляемый тип покупок — consumables. В предыдущем посте IAP (Inn App Purchases) я рассказал об основах настройки приложения под транзакции IAP, добавлении элементов IAP в Google Play и iTunes Connect, а также познакомил Вас с плагином In-App Billing Plugin для Xamarin, который значительно упрощает процесс добавления IAP в код приложения. Сегодня мы рассмотрим потребляемые покупки и то, как они улучшают процесс разработки.
По сути, они представляют собой предметы, которые используются на протяжении жизни приложения, и поэтому их можно приобретать неоднократно. Примерами этого являются внутриигровые валюты, такие как monkey credits, которые показаны выше, дополнительное здоровье и разовые сервисы, как, например, транскрипции.
Настройка Consumables
Google не проводит существенных различий между non-consumable и consumable, отличие есть только в API. В случае с iOS копания Apple требует от разработчиков, чтобы те указывали эту информацию на начальном этапе при создании IAP в iTunes connect.
Идея заключается в том, что когда мы отправляем запрос на сервер iTunes, этот выбор инициирует правильный поток во время покупки.
Покупка
Как в случае с iOS, так и Android нам нужно убедиться в том, что у нас установлен плагин In-App Billing во всех проектах нашего решения при помощи NuGet. Системы iOS и Android обрабатывают consumables немного по-разному, так что мы начнем с iOS, у которой имеется очень похожий поток по отношению к non-consumables, о чем мы уже рассказывали ранее.
На этой диаграмме показываются этапы совершения покупки, мы должны:
- Запросить оплату в очереди ожидания.
- Отправить запрос на сервер.
- Подготовить процессы и возвраты iTunes.
- Обработать прием оплаты в приложении.
- Представить информацию о покупке в приложении.
Должно быть, эта схема выглядит знакомо, ведь это тот же самый поток, как non-consumables. Таким образом, все что нужно сделать — это вызвать метод PurchaseAsync, и наш товар становится доступным и может быть использован! Поскольку мы отметили IAP в качестве consumable, теперь продукт можно будет покупать неоднократно.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | try { var productId = "mysku"; var connected = await CrossInAppBilling.Current.ConnectAsync(); if (!connected) { //Не удалось подключиться к биллингу, устройство в автономном режиме, оповещаем пользователя return; } //Пробуем купить товар var purchase = await CrossInAppBilling.Current.PurchaseAsync(productId, ItemType.InAppPurchase, "apppayload"); if(purchase == null) { //Купить не удалось, оповещаем пользователя } else { //Покупка совершена, сохраняем информацию var id = purchase.Id; var token = purchase.PurchaseToken; var state = purchase.State; } } catch (Exception ex) { //Произошла ошибка, оповещаем пользователя } finally { //Отключаемся, это нормально если не удалось связаться await CrossInAppBilling.Current.DisconnectAsync(); } |
В случае с Android следует выполнить еще один дополнительный шаг. Сперва мы должны обратиться к приведенному выше коду, чтобы фактически приобрести расходный элемент. В то же время реализация Google этих consumables интегрирует сценарий, в котором пользователь может купить расходный элемент, с тем чтобы воспользоваться им в будущем. К примеру, приобретя такие вещи, как монеты, их можно будет впоследствии обналичить в игре, получив взамен какие-либо товары. Получается, что мы не можем приобрести расходный элемент вновь, пока мы на самом деле не завершим покупку и не «используем» его. Для этого плагин имеет дополнительный метод ConsumePurchaseAsync, который принимает специфическую информацию о покупке. Если этот метод вызвать на iOS, тогда просто вернется null. Мы можем использовать Device Info Plugin для вызова ConsumePurchaseAsync на Android только тогда, когда есть покупка:
1 2 3 4 5 6 7 8 9 10 | // Вызываем после успешной покупки или позднее (необходимо вызвать ConnectAsync() раньше времени): if(CrossDeviceInfo.Current.Platform == Platform.Android) { var consumedItem = await CrossInAppBilling.Current.ConsumePurchaseAsync(purchase.ProductId, purchase.PurchaseToken); if(consumedItem != null) { // Товар использован } } |
Заключение
Существует также много других IAPs, включая подписки и информацию о продукте, которые раскрываются в APIs плагинах In-App Billing. Дополнительную информацию о них можно получить из файла README на сайте проекта GitHub. Из этой же документации можно узнать о соответствующих настройках, тестировании и устранении неисправностей при интеграции In-App покупок. Кроме того, я настоятельно рекомендую прочитать полную документацию по покупкам In-App для iOS и Android.
Автор: James Montemagno
Источник: Официальный блог Xamarin
Здравствуйте, с данным плагином у меня не получилось совершать покупки, на реальном устройстве получаю сообщение, что данное приложение не найдено. Так и не смог разобраться в чем дело. Есть ли альтернативные варианты для Xamarin?
При установке из NuGet поставь галочку PreRelease package, там есть бета пакеты они гораздо новее, с ними у меня все ок