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
相关产品推荐
相关产品推荐

