Flutter插件in_app_purchase的queryProductDetails()在iOS返回空数组问题
iOS下Flutter in_app_purchase查询订阅产品为空的排查方案
以下是针对你的问题的具体排查步骤和修复建议:
1. 优先检查App Store Connect配置
- 确认订阅产品
standard、family已完成创建并处于**"已批准"状态**:苹果沙箱环境仅能获取已通过审核的内购产品,处于"准备提交"或"被拒绝"状态的产品无法被查询到。 - 确认两个订阅产品属于同一个订阅组:订阅组创建后,需在iOS项目的
Info.plist中添加SKSubscriptionGroupIdentifier键,值为你的订阅组ID(完全匹配,大小写敏感)。 - 核对产品ID完全一致:iOS对产品ID大小写敏感,确保代码中传入的
standard、family与App Store Connect中配置的ID完全一致(包括大小写、前缀)。
2. 检查iOS项目与测试环境
- 开启内购能力:在Xcode项目的
Signing & Capabilities面板中,添加In-App Purchase能力,确保配置同步生效。 - 使用沙箱测试账号:测试设备必须登录苹果沙箱测试账号(不可用真实Apple ID),且该账号已在App Store Connect的
Sandbox Testers列表中添加。 - 确认网络连通性:测试设备需能正常访问苹果沙箱服务器,避免代理、VPN或网络限制导致请求失败。
3. 修复代码逻辑问题
3.1 先校验内购可用性
调用queryProductDetails前,先确认当前环境支持内购,避免无效请求:
bool isAvailable = await InAppPurchase.instance.isAvailable(); if (!isAvailable) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text("当前设备不支持内购")), ); return false; }
3.2 处理查询错误信息
你的代码未处理查询失败的错误,添加错误打印能快速定位问题:
final ProductDetailsResponse response = await InAppPurchase.instance .queryProductDetails({'standard', 'family'}); // 新增错误处理 if (response.error != null) { print('产品查询错误: ${response.error!.message}'); ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("查询失败: ${response.error!.message}")), ); return false; }
3.3 修正订阅购买方法
订阅属于非消耗型商品,不能使用buyConsumable,应改用buyNonConsumable或buySubscription:
// 替换原购买代码 await InAppPurchase.instance.buyNonConsumable(purchaseParam: purchaseParam);
3.4 避免late变量引发异常
当查询不到产品时,late声明的变量会导致运行时异常,建议先判断产品是否存在:
ProductDetails? standardPlan; ProductDetails? familyPlan; for (ProductDetails product in response.productDetails) { if (product.id == 'standard') { standardPlan = product; } else if (product.id == 'family') { familyPlan = product; } } // 检查产品是否存在 if ((productId == "standard" && standardPlan == null) || (productId == "family" && familyPlan == null)) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text("未找到对应订阅产品")), ); return false; }
4. 额外建议
- 尽量使用真机测试:部分iOS模拟器版本对内购的支持存在问题,真机测试更准确。
- 清除测试缓存:如果之前测试过其他产品,可尝试退出沙箱账号、重启设备后再测试。
内容的提问来源于stack exchange,提问作者Isaac_E
相关产品推荐
相关产品推荐

