Обработка ошибок в Flutter SDK
Каждая ошибка, возвращаемая SDK, имеет тип AdaptyErrorCode. Пример:
Включите подробные логи перед отладкой. Большинство AdaptyErrors оборачивают исходную ошибку StoreKit, Play Billing, сети или бэкенда. При включённых подробных логах (await Adapty().setLogLevel(AdaptyLogLevel.verbose) — см. Логирование) эта ошибка выводится в консоль, что обычно сразу указывает на причину.
Если эти решения не помогли, см. раздел Другие проблемы, где описаны шаги, которые стоит предпринять перед обращением в поддержку — это поможет нам помочь вам быстрее.
try {
final result = await adapty.makePurchase(product: product);
} on AdaptyError catch (adaptyError) {
if (adaptyError.code == AdaptyErrorCode.paymentCancelled) {
// Cancelled
}
} catch (e) {
}
Системные коды StoreKit
| Ошибка | Код | Решение |
|---|---|---|
| unknown | 0 | Код ошибки, указывающий на возникновение неизвестной или непредвиденной ошибки. Повторите попытку или см. раздел Другие проблемы. |
| clientInvalid | 1 | Этот код ошибки указывает, что клиенту не разрешено выполнять запрошенное действие. |
| paymentCancelled | 2 | Этот код ошибки указывает, что пользователь отменил запрос на оплату. Никаких действий не требуется, однако с точки зрения бизнес-логики можно предложить пользователю скидку или напомнить о покупке позже. |
| paymentInvalid | 3 | Эта ошибка указывает, что один из параметров платежа не был распознан App Store. |
| paymentNotAllowed | 4 | Этот код ошибки указывает, что пользователю не разрешено авторизовывать платежи. |
| storeProductNotAvailable | 5 | Этот код ошибки указывает, что запрошенный продукт недоступен в сторе. Попробуйте переустановить приложение. |
| cloudServicePermissionDenied | 6 | Этот код ошибки указывает, что пользователь не разрешил доступ к информации облачного сервиса. |
| cloudServiceNetworkConnectionFailed | 7 | Этот код ошибки указывает, что устройству не удалось подключиться к сети. |
| cloudServiceRevoked | 8 | Этот код ошибки указывает, что пользователь отозвал разрешение на использование этого облачного сервиса. |
| privacyAcknowledgementRequired | 9 | Этот код ошибки указывает, что пользователь ещё не принял политику конфиденциальности Apple. |
| unauthorizedRequestData | 10 | Этот код ошибки указывает, что приложение пытается использовать свойство, для которого у него нет необходимых прав. |
| invalidOfferIdentifier | 11 |
Убедитесь, что нужные предложения настроены в AppStore Connect, и передайте корректный идентификатор предложения. |
| invalidSignature | 12 | Этот код ошибки указывает, что подпись в скидке на оплату недействительна. |
| missingOfferParams | 13 | Этот код ошибки указывает, что в скидке на оплату отсутствуют параметры. |
| invalidOfferPrice | 14 | Этот код ошибки указывает, что цена, указанная вами в App Store Connect, больше не является действительной. Предложения всегда должны представлять сниженную цену. |
Кастомные коды ошибок Android
| Ошибка | Код | Решение |
|---|---|---|
| adaptyNotInitialized | 20 | Необходимо правильно настроить Adapty SDK с помощью метода Adapty.activate. Узнайте, как это сделать для Flutter. |
| productNotFound | 22 | Эта ошибка означает, что запрошенный для покупки продукт недоступен в сторе. |
| invalidJson | 23 | JSON пейвола недействителен. Исправьте его в дашборде Adapty. Подробнее о том, как это сделать, см. в разделе Настройка пейвола с помощью Remote Config. |
| currentSubscriptionToUpdateNotFoundInHistory | 24 | Исходная подписка, которую необходимо продлить, не найдена. |
| pendingPurchase | 25 | Эта ошибка означает, что статус покупки — ожидание, а не завершение. Подробнее см. на странице Handling pending transactions в документации Android Developer. |
| billingServiceTimeout | 97 | Эта ошибка означает, что запрос достиг максимального таймаута до того, как Google Play успел ответить. Это может быть вызвано, например, задержкой при выполнении действия, запрошенного вызовом Play Billing Library. |
| featureNotSupported | 98 | Запрошенная функция не поддерживается Play Store на данном устройстве. |
| billingServiceDisconnected | 99 | Эта критическая ошибка означает, что соединение клиентского приложения со службой Google Play Store через BillingClient было разорвано. |
| billingServiceUnavailable | 102 | Эта временная ошибка означает, что служба Google Play Billing в данный момент недоступна. В большинстве случаев это свидетельствует о проблемах с сетевым соединением где-то между клиентским устройством и сервисами Google Play Billing. |
| billingUnavailable | 103 | Эта ошибка означает, что в процессе покупки произошла ошибка биллинга пользователя. Примеры случаев, когда это может произойти: 1. Приложение Play Store на устройстве пользователя устарело. 2. Пользователь находится в неподдерживаемой стране. 3. Пользователь является корпоративным пользователем, и администратор организации запретил совершение покупок. 4. Google Play не может списать средства со способа оплаты пользователя. Например, срок действия кредитной карты мог истечь. 5. Пользователь не авторизован в приложении Play Store. |
| developerError | 105 | Это критическая ошибка, указывающая на некорректное использование API. |
| billingError | 106 | Это критическая ошибка, указывающая на внутреннюю проблему самого Google Play. |
| itemAlreadyOwned | 107 | Расходуемая покупка уже была приобретена. |
| itemNotOwned | 108 | Эта ошибка означает, что запрошенное действие с товаром завершилось неудачей, поскольку он не принадлежит пользователю. |
Пользовательские коды StoreKit
| Ошибка | Код | Решение |
|---|---|---|
| noProductIDsFound | 1000 | Эта ошибка означает, что ни один из продуктов, запрошенных на пейволе, недоступен для покупки в App Store, хотя они там и перечислены. Иногда ошибка сопровождается предупреждением Если вы столкнулись с этой ошибкой, следуйте шагам в разделе Исправление ошибки Code-1000 |
| noProductsFound | 1001 | Эта ошибка означает, что продукт, запрошенный для покупки, недоступен в сторе. |
| productRequestFailed | 1002 | Не удалось получить список доступных продуктов в данный момент. |
| cantMakePayments | 1003 | Встроенные покупки не разрешены на этом устройстве. См. гайд по устранению проблемы. |
| noPurchasesToRestore | 1004 | Эта ошибка означает, что App Store не нашёл покупку для восстановления. |
| cantReadReceipt | 1005 | На устройстве отсутствует действительный чек. Это может быть проблемой при тестировании в песочнице. В песочнице действительный файл чека появляется только после реальной покупки, поэтому сначала совершите её. При тестировании в песочнице также убедитесь, что на устройстве выполнен вход с действительным аккаунтом Apple sandbox. |
| productPurchaseFailed | 1006 | Покупка продукта не удалась. Эта ошибка оборачивает базовую ошибку StoreKit — прочитайте вложенную ошибку (или включите подробные логи, чтобы увидеть её в консоли) для выяснения причины. Вложенная ошибка, как правило, соответствует одному из кодов StoreKit 0–14 из таблицы выше — чаще всего paymentCancelled, paymentInvalid, paymentNotAllowed или invalidOfferPrice. Если определить конкретную причину не удаётся, попробуйте новый профиль в песочнице; если проблема сохраняется, обратитесь в поддержку Apple. |
| missingOfferSigningParams | 1007 | Эта ошибка указывает на проблемы с интеграцией Adapty или с офферами. Обратитесь к разделам Настройка интеграции с App Store и Офферы для получения подробностей о настройке. |
| refreshReceiptFailed | 1010 | Эта ошибка означает, что чек не был получен. Применимо только к StoreKit 1. |
| receiveRestoredTransactionsFailed | 1011 | Восстановление покупок не удалось. |
Пользовательские сетевые коды
| Ошибка | Код | Решение |
|---|---|---|
| notActivated | 2002 | SDK Adapty не активирован. Чаще всего возникает, когда сплэш-экран или ранний UI-хук вызывает методы Adapty до того, как Adapty().activate завершится. Симптом непостоянен и может не воспроизводиться в эмуляторе, поскольку тайминги на реальном устройстве отличаются. Используйте await для Future activate перед любыми другими вызовами SDK. Полная последовательность описана в статье Порядок вызовов в Flutter SDK. |
| badRequest | 2003 | Некорректный запрос. Убедитесь, что вы выполнили все шаги, необходимые для интеграции с App Store. |
| serverError | 2004 | Ошибка сервера. Повторите попытку через некоторое время. Если проблема не устранена, обратитесь в службу поддержки Adapty. |
| networkFailed | 2005 | Ошибка указывает на проблемы с сетевым подключением на устройстве пользователя. Попробуйте отключить VPN или переключиться с мобильной сети на Wi-Fi или наоборот. |
| decodingFailed | 2006 | Ошибка указывает на сбой при декодировании ответа. Проверьте код и убедитесь, что передаваемые параметры корректны. Например, эта ошибка может означать, что используется неверный API-ключ. |
| encodingFailed | 2009 | Ошибка указывает на сбой при кодировании запроса. |
| analyticsDisabled | 3000 | Обработка аналитических событий недоступна, так как вы отключили её для данного пользователя. |
| wrongParam | 3001 | Ошибка указывает на некорректные параметры. Если вы используете Paywall Builder и не можете отобразить пейвол из-за этой ошибки, включите Show on device в Paywall Builder. Другая возможная причина — версия локального файла резервного пейвола не соответствует версии SDK. Скачайте новый файл в дашборде. |
| activateOnceError | 3005 | Метод .activate нельзя вызывать более одного раза. |
| profileWasChanged | 3006 | Профиль пользователя был изменён во время выполнения операции. Это происходит, когда метод вызывается в то время, как Adapty().identify ещё выполняется — вызов попадает на профиль, который вот-вот будет заменён, и SDK отклоняет его. Всегда используйте await для identify перед любыми пользовательскими вызовами. Подробнее см. в статье Порядок вызовов в Flutter SDK. |
| unsupportedData | 3007 | Ошибка указывает на то, что формат данных не поддерживается SDK. |
| persistingDataError | 3100 | Произошла ошибка при сохранении данных. |
| fetchTimeoutError | 3101 | Ошибка указывает на превышение времени ожидания при выполнении операции получения данных. |
Другие проблемы
Если вы ещё не нашли решение, попробуйте следующее:
- Обновите SDK до последней версии: мы всегда рекомендуем переходить на актуальные версии SDK — они стабильнее и содержат исправления известных проблем.
- Обратитесь в поддержку или получите помощь от других разработчиков на форуме.
- Напишите в поддержку на support@adapty.io или через чат: если вы не готовы обновлять SDK или это не помогло, обратитесь в нашу службу поддержки. Обратите внимание: проблема решится быстрее, если вы включите подробное логирование и поделитесь логами с командой. Также можно прикрепить соответствующие фрагменты кода.