44

我目前正在尝试将 IAP 添加到现有应用程序中。为此,我添加了一些产品并创建了一些测试用户。这些产品是定期订阅。我正在测试的设备是装有 iOS 5.1 的 iPhone 4S。

我可以成功地在商店中查询我的产品,并通过我的新测试用户成功购买它们。我遇到的问题是,如果我尝试从商店设置应用程序管理我的订阅,它会强制我通过告诉我“此帐户尚未用于在 AppStore 中购买任何东西,请检查您的帐户并继续”来查看我的帐户。” 如果我查看该帐户,它不会让我在不提供信用卡信息的情况下继续。

最终结果是我永远无法取消我的测试订阅。我删除了测试用户并创建了新用户,删除了应用程序并重新安装,终止了 StoreApp 和设置应用程序,重新启动设备,在购买前通过电子邮件验证了帐户,在购买前没有通过电子邮件验证帐户......所有排列似乎失败了。

有时我会购买两次相同的订阅,这会提示 StoreKit 要求我管理我的订阅设置。有时这会导致之前的“帐户审核”过程,有时会导致“无法连接到 iTunes Store”的警报。

我已经没有如何继续的想法了。

编辑 - 这是我创建的任何 iTunesConnect 测试用户的事件流

初始订阅
初始订阅

使用现有 ID
使用现有 ID

测试账户登录
测试账户登录

管理订阅
管理订阅

应用商店登录
应用商店登录

无法连接到 AppStore
无法连接

查看您的帐户
审查

然后,审查过程迫使我输入信用卡信息,即使它的地址是“1 Infinite Loop Cupertino, CA”(即它知道这是一个测试帐户)。

4

2 回答 2

58

您无法真正在沙盒中管理订阅,但正如 Jean-Paul de Ville de Goyet 在Apple Developer Forums上发现的那样:

1 个月的订阅每 5 分钟自动更新一次。到现在为止还挺好。它们会自动更新 5 次然后停止,因此 25 分钟后您将收到 21006 错误。但是,即使重新购买相同的订阅,它也不会在同一个测试帐户上再次自动续订,因为它已经自动续订了 5 次。因此,如果您想测试续订并且您一直在搞乱这些订阅,您需要创建一个新的 iTunes 连接测试用户。老实说,这很烦人,如果我们可以重置测试用户帐户的整个购买历史记录会容易得多。

我以同样的方式测试了我的订阅。

于 2012-08-19T15:58:05.263 回答
18

苹果开发者有回应。(Rich Kubota)关于沙盒环境中的订阅测试。

这是应用内购买模拟过程中的一个漏洞。没有支持的方式来模拟取消过程或模拟用户 iTunes 应用程序的管理订阅过程。此限制也存在于应用程序的 TestFlight 版本中。当您将应用程序的 TestFlight 构建提交给用户并测试应用程序时,用户帐户实际上是在沙盒环境中运行的。您已经验证了这一点,因为 TestFlight 应用程序不会在 TestFlight 用户 iTunes 托管订阅部分中显示为托管应用程序。那是因为应用程序处于沙盒环境中,iTunes 应用程序对此一无所知。

自从我在这个论坛上回复以来已经有一段时间了,但是,验证应用程序是否会处理自动续订过程的最佳方法是验证该应用程序是否也通过 transactionObserver 正确处理自动续订订阅续订的检测. 例如,如果您在沙盒环境中购买 1 个月订阅。然后kill app,等待6分钟,然后重启app,transactionObserver是否检测到有一个不完整的Transaction(压缩的1个月续订)需要处理。

这与用户在 iTunes 订阅管理页面中重新启动订阅的情况非常相似。该交易由 iTunes 商店记录,并启用了用户帐户/应用程序包 ID 的不完整交易。当应用程序启动并激活 transactionObserver(通过调用 addTransactionObserver)时,检测到不完整的Transaction,并调用 updatedTransaction 的 delefgate 方法来处理更新。然后,应用程序可以验证 applicationReceipt 以验证现在是否存在自动续订订阅项的 in_app 数组项,该数组项的 expire_date 大于当前日期,并且知道自动续订订阅 product_id 处于活动状态。

至于测试自动续订是否被取消,这又需要iTunes Store服务器支持来模拟。但是,收据验证过程每天都在工作,并且可以检测哪个 in_app 数组项对于自动续订订阅是最新的,然后检测是否设置了 cancel_date 会告诉应用订阅已被取消。请注意,仅检测到任何元素的 cancel_date 字段都可能导致误报。用户可能早些时候取消了自动续订订阅,然后认为它不再那么糟糕并重新购买了该商品。为此,逻辑需要确保在最新的 in_app 数组元素中设置了 cancel_date 字段,才能知道当前订阅实际上已被取消。我的一个问题 m 试图确定 - 取消的项目是否会将 expire_date 上移至 cancel_date,以便取消的订阅可以与过期的订阅显示相同。似乎是正确的举动 - 但此信息由 iTunes Store 服务器团队控制。

如果您想在沙盒中寻求一种机制来模拟生产商店环境的这些功能,我建议您使用 Apple Developer Bug Report 网页提交增强请求。请为错误报告选择 iTunesConnect 产品,因为建议是由 iTunes Store 模拟的,而不是 iOS。

于 2017-03-08T11:28:18.333 回答