---
title: "Обработка ошибок в iOS SDK"
description: "Эффективная обработка ошибок iOS SDK с помощью руководства по устранению неполадок от Adapty."
---

В Adapty SDK есть собственная обёртка для всех видов ошибок — `AdaptyError`. По сути, каждая ошибка, возвращаемая SDK, является `AdaptyError`. У неё есть два полезных свойства: `originalError` и `adaptyErrorCode`, описанные ниже.
**originalError** содержит исходную ошибку на случай, если вам нужно работать с ней напрямую. Это может быть [SKError](https://developer.apple.com/documentation/storekit/skerror), [NSError](https://developer.apple.com/documentation/foundation/nserror) или обычная Swift [Error](https://developer.apple.com/documentation/swift/error). Свойство опциональное, поскольку некоторые ошибки генерируются самим SDK — например, при несогласованных или отсутствующих данных — и не имеют исходной ошибки, вокруг которой изначально строилась обёртка.

**adaptyErrorCode** можно использовать для обработки типичных проблем, например:
- неверные учётные данные
- сетевые ошибки
- отменённые платежи
- проблемы с выставлением счёта
- недействительная квитанция
- и многое другое

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

```swift showLineNumbers title="Swift"
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
    }
}
```
:::important
Если эти решения не помогли, см. раздел [Другие проблемы](#other-issues) — там описаны шаги, которые стоит предпринять перед обращением в поддержку, чтобы мы могли помочь вам быстрее.
:::
## Ошибки StoreKit \{#storekit-errors\}
| Ошибка | Код | Решение |
|--------------------------------------------------------------------------------------------------------------------------------------------|------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [unknown](https://developer.apple.com/documentation/storekit/skerror/code/unknown) | 0 | Код ошибки, указывающий на возникновение неизвестной или непредвиденной ошибки. <br/> Повторите попытку или обратитесь к разделу [Другие проблемы](#other-issues). |
| [clientInvalid](https://developer.apple.com/documentation/storekit/skerror/code/clientinvalid) | 1 | Этот код ошибки означает, что клиенту не разрешено выполнять запрошенное действие. |
| [paymentCancelled](https://developer.apple.com/documentation/storekit/skerror/code/paymentcancelled) | 2 | <p>Этот код ошибки означает, что пользователь отменил запрос на оплату.</p><p>Никаких действий не требуется, однако с точки зрения бизнес-логики вы можете предложить пользователю скидку или напомнить об оплате позже.</p> |
| [paymentInvalid](https://developer.apple.com/documentation/storekit/skerror/code/paymentinvalid) | 3 | Эта ошибка означает, что один из параметров платежа не был распознан App Store. |
| [paymentNotAllowed](https://developer.apple.com/documentation/storekit/skerror/code/paymentnotallowed) | 4 | Этот код ошибки означает, что пользователю не разрешено авторизовывать платежи. |
| [storeProductNotAvailable](https://developer.apple.com/documentation/storekit/skerror/code/storeproductnotavailable) | 5 | Этот код ошибки означает, что запрошенный продукт недоступен в сторе. <br/> Попробуйте переустановить приложение. |
| [cloudServicePermissionDenied](https://developer.apple.com/documentation/storekit/skerror/code/cloudservicepermissiondenied) | 6 | Этот код ошибки означает, что пользователь не предоставил доступ к информации облачного сервиса. |
| [cloudServiceNetworkConnectionFailed](https://developer.apple.com/documentation/storekit/skerror/code/cloudservicenetworkconnectionfailed) | 7 | Этот код ошибки означает, что устройству не удалось подключиться к сети. |
| [cloudServiceRevoked](https://developer.apple.com/documentation/storekit/skerror/code/cloudservicerevoked/) | 8 | Этот код ошибки означает, что пользователь отозвал разрешение на использование этого облачного сервиса. |
| [privacyAcknowledgementRequired](https://developer.apple.com/documentation/storekit/skerror/code/privacyacknowledgementrequired) | 9 | Этот код ошибки означает, что пользователь ещё не принял политику конфиденциальности Apple. |
| [unauthorizedRequestData](https://developer.apple.com/documentation/storekit/skerror/code/unauthorizedrequestdata) | 10 | Этот код ошибки означает, что приложение пытается использовать свойство, для которого у него нет необходимых прав. |
| [invalidOfferIdentifier](https://developer.apple.com/documentation/storekit/skerror/code/invalidofferidentifier) | 11 | <p>[`Идентификатор`](https://developer.apple.com/documentation/storekit/skpaymentdiscount/identifier) предложения недействителен. Например, предложение с таким идентификатором не настроено в App Store, или оно было отозвано.</p><p>Убедитесь, что нужные предложения настроены в App Store Connect и передаётся действительный идентификатор предложения.</p> |
| [invalidSignature](https://developer.apple.com/documentation/storekit/skerror/code/invalidsignature) | 12 | Этот код ошибки означает, что подпись в скидке на платёж недействительна. |
| [missingOfferParams](https://developer.apple.com/documentation/storekit/skerror/code/missingofferparams) | 13 | Этот код ошибки означает, что в скидке на платёж отсутствуют параметры. |
| [invalidOfferPrice](https://developer.apple.com/documentation/storekit/skerror/code/invalidofferprice/) | 14 | Этот код ошибки означает, что указанная в App Store Connect цена больше не является действительной. Предложения всегда должны представлять собой сниженную цену. |
| noProductIDsFound | 1000 | <p>Эта ошибка означает, что ни один из запрошенных на пейволе продуктов недоступен для покупки в App Store, хотя они там перечислены. Иногда эта ошибка сопровождается предупреждением `InvalidProductIdentifiers`. Если предупреждение появляется без ошибки — игнорируйте его.</p><p>Если вы столкнулись с этой ошибкой, следуйте инструкциям в разделе [Исправление ошибки Code-1000 `noProductIDsFound`](InvalidProductIdentifiers).</p> |
| productRequestFailed | 1002 | Не удалось получить список доступных продуктов в данный момент. |
| cantMakePayments | 1003 | Встроенные покупки не разрешены на этом устройстве. Смотрите [гайд](cantMakePayments) по устранению неполадок. |
| [cantReadReceipt](https://developer.apple.com/documentation/storekit/skerror/code/paymentcancelled) | 1005 | <p>На устройстве отсутствует действительный чек. Это может быть проблемой при тестировании в песочнице.</p><p>В песочнице действительный файл чека появляется только после совершения покупки, поэтому убедитесь, что совершили хотя бы одну покупку перед обращением к нему. При тестировании в песочнице также убедитесь, что на устройстве выполнен вход с действительной тестовой учётной записью Apple.</p> |
| productPurchaseFailed | 1006 | Покупка продукта не удалась. Ошибка StoreKit не связана с Adapty. Попробуйте использовать новый [профиль для песочницы](test-purchases-in-sandbox). Если это не поможет, обратитесь в службу поддержки Apple. |
| refreshReceiptFailed | 1010 | Операция обновления чека завершилась неудачей. |
| fetchSubscriptionStatusFailed | 1020 | Не удалось получить статус подписки из App Store. |
| unknownTransactionId | 1030 | Идентификатор транзакции неизвестен. |
| paymentPendingError | 1050 | Платёж в данный момент ожидает обработки. |
## Сетевые ошибки \{#network-errors\}
| Ошибка         | Код  | Решение                                                                                                                                                                                                                              |
| :------------- | :--- |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| notActivated   | 2002 | Adapty SDK не активирован. Необходимо правильно [настроить Adapty SDK](sdk-installation-ios#activate-adapty-module-of-adapty-sdk) с помощью метода `Adapty.activate`.                                                                |
| badRequest     | 2003 | Некорректный запрос. <br/> Убедитесь, что вы выполнили все шаги, необходимые для [интеграции с App Store](app-store-connection-configuration).                                                                                       |
| serverError    | 2004 | Ошибка сервера. <br/> Повторите попытку через некоторое время. Если проблема не устранена, обратитесь в службу поддержки Adapty.                                                                                                     |
| networkFailed  | 2005 | Ошибка указывает на проблемы с сетевым подключением на устройстве пользователя. <br/> Попробуйте отключить VPN или переключиться с мобильной сети на Wi-Fi (или наоборот).                                                           |
| decodingFailed | 2006 | Ошибка указывает на сбой декодирования ответа. <br/> Проверьте код и убедитесь, что передаваемые параметры корректны. Например, эта ошибка может означать, что вы используете недействительный API-ключ. |
| encodingFailed | 2009 | Ошибка указывает на сбой кодирования запроса.                                                                                                                                                                                        |
## Общие ошибки \{#general-errors\}
| Ошибка | Код | Решение |
| :------------------- | :--- |:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| analyticsDisabled    | 3000 | Невозможно обработать события аналитики, так как вы [отключили её](analytics-integration#disabling-external-analytics-for-a-specific-customer) для данного пользователя. |
| wrongParam           | 3001 | Эта ошибка означает, что один или несколько параметров заданы неверно. <br/> Если вы используете Paywall Builder и не можете отобразить пейвол из-за этой ошибки, включите **Show on device** в Paywall Builder.<br/> Другая возможная причина — версия локального файла [резервного пейвола](fallback-paywalls) не совпадает с версией SDK. Скачайте новый файл в дашборде. |
| activateOnceError    | 3005 | Метод `.activate` нельзя вызывать более одного раза. |
| profileWasChanged    | 3006 | Профиль пользователя был изменён во время операции. <br/> Эта ошибка может возникнуть, если вы вызываете `identify`, а затем вызываете другой метод до завершения `identify`. Чтобы избежать этого, дождитесь успешного завершения `identify` перед вызовом других методов. |
| unsupportedData      | 3007 | Эта ошибка означает, что формат данных не поддерживается SDK. |
| unidentifiedUserLogout | 3020 | Метод `logout` нельзя вызывать для неидентифицированного пользователя. |
| fetchTimeoutError    | 3101 | Эта ошибка означает, что операция получения данных превысила время ожидания. |
| operationInterrupted | 9000 | Операция была прервана системой. |
## Другие проблемы \{#other-issues\}

Если вы ещё не нашли решение, можно попробовать следующее:
- **Обновите SDK до последней версии**: мы всегда рекомендуем обновляться до актуальных версий SDK — они стабильнее и содержат исправления известных проблем.
- **Обратитесь в поддержку или получите помощь от других разработчиков** на [форуме поддержки](https://adapty.featurebase.app/).
- **Напишите в поддержку на [support@adapty.io](mailto:support@adapty.io) или в чат**: если вы не готовы обновлять SDK или обновление не помогло — обратитесь к нашей команде поддержки. Учтите, что проблема решится быстрее, если вы [включите подробное логирование](sdk-installation-ios#logging) и поделитесь логами с командой. Также можно приложить соответствующие фрагменты кода.