Обработка ошибок в 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_FOUND1000Ни один из продуктов в пейволе недоступен в сторе.См. Исправление ошибки Code-1000 noProductIDsFound.
AdaptyErrorCode.CANT_MAKE_PAYMENTS1003Встроенные покупки не разрешены на этом устройстве.См. Исправление ошибки Code-1003 cantMakePayments.
AdaptyErrorCode.PRODUCT_NOT_FOUND22Запрошенный для покупки продукт недоступен в сторе.Убедитесь, что продукт настроен в сторе и в дашборде Adapty.
AdaptyErrorCode.NETWORK_FAILED2005Сетевой запрос завершился с ошибкой.Попросите пользователя проверить подключение или повторите вызов.
AdaptyErrorCode.ADAPTY_NOT_INITIALIZED20SDK не был активирован до выполнения вызова.Дождитесь завершения 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 перейдёт к резервному файлу, который вы включаете в приложение.

Следующие шаги