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

Flutter使用in_app_purchase包iOS端无法获取过往购买记录如何解决?

问题根因

你遇到的是in_app_purchase包iOS端特有的逻辑要求遗漏,两个问题的核心原因分别是:

  1. iOS端调用restorePurchases时必须传applicationUserName参数,空参数调用会导致部分场景回调不触发
  2. iOS端强制要求所有非pending状态的交易必须调用completePurchase收尾,未收尾的交易会一直留在交易队列,导致恢复购买无响应、重复购买报错

修复步骤

1. 补全restorePurchases传参

调用恢复购买方法时必须传用户标识,没有独立用户体系的场景可以传空字符串或固定通用标识:

// 修改前是无参数调用,iOS侧不兼容
inAppPurchase.restorePurchases(applicationUserName: "");

2. 完善purchaseStream处理逻辑

所有交易不管状态是成功、失败、取消,只要不是待处理状态都必须调用completePurchase,修改后的监听逻辑参考:

final Stream<List<PurchaseDetails>> purchaseUpdated =
        inAppPurchase.purchaseStream;

_subscription = purchaseUpdated.listen((purchaseDetailsList) {
  bool hasValidPurchase = false;
  for (final purchase in purchaseDetailsList) {
    // iOS端强制要求:所有非pending状态的交易必须调用completePurchase收尾
    if (purchase.status != PurchaseStatus.pending) {
      inAppPurchase.completePurchase(purchase);
    }

    if (purchase.status == PurchaseStatus.purchased || 
        purchase.status == PurchaseStatus.restored) {
      hasValidPurchase = true;
      this.purchases.add(purchase);
    }
  }

  // 处理广告开关逻辑
  Provider.of<AdState>(context, listen: false)
      .toggleAds(context, !hasValidPurchase && this.purchases.isEmpty);
  
  listenToPurchaseUpdated(purchaseDetailsList);
}, onDone: () {
  _subscription.cancel();
}, onError: (error) {
  // 处理错误逻辑
});

inAppPurchase.restorePurchases(applicationUserName: "");

3. 检查iOS侧基础配置

  • 确认Xcode项目的Signing & Capabilities页已经添加In-App Purchase能力
  • 测试时必须使用App Store Connect后台生成的沙箱测试账号,不能用正式Apple ID
  • 确认App Store Connect后台的内购商品配置状态为「准备提交」

4. 清理历史待处理交易

如果本地已经有卡住的待处理交易,先卸载App重装,清理本地交易队列后再测试。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:42:00