正式版内购产品iOS10+报“无法连接iTunes Store”错误求助
解决iOS 10+环境下In-App Purchase报错SKErrorCode=2的问题
针对你遇到的情况——沙箱测试正常、已通过审核产品状态为Ready for sale,但iOS 10及以上版本出现SKErrorCode.rawValue=2(对应提示Cannot connect to iTunes Store)的错误,我整理了几个高优先级的排查和修复方向:
检查ATS(App Transport Security)配置
iOS 10开始ATS的安全策略默认更严格,即便产品已上架,也可能因ATS限制导致IAP连接失败。打开Info.plist,确认是否配置了正确的ATS例外:- 可以添加
NSAllowsArbitraryLoads并设为YES(Apple允许IAP场景使用此配置,不会影响审核); - 更推荐的精准配置是添加
NSExceptionDomains,将itunes.apple.com、buy.itunes.apple.com等IAP相关域名加入例外,确保HTTPS连接正常。
- 可以添加
验证网络环境与测试账号
- iOS 10+对网络代理、VPN的兼容性更差,测试时建议关闭代理/VPN,切换到稳定的4G或家庭WiFi;
- 若使用沙箱账号测试,务必退出设备上的正式App Store账号,确保沙箱账号未过期、且对应地区与产品上架地区匹配;
- 正式环境测试时,确认使用的Apple ID无支付限制、账号状态正常。
核对IAP产品配置细节
- 再次检查App Store Connect中产品的
Availability设置,确保测试设备所在地区已被包含在产品的可用区域内; - 确认产品的
Price Tier、Cleared for Sale状态无误,避免因地区定价或上架状态的隐性问题导致iOS 10+无法识别产品。
- 再次检查App Store Connect中产品的
代码层面的适配检查
- iOS 10要求IAP相关的UI操作和回调必须在主线程执行,检查你的代码中:
SKProductsRequest的发起、SKPaymentQueue的交易监听注册是否在主线程;SKPaymentTransactionObserver的回调处理是否切换到主线程更新UI或处理逻辑;
- 确保完整实现了
SKProductsRequestDelegate的productsRequest(_:didReceive:)和request(_:didFailWithError:)方法,避免因错误回调未处理导致的隐性问题。
- iOS 10要求IAP相关的UI操作和回调必须在主线程执行,检查你的代码中:
重置测试环境
- 删除App,重启测试设备,重新安装后再测试;
- 进入
设置 > iTunes & App Store,退出当前账号后重新登录(沙箱或正式账号),清除App Store缓存可能带来的影响。
这些是iOS 10+环境下IAP报错Cannot connect to iTunes Store的最常见诱因,建议从ATS配置和网络环境开始逐一排查,通常能快速定位问题。
内容的提问来源于stack exchange,提问作者Ketan Sodvadiya




