最近产品需要涉及到订阅型的内购创建,上一次使用自动订阅内购还是好几年的事情了,很多内容大都忘得差不多了,加上苹果设计的内购又增加了一些新功能和改变,不得不重新来审视下自动订阅型内购,而官方又没有中文文档,只有翻译了做个保存,以供后续查阅。

使用沙盒测试应用内购买

在沙盒环境中使用真实的产品信息和服务器到服务器的事务来测试应用内购买的实现。

概述

在app Store Connect的Apple沙盒环境下,对具有真实产品信息的设备上使用StoreKit框架测试应用内购买的实现过程。当您使用沙盒Apple ID登录App Store时,您的开发签名应用程序也要使用沙盒环境。

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

使用沙盒Apple ID登录应用程序商店

要使用沙盒Apple ID运行应用程序,请根据设备和操作系统执行以下操作:

对于iOS12或更高版本,从Xcode构建并运行应用程序。首次使用设备尝试购买具有开发签名的应用程序后,“设置”中的沙盒帐户将会被显示。可以使用沙盒Apple ID登录。无需注销非测试Apple ID。

对于macOS,退出Mac应用商店,然后在Xcode中构建应用程序并从Finder启动。

进行应用内购买

第一次在开发签名应用程序中进行购买时,系统会提示您登录应用程序商店。可以使用沙盒Apple ID登录以开始测试。注意,文本内容 [Environment:Sandbox] 会作为购买提示的一部分出现,表示您已经连接到测试环境。如果[Environment:Sandbox]没有出现,那么您使用的是生产环境(即不是测试环境)。确保您正在运行应用程序的是开发签名版本;生产签名版本使用于生产环境。

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

客户可以在iOS、tvOS、iPadOS和MacOS中的“管理订阅”页上管理其活动订阅以及过期后长达一年的订阅。从该页面,客户可以升级、交叉分级、降级或取消其订阅。

在此测试场景中,客户从应用程序外部的“管理订阅”页重新订阅过期的订阅。

安装测试

对于此测试用例,您需要为沙盒Apple ID提供过期订阅。如果您还没有,请购买一个自动续订订阅并让其过期。

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

开始测试

在测试iOS设备上,打开设置>Apple ID-iTunes&App Store或设置>Apple ID-iTunes&App Store(两条路径都可以进入该页面,看了下,内容好像是一样的)。在“沙盒帐户”部分下,轻按突出显示的沙盒Apple ID,然后轻按“管理”以打开“沙盒订阅管理”页面(估计是要订阅过才会有管理这个按钮,分析时没看见)。

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

点击以选择要重新订阅的订阅产品。注意付款单出现。

验证付款单以完成购买。

打开你的应用。

在代码中,验证SKPaymentTransactionObserver是否通过SKPay中的事务,获取paymentQueue(:updatedTransactions:)的回调已购买的mentTransactionState 状态。

检查代码是否检索并验证应用程序回执。验证成功的交易记录会显示在收据中。

在您的代码中,检查它是否使应用程序可以使用应用程序内购买,并更新订阅服务器的状态。

在代码中,检查它是否调用finishTransaction(:)。有关更多信息,请参阅完成事务。

结束测试

此测试用例不需要清理。对于自动续订订阅,可以在订阅过期时再次执行测试。

测试禁用自动更新

客户可以在iOS、tvOS、iPadOS和MacOS上的“管理订阅”页中管理其活动订阅以及过期订阅,直至过期一年。在此测试场景中,客户取消订阅,会导致禁用自动续订。

要设置此测试,请为sandboxappleid帐户购买一个自动更新订阅。

开始测试

在iOS测试设备上,打开设置>Apple ID-iTunes&App Store或设置>Apple ID-iTunes&App Store(两条路径都可以进入该页面,看了下,内容好像是一样的)。在“沙盒帐户”部分下,轻按突出显示的沙盒Apple ID,然后轻按“管理”以打开“沙盒订阅管理”页面。

点击以选择要取消的订阅产品。

单击“取消订阅”按钮。

接下来,使用以下两种方法之一验证订阅状态的更改:

