处理 iOS SDK 中的错误

Adapty SDK 为所有类型的错误提供了统一的封装类,称为 AdaptyError。基本上,SDK 返回的每个错误都是 AdaptyError 类型。它有两个实用属性:originalErroradaptyErrorCode,详见下文。 originalError 包含原始错误,以便在需要时直接使用。其类型可以是 SKErrorNSError 或 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 错误

错误代码解决方案
unknown0表示发生了未知或意外错误。
请重试,或参阅其他问题部分。
clientInvalid1表示客户端不允许执行所尝试的操作。
paymentCancelled2

表示用户取消了付款请求。

无需采取任何操作,但从业务逻辑角度,你可以向用户提供折扣或稍后提醒他们。

paymentInvalid3表示 App Store 无法识别某个付款参数。
paymentNotAllowed4表示用户无权授权付款。
storeProductNotAvailable5表示所请求的产品在商店中不可用。
请尝试重新安装应用。
cloudServicePermissionDenied6表示用户未允许访问云服务信息。
cloudServiceNetworkConnectionFailed7表示设备无法连接到网络。
cloudServiceRevoked8表示用户已撤销使用此云服务的权限。
privacyAcknowledgementRequired9表示用户尚未确认 Apple 的隐私政策。
unauthorizedRequestData10表示应用正在尝试使用某个属性,但不具备所需的授权。
invalidOfferIdentifier11

优惠 identifier 无效。例如,你未在 App Store 中设置该标识符对应的优惠,或者该优惠已被撤销。

请确保已在 AppStore Connect 中设置所需优惠,并传入有效的优惠标识符。

invalidSignature12表示付款折扣中的签名无效。
missingOfferParams13表示付款折扣中缺少参数。
invalidOfferPrice14表示你在 App Store Connect 中指定的价格已失效。优惠价格必须低于原价。
noProductIDsFound1000

表示你在付费墙中请求的产品均无法在 App Store 中购买,尽管它们已在 App Store 中列出。此错误有时会伴随 InvalidProductIdentifiers 警告出现。如果仅出现警告而没有错误,可忽略该警告。

如果遇到此错误,请按照修复 Code-1000 noProductIDsFound 错误部分的步骤操作。

productRequestFailed1002当前无法获取可用产品列表。
cantMakePayments1003此设备不允许应用内购买。请参阅排查指南
cantReadReceipt1005

设备上没有有效的收据。这在沙盒测试期间可能会出现。

在沙盒环境中,在实际完成一次购买之前不会生成有效的收据文件,因此请先完成一次购买再访问收据。同时,确保在沙盒测试时,设备已登录有效的 Apple 沙盒账户。

productPurchaseFailed1006产品购买失败。该错误封装了底层 StoreKit 错误——请读取 originalError(或开启详细日志在控制台查看)以获取实际原因。封装的错误通常是上表中 StoreKit 错误码 0–14 之一,最常见的是 paymentCancelledpaymentInvalidpaymentNotAllowedinvalidOfferPrice。如果无法确定具体原因,请尝试使用新的沙盒账户;如果仍然失败,请联系 Apple 支持。
refreshReceiptFailed1010收据刷新操作失败。
fetchSubscriptionStatusFailed1020从 App Store 获取订阅状态失败。
unknownTransactionId1030交易标识符未知。
paymentPendingError1050付款正在处理中。

网络错误

错误代码解决方案
notActivated2002Adapty SDK 尚未激活。
最常见的情况是:启动页或早期 UI 钩子在 Adapty.activate 返回之前调用了 Adapty 方法。该问题为偶发性,在模拟器上可能无法复现,因为真机的时序有所不同。请等待 activate 的回调或异步结果完成后,再发起其他 SDK 调用。完整调用顺序请参阅 iOS SDK 调用顺序
badRequest2003请求无效。
请确保已完成与 App Store 集成所需的所有步骤。
serverError2004服务器错误。
请稍后重试。如问题持续,请联系 Adapty 支持团队。
networkFailed2005此错误表示用户设备的网络连接存在问题。
请尝试关闭 VPN,或在蜂窝网络与 WiFi 之间切换。
decodingFailed2006此错误表示响应解码失败。
请检查代码,确保所发送的参数有效。例如,此错误可能表示您使用了无效的 API 密钥。
encodingFailed2009此错误表示请求编码失败。

通用错误

错误代码解决方案
analyticsDisabled3000由于您已选择退出,我们无法处理分析事件。
wrongParam3001此错误表明您的某些参数不正确。
如果您正在使用 Adapty 付费墙编辑工具,且因此错误无法显示付费墙,请在付费墙编辑工具中启用 Show on device
另一个可能的原因是本地备用付费墙文件版本与 SDK 版本不匹配,请在看板中重新下载文件。
activateOnceError3005.activate 方法不能被调用超过一次。
profileWasChanged3006操作过程中用户画像发生了变化。
这通常发生在 Adapty.identify 仍在执行时调用了其他方法——进行中的调用落在即将被替换的用户画像上,SDK 会拒绝该请求。请在任何用户操作调用之前,始终 await identify(或使用其完成回调)。详见 iOS SDK 中的调用顺序
unsupportedData3007此错误表明 SDK 不支持该数据格式。
unidentifiedUserLogout3020无法对未识别的用户调用 logout 方法。
fetchTimeoutError3101此错误表明获取操作已超时。
operationInterrupted9000此操作被系统中断。

其他问题

如果你还没找到解决方案,可以尝试以下步骤:

  • 升级 SDK 至最新版本:我们始终建议升级到最新的 SDK 版本,因为它们更加稳定,并包含已知问题的修复。
  • 联系支持团队或在支持论坛中向其他开发者寻求帮助
  • 通过 [email protected] 或在线聊天联系支持团队:如果您暂时无法升级 SDK,或升级后问题仍未解决,请联系我们的支持团队。请注意,如果您开启详细日志记录并将日志分享给团队,问题将得到更快的解决。您也可以附上相关代码片段。