Highlight
Apple 在 WWDC23 为内购测试工具带来了多项更新:Xcode 15 的 StoreKit Testing 新增了静态续期速率和多实例事务管理器,Sandbox 支持了账单问题消息模拟和宽限期测试,并即将推出 Family Sharing 内购测试支持。
核心内容
StoreKit Testing in Xcode:本地快速迭代
(01:15)StoreKit Testing 自 WWDC20 引入以来,一直是本地测试内购的首选方案。它完全离线运行,不需要在 App Store Connect 中配置产品,也不依赖服务器。你可以在 StoreKit 配置文件中创建和管理测试产品,修改代码后立即在模拟器或真机上验证。
(02:35)Xcode 15 带来了新的静态续期速率选项。以前,续期速率与订阅时长挂钩——月度订阅每分钟续期,年度订阅每 30 分钟续期。现在你可以选择一套固定的续期速率,无论订阅时长是多少,都以相同频率续期。这让测试不同订阅类型的交互行为变得更加可控。
(03:06)另一个实用更新是多实例事务管理器。如果你同时运行多个应用实例(比如 iPhone 和 iPad 模拟器),事务管理器会分别显示每个实例的交易记录。你还可以直接从事务管理器发起购买,无需打开应用,方便测试外部交易的处理逻辑。
(02:04)从 App Store Connect 同步产品到 Xcode 的功能也值得一提。点击同步按钮,你的内购产品定义就会自动导入到 Xcode 的 StoreKit 配置文件中,省去手动维护两份数据的工作。
App Store Sandbox:端到端验证
(04:07)Sandbox 使用你在 App Store Connect 中配置的真实产品数据,在接近生产环境的情况下测试内购流程。你需要一个注册了开发者账号的设备,并在 App Store Connect 的 Users and Access 中创建 Sandbox Apple ID。
(06:05)今年 Sandbox 新增了账单问题消息模拟(Billing Problem Messaging)。当用户的订阅因支付失败进入账单重试状态时,系统会弹出一个账单问题提示 sheet,引导用户在不离开应用的情况下解决支付问题。你可以在 Sandbox 中模拟这个流程:先订阅一个自动续期订阅,然后在设备的 Sandbox 账户设置中关闭”Allow Purchases & Renewals”开关,模拟支付失败。回到应用后,StoreKit 的 Message API 会发送 billingIssue 原因的消息,触发账单问题 sheet。
(09:12)宽限期(Billing Grace Period)测试也加入了 Sandbox。在 App Store Connect 中设置宽限期后,Sandbox 中的订阅在支付失败时会进入宽限期状态,用户可以在此期间继续访问付费内容。Sandbox 中的宽限期时长根据你设置的续期速率自动调整,不需要等待真实的宽限期时间。
(10:40)Family Sharing 内购测试即将在 Sandbox 中推出。你需要在 App Store Connect 的 Users and Access 中组织 Sandbox 家庭成员,然后购买已启用 Family Sharing 的产品。系统会为每个家庭成员创建交易,你的应用可以通过 StoreKit 的 isFamilySharable 属性识别家庭共享产品,并通过 revocationDate 处理成员退出共享时的权限撤销。
(14:01)今年晚些时候,iOS Sandbox 账户设置页面将新增三个选项:调整续期速率、测试中断购买、清除购买历史。这些功能以前只能在 App Store Connect 中操作,现在可以直接在设备上完成。
TestFlight:收集真实反馈
(15:12)TestFlight 用于向内部和外部测试者分发应用,收集真实用户的反馈。通过 TestFlight 下载的应用进行内购时,使用设备上登录的 Apple ID,但不会真正扣费。自动续期订阅的续期速率与 Sandbox 相同。
(16:58)今年 TestFlight 简化了测试者管理:支持按状态、会话数等条件筛选测试者,批量添加或移除组成员。新增的”Internal Only”分发方式确保构建只对内部测试者可用,不会误提交到 App Store 审核。
详细内容
三套工具的适用场景
(18:10)三套工具各有侧重,可以组合使用:
| 工具 | 最佳使用阶段 | 核心能力 |
|---|---|---|
| StoreKit Testing in Xcode | 开发早期 | 完全离线、快速迭代、自动化测试 |
| App Store Sandbox | 功能验证期 | 端到端验证、服务器集成测试 |
| TestFlight | 发布前 | 真实用户反馈、多设备验证 |
(18:12)具体功能的支持情况:
- 优惠码兑换和价格上调 sheet:仅 StoreKit Testing in Xcode
- 账单重试和宽限期:StoreKit Testing in Xcode + Sandbox
- 服务器端验证:Sandbox + TestFlight(支持 App Store Server Notifications 和 Server API)
- 用户反馈收集:仅 TestFlight
账单问题消息的实现
(06:59)账单问题消息使用 StoreKit 2 的 Message API,原因类型为 billingIssue。
import StoreKit
// Message API 默认在应用启动或进入前台时自动显示
// 你可以在特定视图中选择延迟或抑制消息展示
for await message in StoreKit.Message.messages {
if message.reason == .billingIssue {
// 在合适的时机展示,或根据当前 UI 状态决定
await message.display()
}
}
关键点:
- Message API 默认自动展示,但你可以通过监听消息流来控制展示时机
- 在可能让用户困惑的视图中(如支付流程中),应该延迟展示
- 用户点击 Continue 后会跳转到 iOS 账户设置页面更新支付方式
Sandbox 测试步骤
(07:49)测试账单问题消息的完整流程:
- 确保 Sandbox Apple ID 已订阅一个活跃的自动续期订阅
- 打开设备的 Settings → App Store → Sandbox Account
- 关闭”Allow Purchases & Renewals”开关
- 等待订阅按续期速率失败并进入账单重试状态
- 返回应用,StoreKit 发送
billingIssue消息 - 账单问题 sheet 出现,点击 Continue
- 在账户设置中重新开启”Allow Purchases & Renewals”
- 订阅成功续期,账单问题消息消失
宽限期配置
(09:38)在 App Store Connect 中启用宽限期:
- 进入 App Subscriptions 页面
- 找到 Billing Grace Period 部分,点击”Set Up Billing Grace Period”
- 选择宽限期时长(生产环境生效)
- 选择适用的订阅者和环境(Sandbox 或两者)
- 点击 Confirm
Sandbox 中的宽限期和账单重试时长根据续期速率自动预设,不需要等待真实时间。
核心启发
-
建立内购自动化测试流水线
- 做什么:使用 StoreKitTest 框架编写自动化测试,覆盖购买、恢复、订阅状态变化等核心流程
- 为什么值得做:Xcode 15 的多实例事务管理器让并发测试成为可能,静态续期速率让测试时间可预测
- 怎么开始:在测试 target 中导入 StoreKitTest,使用
SKTestSession创建测试会话,编写覆盖主要内购场景的 XCTest 用例
-
在 Sandbox 中预演支付失败场景
- 做什么:系统性地测试账单问题、宽限期、退款等边界场景,确保应用在支付异常时表现正确
- 为什么值得做:生产环境中的支付失败是用户流失的主要原因,提前在 Sandbox 中验证恢复流程能显著降低非自愿流失
- 怎么开始:在 Sandbox 账户设置中关闭购买权限,观察应用的账单问题消息处理;启用宽限期后测试订阅恢复逻辑
-
为家庭共享功能做测试准备
- 做什么:在 App Store Connect 中配置 Family Sharing 产品,组织 Sandbox 家庭成员,验证共享逻辑
- 为什么值得做:Family Sharing 能吸引新用户、提高参与度,但需要确保权限授予和撤销逻辑正确
- 怎么开始:为自动续期订阅启用 Family Sharing,在 Users and Access 中添加 Sandbox 家庭成员,测试购买后各成员的交易接收和退出共享时的权限撤销
-
优化 TestFlight 测试流程
- 做什么:利用 TestFlight 的新筛选和批量管理功能,更高效地组织内测
- 为什么值得做:“Internal Only”分发方式避免误提交审核,批量管理节省测试者维护时间
- 怎么开始:为内测构建选择 Internal Only 分发,使用筛选功能按状态整理测试者,定期清理不活跃的测试者
关联 Session
- What’s new in App Store server APIs — App Store Server API 新特性,服务端验证必备
- Meet the App Store Server Library — 简化服务端 API 集成的官方开源库
- What’s new in StoreKit 2 — StoreKit 2 客户端 API 更新
- Subscription Offers Best Practices — 订阅优惠的设计和实现
评论
GitHub Issues · utterances