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

使用StoreKit StoreView实现内购,购买正常但不知如何恢复,缺少恢复回调

StoreView恢复购买的处理方法

你不需要专门的onRestorePurchaseCompletion回调,StoreView的恢复购买操作结果依然会通过onInAppPurchaseCompletion回调返回,只需要在现有回调中统一处理新购买和恢复的交易即可。

核心逻辑说明

恢复购买本质是让StoreKit重新确认用户已购买的非消耗型产品/订阅,这些已购产品的交易信息会通过onInAppPurchaseCompletion返回。你可以通过Transaction的transactionState属性区分是新购买还是恢复的交易,但解锁功能的逻辑通常是一致的(比如设置isPremium = true)。

修改后的代码示例

StoreView(ids: ["my.product.id"])
    .storeButton(.visible, for: .restorePurchases)
    .storeButton(.hidden, for: .cancellation)
    .onInAppPurchaseCompletion { product, result in
        switch result {
        case .success(let verificationResult):
            switch verificationResult {
            case .success(let transaction):
                // 统一处理新购买和恢复的交易,解锁高级功能
                isPremium = true
                
                // 区分交易类型(可选)
                let transactionType = transaction.transactionState == .restored ? "恢复购买" : "新购买"
                print("\(transactionType)成功:\(transaction.signedDate)")
                
                // 必须调用finish()完成交易,避免系统重复触发回调
                await transaction.finish()
            case .failure(let verifyError):
                print("交易验证失败:\(verifyError.localizedDescription)")
            }
        case .failure(let error):
            print("操作失败:\(error.localizedDescription)")
        }
    }

关键注意事项

  • 仅非消耗型产品、自动续期订阅等需要恢复,消耗型产品(如一次性道具)无需恢复。
  • 测试恢复购买时,需确保已用同一Apple ID购买过对应产品,模拟器可正常测试该流程。
  • 务必调用transaction.finish(),否则StoreKit会持续触发该交易的回调,导致逻辑重复执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 14:46:11