如何测试SKPaymentTransactionStateDeferred?

Mac*_*nik 25 objective-c in-app-purchase ios xcode6 ios8

iOS 8即将推出.我们有Xcode beta 6 atm,但仍然找不到任何关于如何正确测试家庭共享的文档(或者我错过了什么?).我的问题是如何正确设置沙盒与父/子?我试图让它在测试版1中工作而没有快乐.

有什么提示吗?

更新:

Apple开发者论坛上的两个相关故事:

  1. 如何在iTunes Connect上创建子沙盒帐户?(https://devforums.apple.com/message/1030357#1030357)
  2. 在沙箱中测试"询问购买"(https://devforums.apple.com/message/1005569#1005569)

Chr*_*nce 23

我已经在这个主题上取得了一些进展,所以我想我会报告.另外,我发现了一个明显的错误,我已经向Apple报告过.

我所做的是以下内容:

1)在iTunes Connect中创建父测试(沙盒)帐户,并创建子测试帐户.这些只是iTunes Connect中的两个测试帐户.称他们为父母和孩子的P和C.

2)使用这两个帐户,转到https://appleid.apple.com并更改他们年龄的年份.iTunes Connect不允许您这样做.出于某种原因,除非年龄确实有一年,否则家庭共享的过程不起作用.我发现您必须在年份列表中进行两次选择,网址https://appleid.apple.com.奇.我将P设置为较旧(某些成人年龄),将我的C设置为较年轻.

3)在一台苹果设备(我的iPhone,运行iOS8)上,我在P>帐户的设置> iCloud下设置家庭共享.我使用真正的iTunes Apple Id(有我的付款信息)在此设备上登录iTunes.

4)然后我在"设置">"iCloud"下邀请我的C apple id成为我家人的一部分.

5)我接受来自P的邀请(在我的iPad上,也运行iOS8),这涉及在另一台设备上以C登录iCloud.

6)在我的iPhone上,我为C家庭成员打开"要求购买".

现在,我已准备好在我的沙盒应用程序上尝试购买测试作为C. 在我的应用商店中完成常规流程后,我收到以下提醒:

在此输入图像描述

当我点击"询问"时,我收到下一个警报:

在此输入图像描述

现在,我尝试了两种选择,单独购买.我尝试过"确定"选项,该选项应该向P帐户发送通知.我还没有在我的P帐户上收到这样的通知(仍然在我的iPad上登录iCloud).

我还试过"儿童"iPad上的"亲自批准"选项.我使用P帐户,如果在下一个警报中输入:

在此输入图像描述

之后我没有收到任何错误,所以看起来似乎是人员批准,但我尚未将该购买转换为SKPaymentTransactionStatePurchased状态.所有延期购买仍然在应用程序的支付队列中,每个都具有状态SKPaymentTransactionStateDeferred.当我重新启动应用程序时,仍然在队列中的每次购买的状态都会延迟.

接下来,我想知道C的特定测试iTunes帐户是否存在某些问题,所以我创建了第二个子帐户,称之为C2,并尝试将其设置为我的iPhone上的P下的孩子.但是,我在那里遇到了另一个问题.当我尝试接受邀请成为P下C2的家庭成员时,我得到警报(在iPad上):

在此输入图像描述

对我来说,iCloud帐户的这种限制不应适用于测试帐户.这是我向Apple报告的明显错误.

因此,总而言之,我还不是100%确信我的SKPaymentTransactionStateDeferred实现正在运行.我们将看看Apple是否会回复我.

  • 对于你的第一个问题,是的.您不应该禁用购买按钮.但我必须在我的购买观察员代表中聪明一点.如果*all*的事务都被延迟,我推断委托方法不是由我的UI直接引起的.对于你的第二个问题.看来你永远不会完成这些交易.参见WWDC talk 303. (2认同)
  • 你知道当延期购买被拒绝时观察者会收到哪个"SKError"吗? (2认同)

kas*_*kad 7

从iOS 8.3开始,SKPayment有一个新的标志:simulatesAskToBuyInSandbox.

因此,如果您需要测试SKPaymentTransactionStateDeferred状态,则初始化new SKMutablePayment和set simulatesAskToBuyInSandbox = YES.

