Привет! Я Андрей, core разработчик SDK под iOS в Adapty.
В нашей серии статей мы с командой рассказываем о внедрении покупок на iOS, и это пятая статья из серии. Познакомиться с остальными можно по ссылкам:
iOS in-app purchases часть 1: конфигурация и добавление в проект.
iOS in-app purchases часть 2: инициализация и обработка покупок.
iOS in-app purchases часть 4: локальное тестирование покупок в XCode.
iOS in-app purchases часть 5: обработка ошибок SKErrors. - Вы тут.
В этом посте я разберу SKErrors: что они значат и как их обрабатывать. Каждую ошибку мы рассмотрим в трёх аспектах: как она возникает, что с ней делать и какое сообщение показывать пользователю в уведомлении об ошибке.
SKError.Code.unknown, код 0
Что значит. Ошибка возникла по неизвестным причинам.
Как починить. Со стороны разработчика действия не требуются. Эта ошибка также приходит на запрос на получение продуктов на эмуляторе iOS 14 и выше. Для получения продуктов на эмуляторе используйте StoreKit local testing или же используйте реальный девайс / эмулятор ниже iOS 14.
Какое сообщение показать пользователю. К сожалению, покупка недоступна по неизвестной причине. Пожалуйста, попробуйте позже.
SKError.Code.clientInvalid, код 1
Что это значит. Пользователь не может совершать покупку. Например, такое может произойти, когда ребёнок пытается что-то купить при включённой функции родительского контроля.
Как починить. Со стороны разработчика действия не требуются.
Какое сообщение показать пользователю. Покупка не может быть совершена, попробуйте сменить аккаунт или устройство.
SKError.Code.paymentCancelled, код 2
Что это значит. Пользователь попал на экран оплаты, но передумал оплачивать покупку и нажал «отменить».
Как починить. С технической точки зрения, в этом случае ничего делать не нужно, потому что ошибки как таковой нет. С маркетинговой точки зрения, с такими пользователями можно работать, например, предложить ему скидку.
Какое сообщение показать пользователю. Тут два варианта. Можно ничего не показывать или показать сообщение «Вы отменили покупку. Может быть, вам интересно попробовать подписку со скидкой?»
SKError.Code.paymentInvalid, код 3
Что это значит. По каким-то причинам оплата оказалась невозможна: истёк срок действия карты или недостаточно средств для покупки.
Как починить. Со стороны разработчика действия не требуются.
Какое сообщение показать пользователю. Покупка отклонена. Пожалуйста, проверьте платёжные данные и убедитесь, что на счету достаточно средств.
SKError.Code.paymentNotAllowed, код 4
Что это значит. Скорее всего, на карте действуют ограничения на покупку: выставлены лимиты или недоступна функция покупок в интернете.
Как починить. Со стороны разработчика действия не требуются.
Какое сообщение показать пользователю. Покупка недоступна для выбранного платёжного метода. Пожалуйста, убедитесь, что ваш платёжный метод позволяет оплачивать покупки в интернете.
SKError.Code.storeProductNotAvailable, код 5
Что это значит. Пользователь пытается получить продукт, который недоступен для региона, в котором используется магазин.
Как починить. Разработчику нужно проверять продукты на предмет доступности в магазине пользователя. В частности, для этого можно использовать SKStorefront.
Какое сообщение показать пользователю. Данный продукт недоступен в вашем регионе. Пожалуйста, смените магазин и повторите попытку.
SKError.Code.cloudServicePermissionDenied, код 6
Что это значит. Пользователь не дал доступ к информации Cloud сервиса.
Как починить. Со стороны разработчика действия не требуются.
Какое сообщение показать пользователю. Сам я никогда не сталкивался с такой ошибкой. Если у вас есть опыт работы с ней, напишите в комментариях. В целом пользователю можно просто написать, что покупка отклонена.
SKError.Code.cloudServiceNetworkConnectionFailed, код 7
Что это значит. В момент покупки устройство не было подключено к интернету.
Как починить. Со стороны разработчика действия не требуются.
Какое сообщение показать пользователю. Покупка не может быть совершена, потому что устройство оффлайн. Пожалуйста, попробуйте ещё раз при стабильном подключении к интернету.
SKError.Code.cloudServiceRevoked, код 8
Что это значит. У устройства нет доступа к платёжному сервису StoreKit. Как правило, эта ошибка возникает в Sandbox.
Как починить. Попробуйте завести нового Sandbox пользователя или просто повторить операцию.
Какое сообщение показать пользователю. Возникла ошибка.
SKError.Code.privacyAcknowledgementRequired, код 9
Что это значит. Пользователь не согласился с условиями использования в AppStore.
Как починить. Со стороны разработчика действия не требуются.
Какое сообщение показать пользователю. Покупка не может быть совершена, поскольку вы не согласились с условиями использования AppStore. Пожалуйста, подтвердите согласие в настройках и вернитесь к покупке.
SKError.Code.unauthorizedRequestData, код 10
Что это значит. Со стороны разработчика не включен entitlement на использование StoreKit.
Как починить. Нужно донастроить in-app покупки внутри своего приложения:
Какое сообщение показать пользователю. Возникла ошибка. Пожалуйста, вернитесь к покупке позже.
SKError.Code.invalidOfferIdentifier, код 11
Что это значит. Пользователь пытается купить продукт с некорректным промо-оффером.
Как починить. Со стороны разработчика действия не требуются.
Какое сообщение показать пользователю. Промо-предложение недействительно.
SKError.Code.invalidSignature, код 12
Что это значит. Неправильно сгенерирована сигнатура промо-оффера для запроса в StoreKit (signature).
Как починить. Нужно перепроверить, как генерируется сигнатура, и исправить ошибки. Если вы пользователь Adapty, нужно загрузить Subscription Key.
Какое сообщение показать пользователю. Извините, возникла ошибка при использовании промо-кода. Пожалуйста, попробуйте позже.
SKError.Code.missingOfferParams, код 13
Что это значит. Неправильно формируются параметры промо-оффера.
Как починить. Нужно проверить и исправить параметры промо-оффера.
Какое сообщение показать пользователю. Извините, возникла ошибка при использовании промо-предложения. Пожалуйста, попробуйте позже.
SKError.Code.invalidOfferPrice, код 14
Что это значит. Пользователь пытается купить продукт по предложению с неактуальной ценой. Скорее всего, в AppStore указана цена, которая уже не является действующей / доступной.
Как починить. Выставить актуальную цену для предложения в AppStore.
Какое сообщение показать пользователю. Извините, покупка невозможна. Попробуйте повторить ее позже.
Заключение
Правильная обработка ошибок улучшает пользовательский опыт и может вернуть хотя бы часть тех пользователей, которые по каким-то причинам не смогли оплатить приложение сразу. Самые частые ошибки, с которыми обычно приходится сталкиваться при внедрении покупок на iOS:
неизвестная ошибка SKError.Code.unknown;
отмена покупки пользователем SKError.Code.paymentCancelled;
невозможность провести платёж SKError.Code.paymentInvalid.
Про Adapty
А вообще обработка ошибок и внедрение покупок — трудоёмкий процесс. Попробуйте Adapty SDK: подключение подписок с ним становится проще, но дело не только в этом:
Встроенная аналитика позволяет легко понимать главные метрики приложения.
Когортный анализ показывает, сходится ли экономика.
А/Б тесты пейволлов делаются налету и помогают увеличивать конверсию в платных пользователей.
Интеграции с внешними системами позволяют отправлять транзакции в сервисы атрибуции и продуктовой аналитики.
Промо кампании уменьшают отток аудитории.
Open source SDK позволяет интегрировать подписки в приложение за несколько часов.
Серверная валидация и API для работы с другими платформами упрощает работу с покупками.
Познакомьтесь подробнее с этими возможностями, чтобы быстрее внедрить подписки в своё приложение и улучшить конверсии.