iOS 18.4下StoreKit 2加载订阅产品失败问题求助
iOS 18.4中StoreKit 2 Product.products(for:)返回空列表的解决办法
排查与修复步骤
1. 沙盒账号与设备配置校验
- 确保测试设备已登录沙盒测试账号:进入「设置」→「App Store」→「Sandbox Account」,退出原有账号后重新登录沙盒账号。iOS 18.4对沙盒验证流程做了调整,未正确登录沙盒可能导致产品拉取失败。
- 核对App Bundle ID:确认项目中的Bundle ID与App Store Connect中的配置完全一致(包括大小写),18.4版本强化了Bundle ID的匹配校验。
2. 代码层面调整与日志优化
- 显式初始化支付队列:在调用
Product.products(for:)前,添加SKPaymentQueue.default().add(self)(若已实现SKPaymentTransactionObserver协议),StoreKit 2在18.4中可能依赖支付队列的初始化状态。 - 完善错误日志:将原代码中的错误打印改为:
详细的错误信息能帮助定位是权限问题、区域限制还是产品ID无效。print("Product fetch error: \(error.localizedDescription), full error: \(error)")
3. App Store Connect产品配置复查
- 确认产品状态:确保订阅产品的状态为**「已批准」**,而非「准备提交」或「等待审核」,iOS 18.4仅拉取完全激活的产品。
- 检查区域与本地化:验证测试设备所在地区在产品支持的本地化区域列表中,18.4版本严格过滤区域不匹配的产品。
- 重新同步订阅组配置:进入App Store Connect的订阅组页面,重新保存配置后等待10-15分钟,让苹果服务器同步最新的产品数据。
4. 临时测试替代方案
如果上述方案暂时无法解决,可使用StoreKit 1的SKProductsRequest作为临时替代,代码示例:
class ProductsFetcher: NSObject, SKProductsRequestDelegate { func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { print("Fetched products: \(response.products)") print("Invalid IDs: \(response.invalidProductIdentifiers)") } func request(_ request: SKRequest, didFailWithError error: Error) { print("Request failed: \(error.localizedDescription)") } } // 使用示例 let fetcher = ProductsFetcher() let request = SKProductsRequest(productIdentifiers: ["upm1"]) request.delegate = fetcher request.start()
内容的提问来源于stack exchange,提问作者vivek malani
相关产品推荐
相关产品推荐

