如何使用StoreKit 2监听支付取消事件
StoreKit 2 实现购买状态监听及取消操作判断
完全可以实现你的需求——仅监听用户购买动态、不发起购买,同时准确判断用户是否取消了支付操作。以下是具体实现方案:
核心实现步骤
1. 注册交易监听器
StoreKit 2 使用 TransactionListener 协议监听交易队列的状态变化,无需像StoreKit 1那样手动监听队列。你可以创建一个监听类,实现该协议并注册到全局交易管理器:
import StoreKit class PurchaseStatusObserver: NSObject, TransactionListener { override init() { super.init() // 异步注册监听器 Task { await Transaction.shared.addListener(self) } } // 实现协议方法,处理交易状态变更 func transaction(_ transaction: Transaction, didChangeState oldState: Transaction.State) { // 在这里处理不同状态的交易 } }
2. 监听交易状态并判断取消操作
在 transaction(_:didChangeState:) 方法中,通过 transaction.state 区分不同交易状态,当状态为 .failed 时,可通过 StoreError 的错误码判断是否为用户取消操作:
func transaction(_ transaction: Transaction, didChangeState oldState: Transaction.State) { switch transaction.state { case .failed: guard let storeError = transaction.error as? StoreError else { return } if storeError.code == .userCancelled { // 确认是用户主动取消了购买 print("用户取消购买操作") } else { // 处理其他失败场景(比如支付超时、账户异常等) print("购买失败:\(storeError.localizedDescription)") } case .purchased: // 处理购买成功逻辑(仅监听的话可记录状态,建议调用finish释放资源) Task { await transaction.finish() } case .restored: // 处理恢复购买状态 Task { await transaction.finish() } case .pending: // 交易处于待处理状态(比如需要用户验证身份) print("购买请求待处理") default: break } }
3. 清理监听器
在监听对象销毁时,记得移除监听器避免内存泄漏:
deinit { Task { await Transaction.shared.removeListener(self) } }
关键说明
- 该监听器会捕获应用内所有的交易操作,无论购买请求是由你的框架还是其他代码发起,完全符合你"仅做状态监听"的需求。
- StoreKit 2 的错误类型
StoreError明确定义了.userCancelled枚举值,比StoreKit 1的错误码判断更直观、类型安全。
内容的提问来源于stack exchange,提问作者Tometoyou
相关产品推荐
相关产品推荐

