在 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_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 调用。 |
完整的错误码列表,请参阅 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 会回退到你随应用打包的备用文件。