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

如何在Xcode 12中使用新的.storekit测试内购恢复?

排查Xcode 12 StoreKit测试内购恢复无交易返回的问题

我之前在测试新StoreKit内购恢复的时候也踩过类似的坑,给你几个实用的排查方向:

  • 先确认测试场景的合理性
    用Xcode内置的.storekit配置文件测试时,首先要确保:

    • 你配置的内购项目已经勾选了Restorable选项;
    • 你在恢复操作前,已经用同一个测试账号(沙盒或StoreKit测试会话)完成过该内购的购买流程——如果从来没购买过,自然会返回0条交易。
      要是用沙盒账号,还要注意沙盒环境偶尔会有延迟,或者你是不是切换了不同的沙盒账号,之前的交易属于另一个账号,肯定恢复不到。
  • 检查回调实现的完整性
    很多人会只盯着paymentQueueRestoreCompletedTransactionsFinished(_:)回调,但实际上恢复的交易数据是先通过paymentQueue(_:updatedTransactions:)返回的,这个回调才是你获取恢复交易的地方,finished只是通知你恢复流程结束。
    另外,一定要提前设置SKPaymentQueue的代理:

    override func viewDidLoad() {
        super.viewDidLoad()
        SKPaymentQueue.default().add(self) // 先加代理,再调用恢复
    }
    
    // 别忘了实现这个回调
    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction in transactions {
            switch transaction.transactionState {
            case .restored:
                // 在这里处理恢复的交易
                print("恢复到交易:\(transaction.payment.productIdentifier)")
                queue.finishTransaction(transaction)
            default:
                break
            }
        }
    }
    
  • 排查Xcode 12的StoreKit测试环境问题
    Xcode 12刚推出新StoreKit测试工具时存在不少小bug:

    • 试试重启Xcode,清除模拟器的缓存(或者卸载APP重装),确保.storekit配置文件的修改已经同步;
    • 如果用了SKTestSession,检查测试会话有没有被意外重置,导致测试数据丢失。
  • 捕获恢复失败的错误信息
    别漏掉paymentQueue(_:restoreCompletedTransactionsFailedWithError:)回调,很多时候恢复失败不是没有交易,而是有错误没被捕获:

    func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error) {
        print("恢复失败:\(error.localizedDescription)")
    }
    

    比如网络问题、沙盒账号权限问题,都会触发这个回调,帮你定位问题。

  • 确认内购类型是否支持恢复
    消耗型内购是无法恢复的,只有非消耗型内购、自动续期订阅、非续期订阅这些类型才能被恢复,先检查你的内购项目类型是不是正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:22:39