Обработка ошибок в SDK для Kotlin Multiplatform
На этой странице описана обработка ошибок в SDK Adapty для Kotlin Multiplatform.
Основы обработки ошибок
Методы Adapty SDK — это suspend-функции, возвращающие AdaptyResult: либо успешный результат, либо ошибку. Обрабатывайте оба случая с помощью onSuccess и onError:
Adapty.getProfile()
.onSuccess { profile ->
// Handle success
}
.onError { error ->
// Handle error
println("Adapty error: ${error.message}")
}
AdaptyResult — это sealed-класс, поэтому вы также можете напрямую ветвиться по нему, когда нужно получить результат как значение:
when (val result = Adapty.getProfile()) {
is AdaptyResult.Success -> {
val profile = result.value
// Handle success
}
is AdaptyResult.Error -> {
val error = result.error
// Handle error
}
}
Распространённые коды ошибок
AdaptyError.code — это значение перечисления AdaptyErrorCode, а не число. Сравнивайте его с константой перечисления, а не с числовым кодом. Числа ниже приведены лишь потому, что именно они фигурируют в строках логов и тикетах поддержки.
| Код ошибки | Номер | Описание | Решение |
|---|---|---|---|
AdaptyErrorCode.NO_PRODUCT_IDS_FOUND | 1000 | Ни один из продуктов в пейволе недоступен в сторе. | См. Исправление ошибки Code-1000 noProductIDsFound. |
AdaptyErrorCode.CANT_MAKE_PAYMENTS | 1003 | Встроенные покупки не разрешены на этом устройстве. | См. Исправление ошибки Code-1003 cantMakePayments. |
AdaptyErrorCode.PRODUCT_NOT_FOUND | 22 | Запрошенный для покупки продукт недоступен в сторе. | Убедитесь, что продукт настроен в сторе и в дашборде Adapty. |
AdaptyErrorCode.NETWORK_FAILED | 2005 | Сетевой запрос завершился с ошибкой. | Попросите пользователя проверить подключение или повторите вызов. |
AdaptyErrorCode.ADAPTY_NOT_INITIALIZED | 20 | SDK не был активирован до выполнения вызова. | Дождитесь завершения Adapty.activate перед любым другим вызовом SDK. |
Полный список кодов см. в AdaptyErrorCode в справочнике моделей SDK.
Обработка конкретных ошибок
Сетевые ошибки
Adapty.getFlow("YOUR_PLACEMENT_ID")
.onSuccess { flow ->
// Use the flow
}
.onError { error ->
when (error.code) {
AdaptyErrorCode.NETWORK_FAILED -> {
// Network error - show offline message
showOfflineMessage()
}
else -> {
showErrorMessage(error.message)
}
}
}
Ошибки при покупке
makePurchase разделяет сбои и результаты. AdaptyResult.Error означает, что вызов завершился с ошибкой; успешный результат возвращает AdaptyPurchaseResult, который сообщает, завершил ли пользователь покупку, отменил её или оставил в состоянии ожидания:
Adapty.makePurchase(product)
.onSuccess { purchaseResult ->
when (purchaseResult) {
is AdaptyPurchaseResult.Success -> showSuccessMessage()
AdaptyPurchaseResult.UserCanceled -> {
// The user dismissed the store sheet — not an error
}
AdaptyPurchaseResult.Pending -> {
// Awaiting an out-of-band payment, such as a prepaid plan
showPendingMessage()
}
}
}
.onError { error ->
when (error.code) {
AdaptyErrorCode.CANT_MAKE_PAYMENTS -> showPaymentNotAvailableMessage()
AdaptyErrorCode.PRODUCT_NOT_FOUND -> showProductNotAvailableMessage()
else -> showPurchaseErrorMessage(error.message)
}
}
Стратегии восстановления после ошибок
Повтор при сетевых ошибках
Поскольку методы SDK являются suspend-функциями, цикл повтора — это обычный цикл с delay между попытками:
suspend fun getFlowWithRetry(placementId: String, maxRetries: Int = 3): AdaptyFlow? {
repeat(maxRetries) { attempt ->
when (val result = Adapty.getFlow(placementId)) {
is AdaptyResult.Success -> return result.value
is AdaptyResult.Error -> {
if (result.error.code != AdaptyErrorCode.NETWORK_FAILED) {
showErrorMessage(result.error.message)
return null
}
delay(1000L * (attempt + 1))
}
}
}
return null
}
Возврат к кэшированным данным
Кэшировать флоу самостоятельно не нужно. SDK Adapty кэширует их на устройстве и возвращает кэшированную копию при отсутствии сети — просто передайте политику получения данных вместо того, чтобы писать собственный кэш:
Adapty.getFlow(
placementId = "YOUR_PLACEMENT_ID",
fetchPolicy = AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad
)
.onSuccess { flow ->
// Use the flow
}
.onError { error ->
showErrorMessage(error.message)
}
При использовании ReturnCacheDataElseLoad пользователи с нестабильным соединением получают флоу быстрее, но рискуют не увидеть последнюю версию. Если ни сеть, ни кэш не вернут флоу, SDK перейдёт к резервному файлу, который вы включаете в приложение.
Следующие шаги
- Исправление ошибки Code-1000 noProductIDsFound
- Исправление ошибки Code-1003 cantMakePayments
- Полный справочник API — полная документация по SDK