Flutter iOS平台In-App Purchase订阅无法从App Store获取
问题背景
使用in_app_purchase 3.1.5、Flutter 3.7.6、iOS 16.3.1、Xcode 14.2真机测试时,调用queryProductDetails后,monthly_subscription始终出现在notFoundIds列表中。已完成付费协议签署、订阅创建、Xcode能力配置、StoreKit文件同步等操作,但问题仍存在。
排查步骤
确认订阅与App版本关联:
“Ready to Submit”状态的订阅必须关联到App Store Connect中待提交或已上架的App版本。进入对应App版本的“In-App Purchases”板块,检查是否已将monthly_subscription添加到当前版本中,未关联的订阅无法被测试环境识别。修正产品类型混淆:
iOS不存在“非消耗型订阅”分类,只有自动续期订阅和非消耗型产品两类。如果你的产品是订阅服务,需确保在App Store Connect中创建的是“自动续期订阅”类型,而非“非消耗型产品”,类型不匹配会直接导致无法查询到产品。验证StoreKit配置文件:
打开Xcode中的.storekit文件,确认monthly_subscription的Product ID、类型、价格等信息与App Store Connect完全一致。同步后再次检查scheme中选中的是最新配置文件,避免使用旧缓存的配置。TestFlight测试的关键细节:
上传TestFlight后需等待15-30分钟让后台完成订阅关联。测试必须使用沙箱测试账号(需在App Store Connect的“沙箱测试员”中添加),普通Apple ID或开发者账号无法正常测试订阅。代码细节校验:
确保调用queryProductDetails时传入的Product ID字符串完全匹配(大小写、下划线、空格均需一致),例如避免误写为monthlySubscription。同时检查代理逻辑是否正确处理返回结果,示例代码:final response = await _inAppPurchase.queryProductDetails({'monthly_subscription'}); if (response.notFoundIds.contains('monthly_subscription')) { // 处理未找到逻辑 }匹配地区设置:
订阅产品需在App Store Connect的“价格与可用性”中设置至少一个可用地区,且测试设备的沙箱账号地区必须与该地区一致,跨地区无法查询到订阅。清理缓存与重启:
重启测试设备,删除Xcode的DerivedData目录(路径:Xcode -> 设置 -> 位置 -> DerivedData -> 删除),重新构建项目,避免缓存导致的配置不生效。
内容的提问来源于stack exchange,提问作者crd

