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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 00:45:36