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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:05:22