App Store沙箱环境中服务器通知始终发送TEST类型的问题求助
问题描述
我们正在将一款Mac应用迁移至App Store,当前在Sandbox环境中测试App Store服务器通知功能:
- 已在App Store Connect配置好对应URL,使用
https://api.storekit-sandbox.itunes.apple.com/inApps/v1/notifications/test测试时,服务器可正常接收notificationType为TEST的通知。 - 但通过应用完成Sandbox测试购买后,服务器仅能收到TEST类型的通知,预期的
SUBSCRIBED、EXPIRED等实际类型通知始终未收到。
补充信息:
- 应用基于Objective-C开发(暂无法重构为Swift),使用原生StoreKit。
- 已配置App Store Connect发送V2版本通知(V1已废弃)。
- 应用端流程正常:Sandbox测试账号登录到完成购买,应用可成功接收
SKPaymentTransaction。 - 将Sandbox用户的月度订阅设置为每5分钟续订一次,共收到12次通知,但全部为TEST类型。
请问是否遗漏了Sandbox测试配置,以获取SUBSCRIBED、EXPIRED等实际类型的通知(data-environment仍为Sandbox)?
排查与解决方案
以下是针对Sandbox环境下无法接收实际类型服务器通知的核心排查点:
1. 检查App Store Connect的通知订阅配置
- 进入App Store Connect的「App信息」→「App Store服务器通知」页面:
- 确认已勾选所有需要的通知类型(如订阅续订、过期、状态变更等),不要仅保留TEST类型。
- 再次验证V2通知的版本选择正确,且URL地址与测试服务器完全匹配(注意Sandbox与生产环境的配置是独立的,确保当前配置对应Sandbox测试)。
2. 确保应用端正确完成交易流程
Objective-C中,必须在收到SKPaymentTransaction后调用完成方法,否则App Store会认为交易未闭环,不发送后续状态通知:
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
检查应用代码中是否在处理完交易(如验证收据、更新用户权限)后,及时调用了上述代码。
3. 验证Sandbox测试账号与产品类型
- 确认使用的是App Store Connect后台创建的沙盒测试员账号,而非个人Apple ID临时登录的测试账号。
- 确认测试的产品是自动续订型订阅,只有该类型产品才会触发续订、过期等状态通知;消耗型或非续订型订阅不会发送此类通知。
4. 检查服务器端的V2通知解析逻辑
V2通知结构与V1差异极大,若服务器未适配V2格式,可能会误判或漏读通知类型:
- 确认服务器接收的通知包含
payload核心字段,而非V1的receipt字段。 - 确保正确读取
payload.notificationType字段来判断通知类型,而非旧的notification_type字段。
5. 手动触发Sandbox订阅状态变更
Sandbox环境中部分通知不会自动触发,需手动操作:
EXPIRED通知:需在App Store Connect的「用户和访问」→「沙盒测试员」中,找到对应测试账号的订阅记录,手动设置为「过期」状态。SUBSCRIBED通知:首次购买成功后应立即触发,若未收到,需检查应用是否完成了收据验证流程(即使应用端能收到交易回调,未验证收据也可能影响通知发送)。
6. 排查服务器网络限制
- 确保测试服务器的防火墙未拦截Apple Sandbox服务器的请求,需将Apple官方的Sandbox IP段加入白名单。
- 确认服务器的HTTPS证书有效,App Store要求通知URL必须使用受信任的SSL证书,不能使用自签名证书。
内容的提问来源于stack exchange,提问作者Chuck D
相关产品推荐
相关产品推荐

