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

IAP仅iPad端出现无效产品ID问题,iPhone端正常,求技术排查

问题:iPad端应用内购买(IAP)无法正常工作,iPhone端运行正常

iPhone端IAP功能完全正常,但iPad端无法使用。在iPad模拟器中运行时,终端返回无效产品标识符,所有iPhone模拟器型号均无此问题,且官方文档表明iPhone和iPad的IAP机制一致。尝试购买商品时,因获取到的产品数组为空,触发数组越界崩溃:

2022-12-15 17:53:46.397764+0100 Quotely[63397:3419642] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArray0 objectAtIndex:]: index 1 beyond bounds for empty NSArray'

相关代码

产品获取函数(Singleton类)

public func fetchProducts(){
    let request = SKProductsRequest(productIdentifiers: Set(Product.allCases.compactMap({ $0.rawValue })))
    request.delegate = self
    request.start()
}

调用方式

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    IAPManager.shared.fetchProducts()
    FirebaseApp.configure()
    
    return true
}

排查方向

  • 检查App Store Connect产品配置:确认应用的支持设备范围包含iPad,或者IAP产品未设置为仅支持iPhone。
  • 核对模拟器环境:确保iPad模拟器登录的Sandbox测试账号地区,与App Store Connect中产品配置的地区一致;避免使用生产Apple ID登录模拟器。
  • 验证产品标识符:仔细核对Product枚举的rawValue与App Store Connect中的产品ID,确保大小写、拼写完全一致。
  • 调整产品获取时机:在application:didFinishLaunchingWithOptions中过早调用fetchProducts()可能导致iPad端StoreKit未完成初始化,可尝试在applicationDidBecomeActive中调用,或添加短暂延迟后再获取。
  • 增加异常防护:在购买逻辑中先判断产品数组是否为空、索引是否合法,避免崩溃,方便后续调试:
guard let products = IAPManager.shared.products, !products.isEmpty, index < products.count else {
    // 提示用户产品加载失败或参数无效
    return
}
// 执行购买逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:35:44