https://developer.apple.com/library/prerelease/ios/releasenotes/General/iOS83APIDiffs/frameworks/StoreKit.html

PS.警告:人们抱怨此API无法正常工作(请参阅注释)


ser*_*e-k 5

iOS 9.2.1,Xcode 7.2.1,ARC启用

确认!该simulatesAskToBuyInSandbox属性不会导致支付队列观察者注册该SKPaymentTransactionStateDeferred状态.相反,它只是处理付款而观察员注册SKPaymentTransactionStatePurchased州.

SKMutablePayment *payment = [SKMutablePayment
   paymentWithProduct:productUserRequested];

payment.simulatesAskToBuyInSandbox = true;
[[SKPaymentQueue defaultQueue] addPayment:payment];
Run Code Online (Sandbox Code Playgroud)

我能够执行的唯一测试是当观察者注册SKPaymentTransactionStatePurchased状态而不是我通常的方法时调用我的方法进行延期付款而不是打电话:

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
Run Code Online (Sandbox Code Playgroud)

这会在应用程序上持续存在.终止,并使您能够测试用户未完成购买(例如,在购买的最后阶段失去接收)和延期购买.这是假设您的采购方法传递延期参数,如在清单4-2应对交易状态应用程序内采购指南:提供的产品.这是方法的样子:

模拟挂起的购买:

[self showTransactionAsInProgress:transaction deferred:NO];
Run Code Online (Sandbox Code Playgroud)

模拟延期:

[self showTransactionAsInProgress:transaction deferred:YES];
Run Code Online (Sandbox Code Playgroud)

注意:应用程序.重启,苹果应用程序.如果您没有处理凭据的任何其他付款,卸载应用程序,或在"设置"中退出"iTunes和应用程序商店",则购买机制将要求您提供凭据.此外,如果您点击此处的"取消",则交易不会失败,因为付款队列观察员将继续注册该SKPaymentTransactionStatePurchased状态.

2016年3月4日更新:

我发现Apple提出的这个建议可能会有所帮助,这是一种做我建议的方式:

测试中断的交易

在事务队列观察者的paymentQueue:updatedTransactions:方法中设置断点,以便您可以控制它是否提供产品.然后在测试环境中照常购买,并使用断点暂时忽略该事务 - 例如,通过在LLDB中使用thread return命令立即返回该方法.

终止并重新启动您的应用.Store Kit在发布后不久再次调用paymentQueue:updatedTransactions:方法; 这一次,让你的应用程序正常响应.验证您的应用是否正确交付产品并完成交易.

希望这可以帮助!干杯.


Rai*_*kas 5

根据Chris Prince 的回答创建子帐户时,请确保将其“年龄”设置在 13 到 18 岁之间。如果设置为小于13,则无法验证其年龄(即使您在P帐户中添加了信用卡)。如果它高于 18 - 启用询问购买的选项消失了。花了几个小时试图找出我做错了什么。

此外,您需要通过 iTunes Connect 创建 C 帐户,而不是通过家庭共享屏幕中的“创建孩子的帐户”选项。

希望我能发表评论,但由于我没有 50 点声望,我必须创建一个单独的答案。


Jam*_*mes 5

事实证明,沙箱环境似乎不支持父子关系,因此当按照 @ChrisPrince 的答案中提到的方式设置有问题的帐户时,将不会发送消息。

\n\n

我挖出的文章可以在这里找到:https ://forums.developer.apple.com/thread/38561#117143

\n\n

苹果工作人员的回答中重要的片段是

\n\n
\n

关于询问购买支持,沙盒中不支持此功能。\xe2\x80\x9c询问购买\xe2\x80\x9d 不是 API 实现,而是 iTunesConnect 实现的支持流程,需要 StoreKit 与特定 iTunes 帐户进行交互。此支持仅存在于生产环境中。为了使这一流程在沙盒环境中发挥作用,ITC 需要实施测试账户来引用其他账户来批准购买。

\n
\n\n

本文的其余部分重点介绍了购买请求支持的指南和流程,但测试必须在子/父帐户关系处于活动状态的生产环境中进行。

\n