You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

iOS StoreKit订阅内购无支付数据时的回调逻辑咨询

iOS StoreKit 订阅内购:无支付数据时的流程与回调逻辑

让我结合实际开发中StoreKit的行为,给你把这些问题讲明白:

1. 无支付数据发起订阅时,代理会直接返回.failed吗?

不会的。当用户没有绑定任何有效支付方式就发起订阅请求时,StoreKit不会立刻触发失败回调,而是先拉起系统级的支付信息补全流程——也就是弹出苹果官方的支付设置界面,引导用户绑定银行卡、支付宝/微信(国内区)等有效支付方式。

这时候你的paymentQueue(_:updatedTransactions:)代理方法(StoreKit 1)暂时不会收到任何失败相关的交易更新,因为系统还在尝试让用户完成支付信息的补全,没有进入到支付失败的判定环节。

2. 用户补填支付数据后,StoreKit会直接返回.purchased吗?

分两种情况:

  • 如果用户成功补填了有效且可用的支付数据,系统会自动继续之前的订阅支付流程,不需要你额外触发请求。支付成功后,你的代理会收到.purchased的交易回调,你需要在回调里处理交易验证、解锁订阅权限,最后调用finishTransaction结束交易。
  • 如果用户补填的支付数据无效(比如银行卡过期、余额不足),系统会再次提示用户修正,或者最终触发.failed回调,对应的错误码会指明具体原因(比如SKError.insufficientFunds)。

3. 是等待用户取消/补填完成后,再返回.failed.purchased吗?

没错,整个流程是阻塞式等待用户操作的:

  • 用户完成补填且支付成功 → 代理收到.purchased
  • 用户在补填过程中主动取消(比如关掉设置界面、放弃绑定)→ 代理收到.failed,错误码通常为SKError.paymentCancelled
  • 用户补填的支付信息无法完成支付(比如卡被冻结)→ 代理收到.failed,对应具体支付失败的错误码

补充:StoreKit 2(iOS 15+)的差异

如果你用的是StoreKit 2的异步API(比如try await product.purchase()),流程逻辑是一致的:

  • 需要补全支付信息时,系统会自动弹窗,当前任务会挂起
  • 用户完成补填且支付成功 → 返回.success(.verified)结果
  • 用户取消或支付失败 → 抛出对应的SKError(比如SKError.paymentCancelled

内容的提问来源于stack exchange,提问作者Roberto Sampaio

火山引擎 最新活动