StoreKit 2+SwiftUI内购因21104错误被拒,求解决指引
解决方案:无服务器验证下的StoreKit 2内购审核问题处理
核心问题分析
审核时的错误提示本质是:生产签名的App在审核流程中可能请求了苹果Sandbox测试环境的收据,但你的本地处理逻辑未正确兼容这种跨环境场景,导致校验失败触发错误。
具体修复步骤
- 明确StoreKit环境配置:在初始化StoreKit管理对象时,通过编译宏区分Debug/Release环境,避免Release版本错误访问Sandbox。代码示例:
#if DEBUG let storeConfig = StoreKit.Configuration.sandbox #else let storeConfig = StoreKit.Configuration.default #endif let storeManager = StoreKit.StoreManager(configuration: storeConfig) - 简化本地校验逻辑:StoreKit 2的
Transaction对象已内置合法性校验,如果你没有额外做自定义签名验证,不要手动校验收据的环境签名。对于.unverified状态的交易,不要直接阻断流程,可记录错误后完成交易,同时允许用户重试:func processPurchaseResult(_ result: Product.PurchaseResult) async { switch result { case .success(let verification): switch verification { case .verified(let transaction): // 处理正常购买逻辑 await transaction.finish() case .unverified(let transaction, let error): // 审核场景下可能因环境导致未验证,记录错误后完成交易 print("Unverified transaction: \(error.localizedDescription)") await transaction.finish() } case .userCancelled, .pending: // 对应状态处理 break @unknown default: break } } - 优化错误提示:捕获购买流程中的
StoreError时,避免直接向用户展示"签名验证失败"这类技术化提示,改为"购买遇到问题,请重试"的友好文案,同时记录详细错误日志用于排查。 - 补充审核备注:提交审核时在备注中明确说明:App未使用服务器验证内购,所有内购校验均通过StoreKit 2本地API完成,帮助审核团队理解你的实现逻辑。
额外验证步骤
用TestFlight的生产签名版本模拟审核场景,在iPad(iOS 16.3.1)设备上完成购买流程,确认无错误弹出。
内容的提问来源于stack exchange,提问作者Nabeel
相关产品推荐
相关产品推荐

