iOS 14系统下SKPaymentQueue的storefront值为nil该如何处理?
关于iOS 14.4+系统SKPaymentQueue.storefront返回nil的解决方案
问题根因
- iOS 14.4版本开始苹果调整了StoreKit的storefront属性获取规则,不再允许未初始化支付队列的场景下直接读取该值
- 必须完成支付队列观察者绑定、且应用和苹果支付服务完成鉴权交互后,才能正常获取到storefront实例
修复步骤
- 在App启动阶段(如
application:didFinishLaunchingWithOptions:方法内)尽早添加支付队列观察者,不要等到发起支付或者需要获取地区时才绑定 - 不要在绑定观察者后同步读取storefront,该值的更新是异步行为,建议监听
SKStorefrontDidChangeNotification通知,收到通知后再读取对应值 - 如果应用本身不涉及内购功能仅需要获取用户所属地区,优先用
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
相关产品推荐
相关产品推荐

