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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:04:58