Обработка ошибок в iOS SDK

В Adapty SDK есть собственная обёртка для всех видов ошибок — AdaptyError. По сути, каждая ошибка, возвращаемая SDK, является AdaptyError. У неё есть два полезных свойства: originalError и adaptyErrorCode, описанные ниже. originalError содержит исходную ошибку на случай, если вам нужно работать с ней напрямую. Это может быть SKError, NSError или обычная Swift Error. Свойство опциональное, поскольку некоторые ошибки генерируются самим SDK — например, при несогласованных или отсутствующих данных — и не имеют исходной ошибки, вокруг которой изначально строилась обёртка.

adaptyErrorCode можно использовать для обработки типичных проблем, например:

  • неверные учётные данные
  • сетевые ошибки
  • отменённые платежи
  • проблемы с выставлением счёта
  • недействительная квитанция
  • и многое другое

Проверить ошибку на конкретный код и отреагировать соответствующим образом довольно просто.

do {
    let info = try await Adapty.makePurchase(product: product)
} catch {
    if error.adaptyErrorCode == .paymentCancelled {
        // purchase was cancelled
        // you can offer discount to your user or remind them later
    }
}

Если эти решения не помогли, см. раздел Другие проблемы — там описаны шаги, которые стоит предпринять перед обращением в поддержку, чтобы мы могли помочь вам быстрее.

Ошибки StoreKit

ОшибкаКодРешение
unknown0Код ошибки, указывающий на возникновение неизвестной или непредвиденной ошибки.
Повторите попытку или обратитесь к разделу Другие проблемы.
clientInvalid1Этот код ошибки означает, что клиенту не разрешено выполнять запрошенное действие.
paymentCancelled2

Этот код ошибки означает, что пользователь отменил запрос на оплату.

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

paymentInvalid3Эта ошибка означает, что один из параметров платежа не был распознан App Store.
paymentNotAllowed4Этот код ошибки означает, что пользователю не разрешено авторизовывать платежи.
storeProductNotAvailable5Этот код ошибки означает, что запрошенный продукт недоступен в сторе.
Попробуйте переустановить приложение.
cloudServicePermissionDenied6Этот код ошибки означает, что пользователь не предоставил доступ к информации облачного сервиса.
cloudServiceNetworkConnectionFailed7Этот код ошибки означает, что устройству не удалось подключиться к сети.
cloudServiceRevoked8Этот код ошибки означает, что пользователь отозвал разрешение на использование этого облачного сервиса.
privacyAcknowledgementRequired9Этот код ошибки означает, что пользователь ещё не принял политику конфиденциальности Apple.
unauthorizedRequestData10Этот код ошибки означает, что приложение пытается использовать свойство, для которого у него нет необходимых прав.
invalidOfferIdentifier11

Идентификатор предложения недействителен. Например, предложение с таким идентификатором не настроено в App Store, или оно было отозвано.

Убедитесь, что нужные предложения настроены в App Store Connect и передаётся действительный идентификатор предложения.

invalidSignature12Этот код ошибки означает, что подпись в скидке на платёж недействительна.
missingOfferParams13Этот код ошибки означает, что в скидке на платёж отсутствуют параметры.
invalidOfferPrice14Этот код ошибки означает, что указанная в App Store Connect цена больше не является действительной. Предложения всегда должны представлять собой сниженную цену.
noProductIDsFound1000

Эта ошибка означает, что ни один из запрошенных на пейволе продуктов недоступен для покупки в App Store, хотя они там перечислены. Иногда эта ошибка сопровождается предупреждением InvalidProductIdentifiers. Если предупреждение появляется без ошибки — игнорируйте его.

Если вы столкнулись с этой ошибкой, следуйте инструкциям в разделе Исправление ошибки Code-1000 noProductIDsFound.

productRequestFailed1002Не удалось получить список доступных продуктов в данный момент.
cantMakePayments1003Встроенные покупки не разрешены на этом устройстве. Смотрите гайд по устранению неполадок.
cantReadReceipt1005

На устройстве отсутствует действительный чек. Это может быть проблемой при тестировании в песочнице.

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

productPurchaseFailed1006Покупка продукта не удалась. Ошибка StoreKit не связана с Adapty. Попробуйте использовать новый профиль для песочницы. Если это не поможет, обратитесь в службу поддержки Apple.
refreshReceiptFailed1010Операция обновления чека завершилась неудачей.
fetchSubscriptionStatusFailed1020Не удалось получить статус подписки из App Store.
unknownTransactionId1030Идентификатор транзакции неизвестен.
paymentPendingError1050Платёж в данный момент ожидает обработки.

Сетевые ошибки

ОшибкаКодРешение
notActivated2002Adapty SDK не активирован. Необходимо правильно настроить Adapty SDK с помощью метода Adapty.activate.
badRequest2003Некорректный запрос.
Убедитесь, что вы выполнили все шаги, необходимые для интеграции с App Store.
serverError2004Ошибка сервера.
Повторите попытку через некоторое время. Если проблема не устранена, обратитесь в службу поддержки Adapty.
networkFailed2005Ошибка указывает на проблемы с сетевым подключением на устройстве пользователя.
Попробуйте отключить VPN или переключиться с мобильной сети на Wi-Fi (или наоборот).
decodingFailed2006Ошибка указывает на сбой декодирования ответа.
Проверьте код и убедитесь, что передаваемые параметры корректны. Например, эта ошибка может означать, что вы используете недействительный API-ключ.
encodingFailed2009Ошибка указывает на сбой кодирования запроса.

Общие ошибки

ОшибкаКодРешение
analyticsDisabled3000Невозможно обработать события аналитики, так как вы отключили её для данного пользователя.
wrongParam3001Эта ошибка означает, что один или несколько параметров заданы неверно.
Если вы используете Paywall Builder и не можете отобразить пейвол из-за этой ошибки, включите Show on device в Paywall Builder.
Другая возможная причина — версия локального файла резервного пейвола не совпадает с версией SDK. Скачайте новый файл в дашборде.
activateOnceError3005Метод .activate нельзя вызывать более одного раза.
profileWasChanged3006Профиль пользователя был изменён во время операции.
Эта ошибка может возникнуть, если вы вызываете identify, а затем вызываете другой метод до завершения identify. Чтобы избежать этого, дождитесь успешного завершения identify перед вызовом других методов.
unsupportedData3007Эта ошибка означает, что формат данных не поддерживается SDK.
unidentifiedUserLogout3020Метод logout нельзя вызывать для неидентифицированного пользователя.
fetchTimeoutError3101Эта ошибка означает, что операция получения данных превысила время ожидания.
operationInterrupted9000Операция была прервана системой.

Другие проблемы

Если вы ещё не нашли решение, можно попробовать следующее:

  • Обновите SDK до последней версии: мы всегда рекомендуем обновляться до актуальных версий SDK — они стабильнее и содержат исправления известных проблем.
  • Обратитесь в поддержку или получите помощь от других разработчиков на форуме поддержки.
  • Напишите в поддержку на [email protected] или в чат: если вы не готовы обновлять SDK или обновление не помогло — обратитесь к нашей команде поддержки. Учтите, что проблема решится быстрее, если вы включите подробное логирование и поделитесь логами с командой. Также можно приложить соответствующие фрагменты кода.