使用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
相关产品推荐
相关产品推荐

