Flutter使用in_app_purchase包iOS端无法获取过往购买记录如何解决?
问题根因
你遇到的是in_app_purchase包iOS端特有的逻辑要求遗漏,两个问题的核心原因分别是:
- iOS端调用
restorePurchases时必须传applicationUserName参数,空参数调用会导致部分场景回调不触发 - 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
相关产品推荐
相关产品推荐