如果已将App Store连接设置配置为接收App Store服务器通知,则每次订阅的自动续订状态更改时,服务器都会收到通知“DID_CHANGE_RENEWAL_STATUS“续订状态”改变的通知。有关详细信息,请参阅启用服务器到服务器通知。

使用最新的收据调用verifyReceipt来验证收据。JSON响应包含一个挂起的“续订”信息对象,该对象的“自动续订”状态更改为0。自动更新状态更改日期auto_renew_status_change_date_ms会包含更改的时间戳。

测试重新启用订阅续订

通过在同一管理订阅页上重新启用订阅,测试禁用自动续订的相反操作。点击要续订的订阅。

测试获取产品标识符

如果在应用程序中嵌入产品标识符,请在代码加载标识符后在代码中设置断点。验证NSArray的实例是否包含预期的产品标识符列表。

如果应用程序从服务器获取产品标识符,请使用Safari等web浏览器或curl等命令行实用程序手动获取JSON文件。验证服务器返回的数据是否包含预期的产品标识符列表,以及服务器是否正确实现了标准的HTTP缓存机制。

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


故意在应用程序的产品标识符列表中包含无效标识符。然后执行以下操作之一:
        在生产版本中,验证应用程序是否显示其商店UI的其余部分,以及用户是否可以购买有效的产品。
        在开发版本中,验证应用程序是否引起了您的注意。
请检查控制台日志并验证是否可以正确识别无效的产品标识符。确保在测试后将其移除。


测试产品请求


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


测试付款请求


使用您已经测试过的有效产品标识符创建SKPayment的实例。设置断点并检查付款请求。将支付请求添加到事务队列,并设置一个断点,以确认系统调用观察者的paymentQueue(:updatedTransactions:)方法。
尽管您可以立即完成事务而不必在测试期间提供内容,但未能完成事务可能会导致问题。未完成的事务将无限期地保留在队列中,这可能会干扰以后的测试。


验证你的observe代码


检查事务观察者对SKPaymentTransactionObserver协议的实现。验证它是否可以处理事务,即使你的应用程序没有显示其商店用户界面,即使你最近没有发起购买。
在代码中找到对SKPaymentQueue的add(:)方法的调用。验证你的应用程序是否在应用程序启动时调用此方法。


测试成功的事务


使用沙盒Apple ID登录应用商店,然后在应用程序中进行购买。在事务队列观察者的paymentQueue(:updatedTransactions:)方法的实现中设置断点,并检查事务以验证其状态是否为SKPay已购买的mentTransactionState.
在代码中持续购买的点处设置断点,并确认代码持续数据以响应成功的购买。检查用户默认值或iCloud键值存储,并确认您的代码正确地记录了信息。


验证事务已完成


找到应用程序调用finishTransaction(:)方法的位置,并在调用该方法之前验证应用程序是否已完成与该事务相关的所有工作。验证是否为每个事务调用该方法,无论它成功还是失败。有关更多信息,请参阅完成事务。


测试应用商店服务器通知


如果为应用程序启用了App Store服务器通知,请在沙盒环境中测试事务逻辑。要确定测试环境中是否发生订阅事件的通知,请检查服务器到服务器JSON responseBody对象中的environment字段的值是否等于Sandbox。
有关App Store服务器通知字段的详细信息,请参阅App Store服务器通知。


测试自动续订订阅


自动更新订阅在测试环境和生产环境中表现不同。
在测试环境中,订阅更新以加速的速度发生,自动续费订阅在首次购买后最多更新5次。这使您能够测试您的应用程序如何处理订阅续订、订阅失效和包含空白的订阅历史记录。有关沙盒环境中订阅持续时间的完整列表,请参阅测试应用内购买。


由于测试环境中的过期率和续订率加快,订阅可能会在系统尝试续订之前过期,从而导致订阅期短暂失效。由于各种原因,在生产中也可能出现这样的错误;请验证您的应用程序是否正确地处理了这些错误。

原文链接:

https://developer.apple.com/documentation/storekit/in-app_purchase/testing_in-app_purchases_with_sandbox#overview

posted on 2022-07-05 18:11  我在全球村  阅读(138)  评论(0编辑  收藏  举报