文章

使用沙盒测试 App 内购买项目

在沙盒环境中使用真实产品信息和服务器对服务器交易测试您的 App 内购买项目的实现。

概览

在设备上通过 StoreKit 框架,利用来自 App Store Connect 的真实产品信息,使用 Apple 沙盒环境来测试您的 App 内购买项目的实施情况。使用沙盒 Apple ID 登录 App Store 后,带有开发签名的 app 会使用沙盒环境。

要在 App Store Connect 中创建沙盒 Apple ID 或测试帐户,请参阅“创建沙盒测试员帐户”。

使用沙盒 Apple ID 登录 App Store

要使用沙盒 Apple ID 运行您的 app,请根据设备和操作系统来完成以下操作:

  • iOS 12 或更高版本 — 从 Xcode 构建并运行 app。第一次使用设备在带有开发签名的 app 中进行购买后,“设置”中会显示沙盒帐户。使用沙盒 Apple ID 登录。不需要退出非测试 Apple ID 的登录。

  • macOS — 从 Mac App Store 退出登录,然后在 Xcode 中构建 app 并从“访达”启动这个 app。

进行 App 内购买

第一次在带有开发签名的 app 中进行购买时,系统会提示您登录 App Store。使用您的沙盒 Apple ID 登录,以开始测试。在提示中如果出现文本 [Environment: Sandbox],表示您已连接到测试环境;如果没有出现 [Environment: Sandbox],则表示您在使用生产环境。确保您运行的 app 是带有开发签名的构建版本;带有生产签名的构建版本会使用生产环境。

测试中断的购买

中断的购买是需要用户在 app 以外执行一些操作后才能完成购买的一种交易。例如,用户可能需要更新付款方式或接受新的条款和条件,然后才能继续完成交易。

在沙盒测试中,您可以通过在 App Store Connect 中为沙盒 Apple ID 测试员开启中断购买功能,以此模拟中断的购买流程。这会中断测试员的所有购买行为,直至这名人员在 iOS 设备上同意更新后的条款和条件,或者您在 App Store Connect 中关闭这项功能,购买才能继续。有关更多信息,请参阅“测试中断的购买”。

设置测试

通过登录 App Store Connect 来为沙盒 Apple ID 启用中断购买,然后:

  1. 从“用户和访问”,点按边栏中“沙盒”下方的“测试员”。您可以在右侧查看沙盒 Apple ID。

  2. 选择您要启用中断购买的沙盒 Apple ID。如果已经启用,您会在“中断的购买流程”列下看到一个勾号。

  3. 在出现的对话框中,选择“中断此测试员的购买流程”。

开始测试

  1. 在测试设备上,使用启用了中断购买的沙盒 Apple ID 进行登录。

  2. 在您的 app 中,选择“购买”或“订阅”来进行 App 内购买。

  3. 观察系统显示付款页面。

  4. 在您的代码中,验证付款队列收到状态为 SKPaymentTransactionState.purchasing (英文) 的新交易。

  5. 在设备上,验证该付款页面。

  6. 在您的代码中,付款将显示失败。付款队列会收到状态为 SKPaymentTransactionState.failed (英文) 的更新交易。

  7. 检查您的代码调用了 finishTransaction(_:) (英文),以将交易从队列中移除。

  8. 在设备上,系统应显示条款与条件,导致购买流程中断 (因为您已将沙盒环境配置为这样)。

  9. 在设备上,轻点同意按钮来接受条款与条件。

  10. 在您的代码中,验证付款队列是否收到一笔状态为 SKPaymentTransactionState.purchased (英文) 的新交易,且这笔交易的 productIdentifier (英文) 和数量都应该与失败交易的相同。

  11. 在您的代码中,验证相应收据。检查您的 app 提供了相关服务或产品,并且调用了 finishTransaction(_:) (英文)

  12. 在设备上,用户应观察到购买成功。

完成测试

