You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:10:40