大多数浏览器和
Developer App 均支持流媒体播放。
-
介绍 Xcode 中的 StoreKit 测试
探索 Xcode 中的 StoreKit 测试:无需连接到 App Store 服务器即可测试 App 内购买项目的本地环境。 我们将向您展示如何设置测试环境,创建 StoreKit 配置文件以及准备在本地验证收据。我们还将说明如何测试各种 app 内购买项目方案并使用 StoreKitTest 框架自动执行这些测试,并介绍沙盒环境中测试的最新进展。
资源
- Setting up StoreKit Testing in Xcode
- StoreKit Test
- Testing at all stages of development with Xcode and the sandbox
- Testing In-App Purchases in Xcode
- Testing In-App Purchases with sandbox
相关视频
WWDC23
WWDC22
WWDC20
-
下载
(你好)
你好 欢迎来到全球开发者大会 (介绍 XCODE 中的 STOREKIT 测试) 你好 欢迎收看 “在 Xcode 中介绍 StoreKit 测试” 我叫 Dana 我非常兴奋地向你展示 我们今年即将推出的所有强大的新功能 这将使构建和测试 App 内购买项目 比以往更优异 但在我们介绍创新的功能之前 让我们快速回顾一下 今天开发者如何使用 StoreKit 为他们的 app 添加 App 内购买项目 (开发周期) 目前 如果我想更新我的 app 无论是更新为 开始通过 StoreKit 销售内容 还是添加新的内容进行销售 我必须要做的第一步 就是登录 App Store Connect 在那里 我需要注册我的 app 定义我的 App 内购买项目 并创建我的沙盒账户进行测试 只有在我通过了这些步骤之后 我才能回到 Xcode 并开始编写代码 在我的 app 中集成 StoreKit
当我在构建我的 app 时 我会使用沙盒环境 来测试我的 App 内购买项目 使用我在 App Store Connect 中 设置的一个沙盒账户 在那里 我不会被收取费用 因为购买是在我测试过程中进行的 此外 当我把我的 app 交出去进行 beta 测试时 沙盒环境将继续被 与我的 app 合作的开发者使用 (生产) 只有在我验证了 我的 app 能按预期工作后 我才会将我的 app 发布到 App Store 在 App Store 中 生产环境用于支持所有 StoreKit 调用
这在过去运作良好 但我们可以为了你 即我们的开发人员做得更好 (XCODE 中的 STOREKIT 测试) 我很高兴地宣布 今年的 Xcode 12 我们将引入一个新的开发和测试套件 专门用于 StoreKit 和 App 内购买项目 这将允许你在 Xcode 中 开始完全在本地构建 和测试你的 app 的 App 内购买项目 这一切都被直接集成到 Xcode 中 因此它可以与你的 app 的开发工作流程无缝连接 此外 我们还推出了一个 全新的 StoreKit 测试框架 它将为你的 StoreKit 集成 解锁全自动化测试 (开发周期) 这改变了 StoreKit 的整个开发周期 现在 你可以直接在 Xcode 中启动 而不是在 App Store Connect 中启动
在构建 StoreKit 集成的同时 你也在构建你的 app 的其他部分
添加单元 UI 和其他自动化测试 以确保你的 app 的 StoreKit 集成质量 保持在较高的水平 然后登录 App Store Connect 并开始使用沙盒环境 使用沙盒是你需要采取的关键步骤 以确保你的 app 已准备好 在 App Store 中向用户发布 它也是你需要用来测试你的 app 所需的任何服务器到服务器功能的环境 此外 今年我们还将为沙盒环境 增加一些很棒的增强功能 我的同事 Chris 会在稍后的 会话中详细介绍
让我们深入了解一下 Xcode 12 中的 StoreKit 测试 我在构建一款关于水果奶昔的 app Fruta 我现在正在做的功能 就是围绕着销售这些奶昔的食谱 在这里使用 StoreKit 是正确的 因为这些食谱是我想在 我的 app 中提供的数字内容 我已经配置了 Fruta 来获取和渲染这些商店的产品作为食谱 如果我导航到 Store.swift 我的 app 中的大部分商店内容保存于此 你可以看到我有一个产品标示符的列表 用于所有我想出售的不同食谱
再往下 在 fetchProducts 函数中
我有一个 SKProductsRequest 的调用 在这个调用中 我将从这些食谱中导入所有的产品标示符
Fruta 应该已经准备好 去获取和渲染这些产品了 所以让我们在模拟器中启动它 看看会发生什么
如你所见 我的食谱都没有显示 但这是意料之中的 因为我还没有在 App Store Connect 中配置我的 app 或 App 内购买项目 而默认情况下 StoreKit 使用的是沙盒环境 所以我需要在 Xcode 中启用本地测试 要做到这一点 我首先需要在我的项目中 定义我的 app 内产品 首先 我导航到文件菜单
创建一个新文件
在那里我会输入“StoreKit” 选择 StoreKit 配置文件模板 我只需要在我的项目中 创建一个新的配置文件 现在我就有了一个地方 来存储我所有 app 内产品的元数据 以及我的 app 将提供的食谱 在这个编辑器的左下角 我可以选择在这个文件中 添加 StoreKit 项目
当我选择时 我可以选择添加哪种类型的产品 第一种选择是消耗品 消耗品是一种可以反复购买的产品 比如游戏内的生命或宝石 第二种是针对非消耗品的 这类产品购买一次 永不过期 最后 我们有自动续订服务 即用户在使用服务或内容时要定期收费 我打算选择创建一个非消耗品 因为这是最合理购买数字食谱的方式
我现在需要填写我想卖的食谱的详细资料 在这种情况下 我会选择浆果蓝 因为这是我最喜欢的奶昔
产品 ID 是我的 app 中 这个特定产品的唯一标示符 它需要与我的 app 将传递到 StoreKit API 的值相匹配 为了确保正确 我把它从 Store.swift 复制粘贴过来
接下来 我需要设定一个价格 与 App Store Connect 中 可以从价格层级中进行选择不同的是 而在这里 我可以选择输入任何小数值 这是因为对于 Xcode 中的 StoreKit 测试来说 价格只是用来设置交还给我的 app 的 SKProduct 中返回什么值 在这里 我可以直接控制该值 并可以轻松地改变它 以确保我的 app 可以处理任何可能返回的值 现在是 99 美分 我就不修改了
此外 我还可以选择启用家人共享 这是我们今年即将推出的一个全新的功能 为了在 Xcode 中进行 StoreKit 测试 启用家庭共享将更新 SKProduct 上的 is-family-shareable 标志 我就不设置它了
最后 我需要在我的 app 中 给这个产品起一个本地化的名字
(浆果蓝)
我也可以设置一个描述 但现在我打算把它留空 现在我已经设置了我的 StoreKit 配置 我需要告诉 Xcode 在启动我的 app 时 使用它而不是沙盒 这样做很容易 打开方案编辑器
在“运行选项”下 选择我刚才创建的那个配置
现在 当我重新启动我的 app 时 StoreKit 使用本地测试环境
SKProduct 返回我配置的元数据
之前 我跳过了为浆果蓝设置描述 但我想让描述显示出来 而 Fruta 已经设置了从 SKProduct 中 提取本地化描述并显示出来 Xcode 中的 StoreKit 测试 是完全交互式的 这意味着我可以更新我的 app 产品的元数据 而无需重新编译甚至重新启动 我只需要更新 StoreKit 配置文件 使其具有我想要的描述
(满足食欲 神清气爽)
并让我的 app 重新执行 SKProduct 请求 以获取更新后的元数据
我的项目已经包含了一个 StoreKit 配置 里面有我将要销售的所有食谱 所以我要快速切换到这个文件 重新启动我的 app
(构建成功)
我的 app 已经被配置为 利用已获取的 SKProduct 来创建 SKPayment 并将其添加到付款队列中 要执行该代码 我只需要选择其中一个“购买”按钮
在模拟器中 我得到的付款表很像我的用户会看到的 这里最大的区别是 我不需要登录 也不需要认证 因为这只是为了测试的目的 不会向我收费 所以我只需选择“确认” 付款就会通过
就像沙盒或生产一样 我的 app 的支付交易观察器 会随着交易从“购买中”到“已购买”而更新 我甚至得到了一张收据 我的 app 可以验证 浆果蓝现在已经解锁了 我可以导航进去看食谱了
比方说 我遇到了一个问题 我需要重新购买浆果蓝 可能是为了修复一个 bug 或者改变购买体验 有了新的 StoreKit 交易管理器 Xcode 让这一切变得非常简单
我看到我在本地测试环境中的所有购买 我可以完全控制它们 我能够删除这个交易并重置状态 (ID:0 购买) 就像购买从未发生过一样 (确定要删除这比交易吗?) (无交易) 现在我又可以买到浆果蓝了 就像以前从来没有买过一样
除了能够删除之前的购买 我还可以模拟退款 在退款的情况下 交易仍在交易管理器中 但被标记为已退款
(ID:1 已购买) (ID:1 已退款)
该交易也会保留在 app 的收据中 但更新后包含了 退款发生时的取消日期 我的 app 再次收到退款通知 并能够立即响应
如果你想确保你的 app 对孩子们来说有一个很好的体验 孩子们需要在购买前获得许可 Xcode 中的 StoreKit 测试 已经完全支持 Ask to Buy 很简单 回到你的 StoreKit 配置文件 并在编辑器菜单下启用 Ask to Buy
现在 当我在 Fruta 中购买食谱时 我看到了同样的“请求允许”的对话 会出现在任何开启了 Ask to Buy 的用户眼前
当我选择“询问”时 该交易在交易管理器中 显示为“等待批准” 而在代码中 我的 app 的 SKPayTransactionObserver 被告知现在交易处于延期状态
(ID:2 待批) 我现在可以批准或拒绝它 我一旦批准 之前推迟的交易更新为已购买状态 我的 app 马上更新 显示解锁的配方 (胡萝卜炖菜) 我还可以选择启用中断购买功能 这将使我能够模拟用户 在能够完成购买之前 需要对其账户进行一些操作的情况 例如 他们可能需要更新 与账户付款信息相关的细节 在这种情况下 初次购买的结果将是“失败” 但一旦用户采取行动 解决了任何导致中断的问题 同一产品的新交易将被添加到支付队列中
我一直在考虑将我的 app 的商业模式 改为基于订阅的模式 只需每月支付一个月的价格 用户就可以获得所有的奶昔食谱 而不需要一次次购买 Xcode 中的 StoreKit 测试使得 使用 StoreKit 构建自动续订 变得非常容易
我已经创建了第二个 StoreKit 配置文件
其中包含两个不同的订阅 我想在 app 中提供 首先是增强版食谱 它的配置是以每月 2.99 美元的价格续费
为了让它更有吸引力 我设置了首月 99 美分的首次订阅优惠
我还创建了一个专业食谱选项 它不仅可以解锁我的 app 中的所有食谱 还可以让订阅者访问 每个奶昔的高级营养介绍
这两个订阅包含在同一个订阅组中 使我的 app 能够在增强版食谱 和专业食谱之间提供升级选项 我已经构建了 Fruta 来配合这些订阅 所以要尝试这种商业模式 我只需要切换 StoreKit 配置 并且重新启动我的 app
在这里 我的 app 正在显示 有关这两个订阅的详细信息 包括增强版食谱首次订阅优惠 我想确保我的 app 正确处理 订阅的自动更新 但我不想等待一整个月来测试它 通过 Xcode 中的 StoreKit 测试 我有能力加快时间 在我的订阅配置的编辑器菜单中
我选择了时间速率 我可以设置一秒为一天 这将改变它 使我只需要等待几秒钟 续订就会发生 而不是一整个月
现在我已经购买了那个订阅 所有的食谱都解锁了
而且我不用等很长时间 食谱就会自动续订
早些时候 当我在交易管理器中 删除退款购买时 我的 app 立即更新 以撤销对这些食谱的访问 这在 iOS 14 中得以实现 这要归功于我们在 SKPaymentTransactionObserver 上添加的新 API didRevokeEntitlements- ForProductIdentifiers
要了解更多关于这个 API 和我们今年添加到 StoreKit 的所有其他新功能 我强烈建议你查看 “App 内购买项目的新功能”
为了让你能够对 app 中的 购买内容进行认证 App Store 提供了一个数字签名的收据 收据是用户在你的 app 中 购买的可信记录
它存储在设备上 由系统自动更新 它是有签名的 所以你知道它来自于 App Store 并且是为你在该设备上的 app 准备的
如果你想了解更多关于 如何验证收据的信息 我推荐你查看 2018 年的 “App 内购买项目的最佳做法和新功能”
但我确实想强调一些关键的区别 你在使用本地 Xcode StoreKitTest 环境 生成的收据时需要牢记 首先 它们使用的私钥 与沙盒或生产环境中生成的收据 使用的私钥不同
这意味着你在验证时需要使用不同的证书 我们提供了一个方便的方式来导出 StoreKitTest 证书到你的项目中 通过你 StoreKit 配置文件的编辑器菜单
最后 StoreKitTest 证书 不是证书链的一部分 为了适应这些差异 你应该在你的客户端验证代码中 使用调试宏 在这里 你可以看到我的代码 在 StoreKitTestCertificate 和 AppleIncRootCertificate 之间 根据该宏进行选择
此外 如果我的客户端收据验证 使用 OpenSSL 我会传入 PKCS7_NOCHAIN 参数 但只用于调试构建 Xcode 12 中的 StoreKit 测试 在我们刚刚发布的所有 OS 系统测试版上 都能很好地工作 无论是在模拟器中构建和运行 还是在真实设备上 我教你如何设置项目的 StoreKit 配置 启用本地测试环境 使用交易管理器 删除和为之前的购买项目退款 并确保你的应用程序的良好使用体验 无论是对于推迟或中断的购买
或是自动续订的购买
但是对于你来说 能够手动构建和测试 你的 StoreKit 集成是至关重要的 同样重要的是 你要构建自动化 持续测试你的 App 内购买项目
这就是为什么我们要引入一个 全新的 StoreKitTest 框架 让你在代码中控制完整的本地测试环境 (StoreKitTest 框架) 所有你手动的控件都暴露在你的测试里面 StoreKitTest 与 XCTest 一起工作 为你的 App 内购买项目 扩展单元和 UI 测试范围 此外 使用 StoreKitTest 你可以禁用 所有正常出现的列表和对话框 这样你的测试就可以在 不等待用户交互的情况下运行完成 最后 你可以立即触发订阅的续订 因此你的测试可以验证 你的 app 的订阅功能 在续订中继续工作 (StoreKitTest 案例) StoreKitTest 可以涉及到很多的情况 包括你的 app 处理成功和失败的购买 中断和延迟的购买 在你的 app 运行之外发起的交易 以及与订阅相关的各种情况
让我们回到 Xcode 中运行一个例子
在 Fruta 中 我已经建立了一系列单元测试 涵盖了与 app 内购买相关的案例
第一个是一个基本的测试案例
确保我的 app 在用户成功购买时 正确解锁“浆果香蕉”奶昔食谱 它所做的第一件事就是 创建一个新的 StoreKitTest 测试 用 NonConsumable StoreKit 配置文件初始化 重要的是要记得在测试目标中 包含配置文件 以便 SKTestSession 可以参考它 接下来 我将禁用测试中的所有对话 这样我的测试就可以在 没有用户交互的情况下运行完成 之后 我会清除之前所有的交易 所以我知道我是从一个全新的状态开始的
最后 我的测试购买了食谱 并确认食谱可以购买
(测试成功)
“测试成功了” 所以我知道一切就绪了 此时 我可以开始准备在 App Store 上 让我的 app 和 App 内购买项目上线了 关键的下一步是登录 App Store Connect 设置 App Store 支持我的 App 内购买项目所需的一切 并使用沙盒环境测试该配置 为了告诉你我们为 Sandbox 带来的 所有强大的增强和特性 现在我要把画面交还给 Chris
谢谢你 Dana 嗨 我是 Chris App Store 的项目经理 我们看到在 Xcode 中的 StoreKit 测试 如何让你在本地测试环境中执行 App 内购买项目的 早期测试和调试 在 Xcode 中的 StoreKit 测试 和在沙盒环境中的测试 有着关键的区别
首先 你在 App Store Connect 中 设置 App 内购买项目 这与你的 app 在 App Store 上 上线时使用的产品信息相同
而且你会创建一个沙盒 Apple ID 来登录你的测试设备
在沙盒中 app 收据 是由 App Store 签署的
沙盒还支持服务器端收据验证 和 App Store 服务器通知
在 iOS 12 中 我们在 App Store 设置中 增加了沙盒账户部分
用于登录沙盒账户 即你在 App Store Connect 中 设置的账户
在 iOS 14 中 在沙盒中测试你的 App 内购买项目和订阅 会变得更加容易 一个新“管理”选项会引导你进入 新的“沙盒管理订阅”页面
你可以在这里查看和测试 你在沙盒中的订阅
点开我们的 Fruta app 我们可以看到订阅组内的所有订阅
你可能作为订阅者在生产中使用过本页面 选择不同的订阅、升级、降级或取消
现在作为开发者 你可以使用这个页面 在沙盒环境中测试你的订阅层级 我们增加了重置首次订阅优惠的功能
有了这个 你就可以使用同一个沙盒测试账号 来测试免费试用或首次订阅优惠 你不再需要每次重新设置一个 新的沙盒 Apple ID 来测试首次订阅优惠 (沙盒中的 App Store 服务器通知) 下面是订阅周期的示例 通过沙盒中的这项新功能 你可以测试在你的 app 之外发生的 常见订阅更改 包括客户操作 如降级、升级或取消 你可以测试服务器逻辑中 订阅者状态变化通知类型 如 Did_Change_Renewal_Status 和 Did_Renew 这是今年晚些时候在生产中出现的一种 新的通知类型 你也会在沙盒中收到
要了解更多服务器通知类型 请观看“App 内购买项目的新功能”
App Store Connect 即将实现 沙盒账户 将能够在设备上测试被中断的购买 要使用这个功能 请选择沙盒 Apple ID 的这一行
选择 Cindy 的帐户 勾选启用中断购买 然后保存
现在 Cindy 可以在 iOS 设备上 测试沙盒中的中断购买
一种情况是需要在完成购买前 同意更新的条款和条件
对于单个沙盒账户 设备上的购买将继续被中断 直到你返回 App Store Connect 为每个测试者禁用中断的购买
让我们来回顾一下 iOS 14 新增的 沙盒中订阅和 App 内购买项目测试功能 (沙盒测试中的新功能) 在设备上 你现在可以查看和管理订阅 你还可以测试升级、降级、取消 和重置首次订阅优惠 很快你就可以在设备上进行测试 你的 app 对中断购买的反应
最后 在 App Store Connect 中 拥有开发者身份的用户 将能够创建和管理沙盒测试员账户 在沙盒环境中测试 是一种很好的方法 可以在 app 发布到生产环境之前 改进 App 内购买项目的处理 下面由 Dana 为大家总结
谢谢 Chris 构建和发布使用 StoreKit 的高质量 app 有清晰的流程 从 Xcode 12开始 使用交互式本地测试环境 来构建你的 StoreKit 集成
使用 StoreKitTest 框架 来构建测试和自动化 以确保你的 app 的订阅 和 App 内购买项目功能的质量
登录 App Store Connect 设置 App Store 支持 App 内购买项目所需的一切 并使用沙盒环境测试该配置 另外 使用沙盒测试 app 所需的 所有服务器到服务器的功能
利用 TestFlight 对你的 app 及其订阅 或 App 内购买功项目能进行测试 然后让你的 app 在 App Store 上线 再次感谢 我们期待看到你即将发布的出色 app
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。