沙盒 Apple ID 会继续遇到购买流程中断,直到您在 App Store Connect 中停用此功能,或者直到用户在设备上接受条款与条件。要在 App Store Connect 中停用中断购买流程,请按照为设置这一测试案例所介绍的相同说明来操作,并且取消选择“中断此测试员的购买流程”。

测试从“管理订阅”页面重新订阅

在 iOS、Apple tvOS、iPadOS 和 MacOS 中的“管理订阅”页面上,客户可以管理活跃的订阅,也可以在到期后一年内管理已过期的订阅。在这个页面中,顾客可以升级、跨级、降级或取消他们的订阅。

在这个测试场景中,顾客要在您的 app 外从“管理订阅”页面重新订阅已过期的订阅。

设置测试

对于这个测试案例,您需要为沙盒 Apple ID 安排一个已过期的订阅。如果没有过期订阅,可以购买一个自动续期订阅产品并让它过期。

您还需要在 App Store Connect 中配置一个或多个订阅产品。

开始测试

  1. 在测试用的 iOS 设备上,打开“设置”>“Apple ID、iCloud、iTunes Store 和 App Store”。在“沙盒帐户”部分下,轻点高亮显示的沙盒 Apple ID,并轻点“管理”来打开沙盒环境“订阅管理”页面。

  2. 轻点您要重新激活的已过期订阅。显示的订阅产品是您在 App Store Connect 的同一订阅组下配置的产品。

  3. 轻点来选取要重新订阅的项目。此时应能看见付款页面显示。

  4. 验证付款页面以完成购买。

  5. 打开您的 app。

  6. 在您的代码中,验证 SKPaymentTransactionObserver (英文) 获得对 paymentQueue(_:updatedTransactions:) (英文) 的回调,并进行了状态为 SKPaymentTransactionState.purchased (英文) 的交易。

  7. 确认您的代码已检索并验证了 app 收据。验证成功的交易会列在收据中。

  8. 在您的代码中,确认它已将 App 内购买项目提供给 app 并更新了订阅用户的状态。

  9. 在您的代码中,确认它调用了 finishTransaction(_:) (英文)。有关更多信息,请参阅“完成交易 (英文)”。

完成测试

这个测试案例不需要清理。对于自动续期订阅,您可以在订阅过期时再次进行测试。

对自动续期的停用进行测试

在 iOS、Apple tvOS、iPadOS 和 MacOS 中的“管理订阅”页面上,客户可以管理活跃的订阅,也可以在到期后一年内管理已过期的订阅。在这个测试场景中,客户将取消订阅,而这会停用自动续期。

要为此测试进行设置,请使用沙盒 Apple ID 帐户购买一个自动续期订阅。

开始测试

  1. 在测试用的 iOS 设备上,打开“设置”>“Apple ID、iCloud、iTunes Store 和 App Store”。在“沙盒帐户”部分下,轻点高亮显示的沙盒 Apple ID,并轻点“管理”来打开沙盒环境“订阅管理”页面。

  2. 轻点以选择要取消的订阅产品。

  3. 轻点“取消订阅”按钮。

接下来,使用以下两种方式之一来验证订阅状态变化:

  • 如果您配置了 App Store Connect 设置来接收 App Store 服务器通知,每次订阅产品的自动续期状态有变化时,您的服务器都会收到 notification_type (英文) DID_CHANGE_RENEWAL_STATUS。有关更多信息,请参阅“启用 App Store 服务器通知”。

  • 通过最新的收据调用 verifyReceipt (英文) 来验证收据。JSON 响应中包含一个 pending_renewal_info 对象,其 auto_renew_status 的当前状态已变为 0。auto_renew_status_change_date_ms 包含状态变化的时间戳。

对重新启用订阅自动续期进行测试

同样是在“管理订阅”页面中,通过重新启用订阅来测试停用自动续期的反向过程。轻点您要续订的订阅。

测试获取您的产品标识符

如果您在 app 中嵌入了产品标识符,您可以在代码载入了标识符后设置代码断点。验证 NSArray (英文) 实例包含预期的产品标识符列表。

