处理 iOS SDK 中的错误
Adapty SDK 为所有类型的错误提供了统一的封装类,称为 AdaptyError。基本上,SDK 返回的每个错误都是 AdaptyError 类型。它有两个实用属性:originalError 和 adaptyErrorCode,详见下文。
originalError 包含原始错误,以便在需要时直接使用。其类型可以是 SKError、NSError 或 Swift 通用的 Error。该属性为可选值,因为某些错误是由 SDK 直接生成的(例如数据不一致或数据缺失),不存在最初构建该封装器所依赖的原始错误。
adaptyErrorCode 可用于处理常见问题,例如:
- 无效凭证
- 网络错误
- 取消支付
- 账单问题
- 无效收据
- 以及更多
检查错误的具体错误码并做出相应处理非常简单。
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
}
}
开始调试前请先开启详细日志。 大多数 AdaptyError 都包含一个底层的 StoreKit、网络或后端错误。开启详细日志后(Adapty.logLevel = .verbose——详见 日志记录),该底层错误会打印到控制台,通常能直接告诉你真正的原因。originalError 属性无论日志级别如何都会被填充——详细日志只是将其显示在控制台中。
如果这些解决方案无法解决您的问题,请在联系支持之前查看其他问题中的步骤,这将帮助我们更高效地为您提供协助。
StoreKit 错误
| 错误 | 代码 | 解决方案 |
|---|---|---|
| unknown | 0 | 表示发生了未知或意外错误。 请重试,或参阅其他问题部分。 |
| clientInvalid | 1 | 表示客户端不允许执行所尝试的操作。 |
| paymentCancelled | 2 | 表示用户取消了付款请求。 无需采取任何操作,但从业务逻辑角度,你可以向用户提供折扣或稍后提醒他们。 |
| paymentInvalid | 3 | 表示 App Store 无法识别某个付款参数。 |
| paymentNotAllowed | 4 | 表示用户无权授权付款。 |
| storeProductNotAvailable | 5 | 表示所请求的产品在商店中不可用。 请尝试重新安装应用。 |
| cloudServicePermissionDenied | 6 | 表示用户未允许访问云服务信息。 |
| cloudServiceNetworkConnectionFailed | 7 | 表示设备无法连接到网络。 |
| cloudServiceRevoked | 8 | 表示用户已撤销使用此云服务的权限。 |
| privacyAcknowledgementRequired | 9 | 表示用户尚未确认 Apple 的隐私政策。 |
| unauthorizedRequestData | 10 | 表示应用正在尝试使用某个属性,但不具备所需的授权。 |
| invalidOfferIdentifier | 11 | 优惠 请确保已在 AppStore Connect 中设置所需优惠,并传入有效的优惠标识符。 |
| invalidSignature | 12 | 表示付款折扣中的签名无效。 |
| missingOfferParams | 13 | 表示付款折扣中缺少参数。 |
| invalidOfferPrice | 14 | 表示你在 App Store Connect 中指定的价格已失效。优惠价格必须低于原价。 |
| noProductIDsFound | 1000 | 表示你在付费墙中请求的产品均无法在 App Store 中购买,尽管它们已在 App Store 中列出。此错误有时会伴随 如果遇到此错误,请按照修复 Code-1000 |
| productRequestFailed | 1002 | 当前无法获取可用产品列表。 |
| cantMakePayments | 1003 | 此设备不允许应用内购买。请参阅排查指南。 |
| cantReadReceipt | 1005 | 设备上没有有效的收据。这在沙盒测试期间可能会出现。 在沙盒环境中,在实际完成一次购买之前不会生成有效的收据文件,因此请先完成一次购买再访问收据。同时,确保在沙盒测试时,设备已登录有效的 Apple 沙盒账户。 |
| productPurchaseFailed | 1006 | 产品购买失败。该错误封装了底层 StoreKit 错误——请读取 originalError(或开启详细日志在控制台查看)以获取实际原因。封装的错误通常是上表中 StoreKit 错误码 0–14 之一,最常见的是 paymentCancelled、paymentInvalid、paymentNotAllowed 或 invalidOfferPrice。如果无法确定具体原因,请尝试使用新的沙盒账户;如果仍然失败,请联系 Apple 支持。 |
| refreshReceiptFailed | 1010 | 收据刷新操作失败。 |
| fetchSubscriptionStatusFailed | 1020 | 从 App Store 获取订阅状态失败。 |
| unknownTransactionId | 1030 | 交易标识符未知。 |
| paymentPendingError | 1050 | 付款正在处理中。 |
网络错误
| 错误 | 代码 | 解决方案 |
|---|---|---|
| notActivated | 2002 | Adapty SDK 尚未激活。 最常见的情况是:启动页或早期 UI 钩子在 Adapty.activate 返回之前调用了 Adapty 方法。该问题为偶发性,在模拟器上可能无法复现,因为真机的时序有所不同。请等待 activate 的回调或异步结果完成后,再发起其他 SDK 调用。完整调用顺序请参阅 iOS SDK 调用顺序。 |
| badRequest | 2003 | 请求无效。 请确保已完成与 App Store 集成所需的所有步骤。 |
| serverError | 2004 | 服务器错误。 请稍后重试。如问题持续,请联系 Adapty 支持团队。 |
| networkFailed | 2005 | 此错误表示用户设备的网络连接存在问题。 请尝试关闭 VPN,或在蜂窝网络与 WiFi 之间切换。 |
| decodingFailed | 2006 | 此错误表示响应解码失败。 请检查代码,确保所发送的参数有效。例如,此错误可能表示您使用了无效的 API 密钥。 |
| encodingFailed | 2009 | 此错误表示请求编码失败。 |
通用错误
| 错误 | 代码 | 解决方案 |
|---|---|---|
| analyticsDisabled | 3000 | 由于您已选择退出,我们无法处理分析事件。 |
| wrongParam | 3001 | 此错误表明您的某些参数不正确。 如果您正在使用 Adapty 付费墙编辑工具,且因此错误无法显示付费墙,请在付费墙编辑工具中启用 Show on device。 另一个可能的原因是本地备用付费墙文件版本与 SDK 版本不匹配,请在看板中重新下载文件。 |
| activateOnceError | 3005 | .activate 方法不能被调用超过一次。 |
| profileWasChanged | 3006 | 操作过程中用户画像发生了变化。 这通常发生在 Adapty.identify 仍在执行时调用了其他方法——进行中的调用落在即将被替换的用户画像上,SDK 会拒绝该请求。请在任何用户操作调用之前,始终 await identify(或使用其完成回调)。详见 iOS SDK 中的调用顺序。 |
| unsupportedData | 3007 | 此错误表明 SDK 不支持该数据格式。 |
| unidentifiedUserLogout | 3020 | 无法对未识别的用户调用 logout 方法。 |
| fetchTimeoutError | 3101 | 此错误表明获取操作已超时。 |
| operationInterrupted | 9000 | 此操作被系统中断。 |
其他问题
如果你还没找到解决方案,可以尝试以下步骤:
- 升级 SDK 至最新版本:我们始终建议升级到最新的 SDK 版本,因为它们更加稳定,并包含已知问题的修复。
- 联系支持团队或在支持论坛中向其他开发者寻求帮助。
- 通过 [email protected] 或在线聊天联系支持团队:如果您暂时无法升级 SDK,或升级后问题仍未解决,请联系我们的支持团队。请注意,如果您开启详细日志记录并将日志分享给团队,问题将得到更快的解决。您也可以附上相关代码片段。