如何在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,检查测试会话有没有被意外重置,导致测试数据丢失。
- 试试重启Xcode,清除模拟器的缓存(或者卸载APP重装),确保
捕获恢复失败的错误信息
别漏掉paymentQueue(_:restoreCompletedTransactionsFailedWithError:)回调,很多时候恢复失败不是没有交易,而是有错误没被捕获:func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error) { print("恢复失败:\(error.localizedDescription)") }比如网络问题、沙盒账号权限问题,都会触发这个回调,帮你定位问题。
确认内购类型是否支持恢复
消耗型内购是无法恢复的,只有非消耗型内购、自动续期订阅、非续期订阅这些类型才能被恢复,先检查你的内购项目类型是不是正确。
内容的提问来源于stack exchange,提问作者Fried Rice
相关产品推荐
相关产品推荐

