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

iOS 14系统下SKPaymentQueue的storefront值为nil该如何处理?

关于iOS 14.4+系统SKPaymentQueue.storefront返回nil的解决方案

问题根因

  • iOS 14.4版本开始苹果调整了StoreKit的storefront属性获取规则,不再允许未初始化支付队列的场景下直接读取该值
  • 必须完成支付队列观察者绑定、且应用和苹果支付服务完成鉴权交互后,才能正常获取到storefront实例

修复步骤

  1. 在App启动阶段(如application:didFinishLaunchingWithOptions:方法内)尽早添加支付队列观察者,不要等到发起支付或者需要获取地区时才绑定
  2. 不要在绑定观察者后同步读取storefront,该值的更新是异步行为,建议监听SKStorefrontDidChangeNotification通知,收到通知后再读取对应值
  3. 如果应用本身不涉及内购功能仅需要获取用户所属地区,优先用Locale.current.regionCode作为替代方案,系统兼容性更强

参考修复代码

// 启动时添加支付队列观察者
SKPaymentQueue.default().add(yourPaymentObserver)

// 监听地区变更通知,异步读取国家码
NotificationCenter.default.addObserver(forName: SKStorefrontDidChangeNotification, object: nil, queue: .main) { _ in
    guard let countryCode = SKPaymentQueue.default().storefront?.countryCode else { return }
    // 此处写入拿到国家码后的业务逻辑
}

注意事项

  • 即便设备已经登录App Store账号,只要应用没有添加支付观察者,就会出现storefront返回nil的问题
  • 测试必须使用真机,模拟器无论系统版本都可能出现storefront返回nil的异常
  • iOS 13及更低版本不受该规则影响,原有代码可正常运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 04:06:00