如果 app 从服务器获取产品标识符,请手动获取这个 JSON 文件,可以使用 Safari 浏览器等网页浏览器来获取,也可使用 curl 等命令行实用工具来获取。验证您的服务器返回的数据是否已包含预期的产品标识符列表,且服务器正确实现了标准的 HTTP 缓存机制。

对处理无效的产品标识符进行测试

在 app 的产品标识符列表中故意包含一个无效的标识符。然后,完成以下任一操作:

  • 在生产构建版本中,验证 app 显示了商店 UI 的其余部分,并且用户可以购买有效的产品。

  • 在开发构建版本中,验证 app 将问题呈现给您。

检查控制台日志,并确认您可以正确识别无效的产品标识符。确保在测试后将它移除。

测试产品请求

利用您测试的产品标识符列表,创建并提交一个 SKProductsRequest (英文) 实例。在代码中设置一个断点,然后检查列表中的有效和无效产品标识符。如果存在无效的产品标识符,请在 App Store Connect 中复查您的产品,并更正您的 JSON 文件或属性列表。

测试付款请求

使用您已测试过的有效产品标识符,创建一个 SKPayment (英文) 实例。设置一个断点,再检查付款请求。将付款请求添加至交易队列,再设置一个断点来确认系统会调用您的观察器的 paymentQueue(_:updatedTransactions:) (英文) 方法。

虽然在测试过程中,您可以在不提供内容的前提下立即完成交易,但未能完成交易可能会造成问题。未完成的交易会永久遗留在队列中,这可能会干扰后续的测试。

验证观察器代码

检查交易观察器对 SKPaymentTransactionObserver (英文) 协议的实现情况。确认在 app 没有显示其商店 UI,并且您近期没有发起购买的情况下,它也能够处理交易。

在您的代码中,找到对 SKPaymentQueue (英文)add(_:) (英文) 方法的调用。验证您的 app 在 app 启动时是否调用了这个方法。

测试成功的交易

使用沙盒 Apple ID 登录 App Store,并在 app 中进行一笔购买。在交易队列观察器的 paymentQueue(_:updatedTransactions:) (英文) 方法实现中设置一个断点,再检查这笔交易,以验证其状态是否为 SKPaymentTransactionState.purchased (英文)

在您的代码中存续这笔购买交易的位置上设置一个断点,然后确认您的代码保留了相应数据来响应成功购买。检查用户默认值或 iCloud 键值存储,并确认您的代码正确记录了相关信息。

验证交易是否已经完成

找到 app 调用 finishTransaction(_:) (英文) 方法的位置,再验证 app 在调用这个方法前是否完成了所有交易相关工作。确认您已针对每笔交易调用了这个方法,不管交易成功与否。有关更多信息,请参阅“完成交易 (英文)”。

对 App Store 服务器通知进行测试

如果为 app 启用了 App Store 服务器通知,请在沙盒环境中测试用于交易的逻辑。要确定测试环境中是否发出了针对订阅事件的通知,请检查服务器对服务器 JSON responseBody (英文) 对象中 environment 栏位的值是不是等于 Sandbox

有关 App Store 服务器通知栏位的更多信息,请参阅“App Store 服务器通知 (英文)”。

测试自动续期订阅

自动续期订阅在测试环境和生产环境中有着不同的行为。

在测试环境中,订阅续期以加快的速度发生,自动续期订阅在初始购买后最多续订五次。这样一来,您可以测试 app 如何处理订阅续期、订阅延迟和含有间隙的订阅历史记录。如需沙盒环境中订阅时限的完整列表,请参阅“测试 App 内购买项目”。

由于测试环境中到期和续订速度已被加快,订阅可能会在系统尝试续订之前到期,导致订阅期间出现短暂延迟。生产环境中也会因为各种原因而可能出现这样的延迟;验证您的 app 是否能够正确处理相关情况。

另请参阅

测试 App 内购买项目