Обработка ошибок в React Native SDK
Каждая ошибка, возвращаемая SDK, имеет тип AdaptyErrorCode. Пример:
Если эти решения не помогли, перейдите к разделу Другие проблемы — там описаны шаги, которые нужно предпринять перед обращением в поддержку, чтобы мы могли помочь вам эффективнее.
try {
const params: MakePurchaseParamsInput = {};
await adapty.makePurchase(product, params);
} catch (error) {
if (
error instanceof AdaptyError &&
error.adaptyCode === getErrorCode('cantMakePayments')
) {
// Встроенные покупки не разрешены на этом устройстве
}
}
error.adaptyCode — это число, поэтому сравнивайте его с числом: либо с литералом (1003), либо с результатом getErrorCode('<name>'). ErrorCode работает в обратную сторону — преобразует число в имя — поэтому используйте его для логирования, а не для сравнения.
Отмена покупки пользователем — не ошибка. makePurchase возвращает AdaptyPurchaseResult с type равным 'user_cancelled' — см. Совершение покупок.
Системные коды 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. Узнайте, как это сделать для React Native. |
| productNotFound | 22 | Эта ошибка означает, что запрошенный для покупки продукт недоступен в сторе. |
| currentSubscriptionToUpdateNotFoundInHistory | 24 | Исходная подписка, которую необходимо обновить, не найдена. |
| 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 | Эта ошибка означает, что запрошенное действие над товаром завершилось неудачей. |
| billingNetworkError | 112 | Эта ошибка означает, что возникла проблема с сетевым соединением между устройством и системами Play. |
Пользовательские коды StoreKit
| Ошибка | Код | Решение |
|---|---|---|
| noProductIDsFound | 1000 | Эта ошибка означает, что ни один из продуктов, запрошенных на пейволе, недоступен для покупки в App Store, хотя они там и перечислены. Иногда вместе с ошибкой появляется предупреждение Если вы сталкиваетесь с этой ошибкой, следуйте инструкциям из раздела Исправление ошибки Code-1000 |
| productRequestFailed | 1002 | Не удаётся получить список доступных продуктов. Возможная причина: - Кеш ещё не создан, а интернет-соединение отсутствует. |
| cantMakePayments | 1003 | Встроенные покупки на этом устройстве запрещены. См. гайд по устранению проблемы. |
| noPurchasesToRestore | 1004 | Устарело в Adapty React Native SDK 4.0.3: restorePurchases() больше не возвращает эту ошибку. Если восстанавливать нечего, метод возвращает текущий профиль — проверьте в нём статус уровня доступа. В более ранних версиях SDK эта ошибка означала, что Google Play не нашёл покупку для восстановления. |
| cantReadReceipt | 1005 | На устройстве нет действительного чека. Это может быть проблемой при тестировании в песочнице. Никаких действий не требуется, однако с точки зрения бизнес-логики вы можете предложить пользователю скидку или напомнить об этом позже. |
| productPurchaseFailed | 1006 | Покупка продукта не удалась. Ошибка оборачивает внутреннюю ошибку StoreKit — изучите вложенную ошибку (или включите подробные логи, чтобы увидеть её в консоли) для выяснения реальной причины. Вложенная ошибка, как правило, является одним из кодов StoreKit 0–14 из таблицы выше — чаще всего paymentCancelled, paymentInvalid, paymentNotAllowed или invalidOfferPrice. Если определить конкретную причину не удаётся, попробуйте новый профиль в песочнице; если проблема сохраняется, обратитесь в поддержку Apple. |
| refreshReceiptFailed | 1010 | Эта ошибка означает, что чек не был получен. Применимо только к StoreKit 1. |
| receiveRestoredTransactionsFailed | 1011 | Не удалось восстановить покупки. |
| billingPlanUnavailable | 1060 | Только iOS. Продукт не поддерживает запрошенный тарифный план на этом устройстве. Для плана с обязательством на 12 месяцев требуется iOS 26.4 или новее и приложение, собранное с помощью Xcode 26.5 или новее. В React Native SDK 4.3.0 для этого кода нет имени, поэтому getErrorCode('billingPlanUnavailable') возвращает undefined: сравнивайте error.adaptyCode с 1060. |
Пользовательские сетевые коды
| Ошибка | Код | Решение |
|---|---|---|
| notActivated | 2002 | SDK Adapty не активирован. Чаще всего возникает, когда сплэш-экран или ранний UI-хук вызывает методы Adapty до того, как adapty.activate завершится. Симптом непостоянен и может не воспроизводиться на симуляторе, так как тайминги на реальном устройстве отличаются. Используйте await для activate перед любыми другими вызовами SDK. См. Порядок вызовов в React Native 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 в этом билдере. Ещё одна возможная причина — версия локального файла резервного пейвола не совпадает с версией SDK. Скачайте новый файл в дашборде. |
| activateOnceError | 3005 | Метод .activate нельзя вызывать более одного раза. |
| profileWasChanged | 3006 | Профиль пользователя был изменён во время операции. Это происходит, когда метод вызывается во время выполнения adapty.identify — вызов попадает на профиль, который вот-вот будет заменён, и SDK отклоняет его. Всегда используйте await для identify перед любыми вызовами, связанными с действиями пользователя. См. Порядок вызовов в React Native SDK. |
| unsupportedData | 3007 | Ошибка указывает на то, что формат данных не поддерживается SDK. |
| persistingDataError | 3100 | Произошла ошибка при сохранении данных. |
| fetchTimeoutError | 3101 | Ошибка указывает на превышение времени ожидания операции загрузки. |
| operationInProgress | 3201 | Другая операция того же типа ещё выполняется. Возвращается методом showStoreMessages, когда предыдущий вызов всё ещё показывает сообщения стора. Дождитесь его завершения и повторите попытку. Требуется SDK 4.3.0 или выше. |
| resolverFailure | 3202 | SDK не удалось найти ресурс, необходимый для операции. Возвращается методом showStoreMessages на iOS, когда активная оконная сцена переднего плана отсутствует. Вызовите метод повторно, когда приложение находится на переднем плане. Требуется SDK 4.3.0 или выше. |
| operationInterrupted | 9000 | Операция была прервана системой. Повторите вызов. |
Другие проблемы
Если вы ещё не нашли решение, попробуйте следующее:
- Обновите SDK до последней версии: мы всегда рекомендуем обновляться до последних версий SDK, так как они более стабильны и содержат исправления известных проблем.
- Обратитесь в поддержку или получите помощь от других разработчиков на форуме поддержки.
- Напишите в поддержку на support@adapty.io или в чат: если вы не готовы обновить SDK или обновление не помогло, обратитесь в нашу службу поддержки. Обратите внимание: проблема решится быстрее, если вы включите подробное логирование и поделитесь логами с командой. Также можно приложить соответствующие фрагменты кода.