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

Flutter iOS应用IAP无法接收App Store服务器通知及查看交易记录

Flutter iOS IAP:模拟器/TestFlight无Apple通知&交易记录无法查询问题排查

核心排查与解决方案

1. 模拟器环境的局限性

  • 模拟器仅依赖本地StoreKit配置文件(.storekit)运行,开启Edit Scheme的StoreKit选项只是基础,必须确保配置文件内已添加对应内购项目并关联到当前Scheme。
  • 模拟器不会触发真实Apple服务器通知,所有交易仅存于本地沙箱,因此Xcode StoreKit Manager看不到记录、Supabase无调用是正常现象——模拟器内购只能通过本地收据验证,无法触发远程通知。

2. TestFlight环境的通知问题

  • 确认App Store Connect配置的通知URL为HTTPS协议,服务器能正常接收并处理POST请求(Apple通知为POST方式)。
  • 检查TestFlight构建的Bundle ID与App Store Connect内购项目的Bundle ID完全一致(包括大小写)。
  • 验证Supabase Edge Function是否正确处理Apple通知的JWT签名:Apple通知携带JWT,需用Apple根证书验证签名有效性,未正确处理会直接丢弃请求,导致无调用记录。
  • 必须使用沙箱测试账号购买TestFlight内购,真实Apple ID不会触发沙箱环境的通知流程。

3. in_app_purchase包的配置与使用

  • 升级in_app_purchase到最新稳定版,旧版本可能存在沙箱通知兼容性问题。
  • 确保代码中完整监听交易流并完成交易:仅调用buyNonConsumable不够,需通过purchaseStream监听状态,交易成功后必须调用completePurchase,未完成的交易不会触发服务器通知。示例代码:
    StreamSubscription<List<PurchaseDetails>>? _purchaseSubscription;
    
    @override
    void initState() {
      super.initState();
      _purchaseSubscription = InAppPurchase.instance.purchaseStream.listen(_handlePurchaseUpdates);
    }
    
    void _handlePurchaseUpdates(List<PurchaseDetails> purchases) {
      for (final purchase in purchases) {
        if (purchase.status == PurchaseStatus.purchased) {
          // 处理购买成功逻辑
          InAppPurchase.instance.completePurchase(purchase);
        }
      }
    }
    
    @override
    void dispose() {
      _purchaseSubscription?.cancel();
      super.dispose();
    }
    
  • 用transactionIdentifier查询时,必须调用App Store Server API的沙箱端点:https://api.storekit-sandbox.itunes.apple.com,生产端点无法查询沙箱交易记录。

4. 服务器通知测试的参考意义

既然服务器通知测试功能正常,说明URL和服务器接收逻辑无问题,问题集中在交易流程完整性或沙箱/生产环境不匹配上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:42:58