SKProduct未找到:Swift IAP请求返回空产品列表求助
IAP产品请求返回空列表(response.products.count=0)排查思路
核心问题场景
本人开发的Swift应用已上架App Store,In-App Purchase(IAP)功能此前可正常完成交易并收款,近期未修改代码的情况下,调用SKProductsRequest后返回的产品列表为空。已确认:
- App Store Connect中对应非消耗型产品
com.tailorsoft.SongAnnouncer.nonConsumable状态为Approved - Xcode项目Capabilities已开启In-App Purchase权限
核心代码如下:
//**************************************************************************************** // Issue an IAP request to return all Products that match the supplied set of Product IDs. //**************************************************************************************** func getProductsFromApple(viewController: UIViewController) { enum myAppProductIdentifier: String { case consumable = "com.tailorsoft.SongAnnouncer.consumable" case nonConsumable = "com.tailorsoft.SongAnnouncer.nonConsumable" case autoRenewingSubscription = "com.tailorsoft.SongAnnouncer.autoRenewingSubscription" case nonRenewingSubscription = "com.tailorsoft.SongAnnouncer.nonRenewingSubscription" } let myAppProductIdentifiers: Set = [myAppProductIdentifier.nonConsumable.rawValue] // myAppProductIdentifers contains: (offset: 0, element: "com.tailorsoft.SongAnnouncer.nonConsumable") let request = SKProductsRequest(productIdentifiers: myAppProductIdentifiers) request.delegate = self request.start() } extension IAPService: SKProductsRequestDelegate { //****************************************************************************************************** // Delegate Method for IAP // Returns list of valid products found in App Store Connect that match the supplied set of Product IDs. // NOTE: App Store Connect has the following in-app purchase configured: // Status: Approved // Product ID: com.tailorsoft.SongAnnouncer.nonConsumable //****************************************************************************************************** func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { self.appleSKProducts = response.products //******************************************* // response.products.count is equal to 0 // why? //******************************************* } }
排查步骤
- 检查无效产品ID列表:在
productsRequest代理方法中打印response.invalidProductIdentifiers,确认请求的ID是否被标记为无效。若存在,说明App Store Connect的产品ID与代码中的ID存在大小写、拼写差异,或产品未正确关联到当前App ID。 - 确认App Store Connect产品关联状态:
- 检查产品是否已关联到当前版本的App(即使是已上架版本,若后续新增产品未关联到已发布的App ID版本,可能无法被请求到)
- 确认产品的Availability设置是否为“Available in all territories”或包含测试设备所在地区
- 测试环境与账号问题:
- 确保使用Sandbox测试账号,而非正式Apple ID。正式账号在非生产环境下无法请求到产品
- 检查测试设备是否登录了正确的Sandbox账号,且未处于“家长控制”限制内
- 网络与缓存问题:
- 重置设备的网络设置,避免DNS或缓存导致的请求失败
- 重启Xcode和测试设备,清除App缓存后重新测试
- Xcode项目配置检查:
- 确认项目的
Bundle Identifier与App Store Connect中的App ID完全一致,包括大小写 - 检查Capabilities中的In-App Purchase是否确实开启,且对应的Team正确
- 确认
Info.plist中是否添加了网络权限(虽然IAP请求默认允许,但部分网络环境下可能需要明确配置)
- 确认项目的
- App Store Connect状态延迟:即使产品显示为Approved,苹果服务器可能存在同步延迟,等待1-2小时后再测试
- 检查代理生命周期:确保
IAPService实例在请求期间未被释放,否则代理方法可能无法正确回调。可尝试将request对象设为实例变量,而非局部变量
内容的提问来源于stack exchange,提问作者Uncle Bill
相关产品推荐
相关产品推荐

