Найти тему
Nuances of programming

Подписки, чеки и StoreKit в iOS 14

Оглавление

Источник: Nuances of Programming

Из всех способов получить деньги за работу, которую вы вкладываете в разработку приложений, лучшим на сегодняшний день является подписка. В статье я надеюсь рассмотреть лучшие практики, изложенные в докладе WWDC2019, и связать их с докладом WWDC2020 по архитектуре подписок. Завершу свое обсуждение примером кода.

Предыстория

Вся индустрия IT приложений движется к подписке уже более десяти лет. Amazon был одним из первых игроков с AWS в 2006 году. Microsoft и Apple запустили продукты в 2011 году: Office 365 и iCloud. И даже Adobe присоединилась к вечеринке в 2013 году, когда их Creative Suite вышел в интернет.

Это золотой стандарт, потому что постоянный доход помогает преодолеватьсложности. Некоторые отрасли занимаются этим десятилетиями, телекоммуникации и издательское дело  —  лишь некоторые из них. Вокруг этого выросла целая наука. Разберемся детальнее.

Привлечение подписчиков

Подписки и другие покупки в приложении можно продавать с помощью одного или нескольких из этих трех классических путей:

  • Во время презентации возможностей приложения при первом запуске.
  • С помощью модели freemium, предлагающей уменьшенную функциональность, но возможность обновления до подписки в приложении.
  • Используя “пэйволмат” (подход с дозированной оплатой), который позволит использовать функционал только в течение определенного периода.

Но есть вариант лучше  —  перед загрузкой вашего приложения можно начать продвигать в App Store подписки.

Типы предложений подписок

Существует три типа подписок, которые вы можете продавать: ознакомительные и рекламные предложения и, в соответствии с iOS 14, коды предложений.

Можно предоставить все три варианта одновременно, если это имеет смысл. Эта таблица, взятая с веб-страницы для разработчиков, сравнивает и противопоставляет различные типы.

-2

Сравнение предложений подписок

iOS 14, iPadOS 14 и более поздние версии

Сохранение подписчиков

Завоевав сердца публики, следующая задача  —  убедиться, что они остаются подписанными. Задача имеет собственный термин на языке подписчиков: текучесть (churn). Нужно, чтобы они были подписанными навсегда.

В WWDC2019 на эту тему говорили не менее, чем о шести способах, как удержать клиентов на крючке, и представили этот ряд иконок:

-3

Что он означает?

Возврат

В этом случае клиент отменяет подписку еще до истечения срока ее действия. Если это сделали, выясните, в чем была причина и попробуйте вернуть их предложением.

Удержание

В этом случае клиент изменяет автоматическое обновление подписки с true на false. Нужно попытаться выяснить, что не так, и снова попытаться заставить их изменить свое мнение с помощью предложения автообновления.

Предложения для сохранения

Здесь у вас есть веские основания полагать, что клиент может уйти. Это балансирующий акт, но нужно удержать его и сделать предложение, чтобы попытаться переубедить.

Обновление/даунгрейд

Вам нужно больше денег, заставьте их обновиться. Сделайте им новое предложение.

Обслуживание клиентов

Случай, когда клиенты жалуются на потерю обслуживания. Это может побудить их отказаться от подписки. Чтобы предотвратить это, окажите жест доброй воли для компенсации проблемы.

Лояльность

Здесь клиент возобновляет подписку снова и снова  —  поведение, которое желательно вознаградить. Окажите им предложение лояльности, чтобы побудить их продолжать возвращаться.

Все способы выглядят и звучат великолепно в теории, но как их применить на практике? В WWDC2020 связывают эти предложения с пунктом, в котором ваши подписчики находятся в путешествии, которое можно более подробно рассмотреть, используя чек с их текущим статусом подписки.

Скачав самый последний чек, вы можете решить, как адаптировать предложения, чтобы удержать подписчика. Вот список, взятый из документации Apple, о том, что означают все ошибки в указанном чеке (перевод ниже).

-4

Свойства
enviroment string

Среда, для которой был сгенерирован чек. 
Возможные значения: Sandbox, Production.

is-retryable boolean

Индикатор того, что во время запроса произошла ошибка. Значение 1 указывает на временную проблему; повторите проверку этого чека позже. 0 указывает на неразрешимую проблему; не повторяйте проверку для этого чека. Коды состояния 21100–21199.

latest_receipt byte

Последний закодированный Base64 чек приложения. Возвращается только для чеков, которые содержат автоматически возобновляемые подписки.

latest_receipt_info [responseBody.Latest_receipt_info]

Массив, содержащий все транзакции покупки в приложении. Исключает операции для расходных продуктов, которые были помечены как готовые вашим приложением. Возвращается только для чеков, содержащих автоматическое возобновление подписки.

pending_renewal_info [responseBody.Pending_renewal_info]

В JSON файле массив, в котором каждый элемент содержит ожидающую обновления информацию для каждой автоматически возобновляемой подписки, идентифицированной product_id. Возвращается только для чеков приложений, содержащих автоматическое возобновление.

receipt [responseBody.Receipt]

JSON представление чека, который был отправлен на проверку.

status [status]

0, если чек действителен, или код состояния есть ошибка. Последний отражает состояние чека приложения в целом. См. раздел status для получения возможных кодов состояния и описаний.

Посмотрим на реальный чек, который я скачал из своего демонстрационного приложения, размещенный в двух частях:

Детали подписки
Детали подписки
Продолжение деталей подписки
Продолжение деталей подписки

Это массив JSON, каждый элемент которого является объектом, к которому вы можете обратиться индивидуально. Теперь нужно объединить все воедино.

Обратите внимание на pending_renewal_info. В настоящее время оно равно 1 или true. Если изменится на false в какой-то момент во время использования приложения, то пора сделать предложение об удержании.

Потратьте время, чтобы просмотреть чек и узнайте, сможете ли вы найти еще потенциальные возможности.

Примечание: поскольку мы используем изолированную среду, даты покупки и истечения срока действия одинаковы  —  ежемесячная подписка в нашем случае длится всего пять минут (для тестирования).

Это подводит меня к концу этой статьи  —  ну, кроме кода, конечно. Во-первых, полный код для классов IAPManager. Первая часть  —  это объект observable, который мы собираемся использовать в классе SwiftUI, а вторая часть  —  это шаблонные методы IAPManager.

Это класс SwiftUI, который я объединил с файлом IAPManager.swift выше, чтобы создать простое демо-приложение подписки IAP.

Для того, чтобы код заработал, придется создать продукты, которые можно купить с помощью iTunes Connect, в противном случае он ничего не найдет, и вы не увидите его в действии.

После запуска ничего не произойдет. Нажмите на вкладку Tickets, чтобы запросить поиск доступных покупок в приложении, а затем нажмите на один из элементов, которые вы хотите приобрести и который должен появиться в списке.

Спасибо за чтение!

Читайте также:

Читайте нас в Telegram, VK

Перевод статьи Mark Lucking: Subscriptions, Receipts, and StoreKit in iOS 14