深入探索应用内购买测试工具
Explore testing in-app purchases
2023年6月5日
一句话判断
苹果为你提供了三套内购测试工具——Xcode 本地测试、Sandbox 环境测试、TestFlight 端到端测试——这场 Session 梳理了每套工具的适用场景,并重点介绍了 Xcode 15 和 Sandbox 的新增能力。
这场 Session 讲了什么
Session 详细介绍了 App Store 提供的三套内购(IAP)测试工具:StoreKit Testing in Xcode、App Store Sandbox 和 TestFlight,重点放在前两者的新特性上。
StoreKit Testing in Xcode 自 WWDC20 引入以来,一直是本地测试的首选。它不需要在 App Store Connect 中配置产品,完全离线运行,不依赖服务器。Xcode 15 带来了多项改进:新的静态续期速率选项(独立于订阅时长,月度和年度订阅以相同速率续期)、多实例事务管理器(支持同时测试多个设备)、以及直接从事务管理器购买的能力(测试外部交易处理)。你还可以从 App Store Connect 同步产品定义到 Xcode,省去手动配置 StoreKit 配置文件的工作。
App Store Sandbox 面向端到端验证。今年新增了账单问题消息模拟(Billing Problem Messaging)——开发者可以在 Sandbox 中模拟用户支付失败后看到的账单提醒弹窗。Sandbox 还支持了宽限期(Grace Period)测试,让开发者验证订阅在支付失败后的保留逻辑。后续还会支持家庭共享(Family Sharing)的内购测试。
值得深挖的点
三套工具的分工定位:StoreKit Testing in Xcode 用于开发阶段的快速迭代——改代码立即验证,无需上传。Sandbox 用于完整流程验证——客户端 + 服务器端的联调。TestFlight 用于真实的 beta 测试和用户反馈收集。根据你的测试阶段选择合适的工具,而不是试图用一个工具覆盖所有场景。
账单问题消息的模拟流程:在 Sandbox 账户设置中关闭 “Allow Purchases & Renewals”,订阅续期会进入账单重试状态。此时重新打开 App,StoreKit 2 的 Message API 会自动弹出账单问题提醒。用户点击继续后跳转到账户设置页面,重新开启购买开关即可完成恢复。这个流程与生产环境完全一致。
静态续期速率:之前 Xcode 的续期速率是基于订阅时长的(如月度订阅每 2 分钟续一次)。新的静态速率选项让不同时长的订阅以相同速度续期,方便测试跨产品类型的统一逻辑。
代码片段
StoreKit 2 中处理账单问题消息:
// 监听 StoreKit 消息
func listenForMessages() async {
for await message in Message.messages {
guard case .billingIssue = message.reason else { continue }
// 账单问题消息会自动展示给用户
// 如果你需要延迟或抑制展示,可以实现消息监听器
print("收到账单问题提醒,订阅可能无法续期")
}
}
在 Sandbox 中模拟账单问题:
// 1. 确保 Sandbox 账户有一个活跃的自动续期订阅
// 2. 在设备上进入 设置 > App Store > Sandbox 账户设置
// 3. 关闭 "Allow Purchases & Renewals"
// 4. 等待订阅续期失败(按配置的续期速率)
// 5. 重新打开 App,系统会自动展示账单问题弹窗
// 6. 用户点击"继续"后跳转设置页面
// 7. 重新开启开关,订阅成功续期
最佳实践
- 开发早期用 StoreKit Testing in Xcode 快速迭代,不用等 Sandbox 环境配置
- 从 App Store Connect 同步产品到 Xcode,保持测试数据与生产一致
- 在 Sandbox 中全面测试账单问题、宽限期、退款等边界场景
- 使用 StoreKitTest 框架编写自动化测试,确保每次代码变更不破坏内购逻辑
- 多实例事务管理器让你能同时测试 iPhone 和 iPad 上的购买行为
还有什么值得关注
- 家庭共享内购测试的 Sandbox 支持时间表
- TestFlight 中的内购测试与 Sandbox 测试的差异
- StoreKit 2 Message API 的自定义展示时机控制
- 宽限期配置在 App Store Connect 中的设置方式