在 Kotlin Multiplatform SDK 中处理错误

本页介绍 Adapty Kotlin Multiplatform SDK 中的错误处理方式。

错误处理基础

Adapty SDK 的方法是 suspend 函数,返回 AdaptyResult,结果要么是成功,要么是错误。使用 onSuccess 和 onError 分别处理这两种情况:


Adapty.getProfile()
    .onSuccess { profile ->
        // Handle success
    }
    .onError { error ->
        // Handle error
        println("Adapty error: ${error.message}")
    }

AdaptyResult 是一个密封类,因此当你需要将结果作为值使用时,也可以直接对其进行分支处理:


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_INITIALIZED20调用前 SDK 尚未激活。请等待 Adapty.activate 完成后再进行其他 SDK 调用。

完整的错误码列表,请参阅 SDK 模型参考 中的 AdaptyErrorCode。

处理特定错误

网络错误


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 方法是挂起函数,重试循环只需在两次尝试之间加上 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
}

回退到缓存数据

您无需自行缓存流程。Adapty SDK 会在设备上自动缓存,并在网络不可用时返回缓存副本,因此只需传入一个获取策略即可,无需编写自己的缓存逻辑:


Adapty.getFlow(
    placementId = "YOUR_PLACEMENT_ID",
    fetchPolicy = AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad
)
    .onSuccess { flow ->
        // Use the flow
    }
    .onError { error ->
        showErrorMessage(error.message)
    }

使用 ReturnCacheDataElseLoad 时,网络不稳定的用户能更快看到流程,代价是可能看不到最新版本。如果网络和缓存都无法提供流程,SDK 会回退到你随应用打包的备用文件。

后续步骤