如何testingSKPaymentTransactionStateDeferred?

iOS 8即将推出。 我们有Xcode beta 6 atm,但是仍然无法find关于如何正确testingFamily Sharing的文档(或者我错过了什么?)。 我的问题是如何正确设置沙箱与父母/孩子? 我试图让它在没有喜悦的情况下在beta 1中工作。

任何提示家伙?

更新:

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

  1. 如何在iTunes Connect上创build儿童沙盒帐户?( https://devforums.apple.com/message/1030357#1030357 )
  2. 在沙箱中testing“要购买”( https://devforums.apple.com/message/1005569#1005569 )

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

我所做的是以下几点:

1)在iTunes Connect中创build一个父testing(沙箱)帐户,并创build一个子testing帐户。 这些实际上只是iTunes Connect中的两个testing帐户。 给父母和孩子打电话给P和C.

2)使用这两个帐户,请访问https://appleid.apple.com并根据年龄更改他们的年份。 iTunes Connect不会让你这样做。 出于某种原因,除非年龄有一年,否则与家人共享的过程将不起作用。 我发现你必须在https://appleid.apple.com上的年份列表中做两次select。 奇。 我把我的P设定为更老(某些成人年龄),我的C更年轻。

3)在一个苹果设备(我的iPhone,运行iOS8),我设置家庭共享在设置> iCloud的P帐户。 我使用真实的iTunes Apple ID(具有我的付款信息)在此设备上loginiTunes。

4)然后我邀请我的C苹果ID成为我的家庭的一部分,在设置> iCloud下。

5)我接受来自P的邀请(在我的iPad上,也运行iOS8),该邀请涉及在该另一个设备上的iCloudlogin,例如C

6)在我的iPhone上,我打开“Ask To Buy”为C家庭成员。

现在,我已经准备好在我的沙盒应用程序上尝试购买C语言了。 在我的应用程序商店中经过常规stream程之后,我收到以下警报:

在这里输入图像说明

当我点击“询问”时,我得到下一个提醒:

在这里输入图像说明

现在,我尝试了两种select,分开购买。 我已经尝试了“确定”选项,它应该发送一个通知给P帐户。 我的P帐户还没有收到这样的通知(我的iPad上仍然签入了iCloud)。

我也尝试了“孩子的iPad”上的“批准人”选项。 我使用P账号,如果在下一次提示中input:

在这里输入图像说明

那之后我没有得到任何的错误,所以似乎Approve In Person有效,但我还没有把这个购买转换成SKPaymentTransactionStatePurchased状态。 所有延期购买仍然在应用程序的支付队列中,每个都有SKPaymentTransactionStateDeferred状态。 当我重新启动应用程序,每个购买,仍然在队列中的状态被推迟。

接下来,我想知道C语言testingiTunes帐号是否有问题,于是我又创build了第二个子帐号,称之为C2,并尝试在iPhone上的P下创build它。 但是,我遇到了更多的问题。 当我尝试接受邀请成为C2下的家庭成员时,我得到警报(在iPad上):

在这里输入图像说明

对我而言,iCloud帐户上的这一限制不适用于testing帐户。 这是我向苹果公司报告的明显错误。

所以,总之,我还没有100%相信我的SKPaymentTransactionStateDeferred实现工作。 我们将看看苹果是否会回到我身边。

从iOS 8.3有一个新的标志SKPayment可用:simulationsAskToBuyInSandbox。

所以如果你需要testingSKPaymentTransactionStateDeferred状态,你需要初始化新的SKMutablePayment并设置simulatesAskToBuyInSandbox = YES

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

PS。 警告:人们抱怨这个API不能正常工作(见评论)

iOS 9.2.1,Xcode 7.2.1,ARC启用

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

 SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:productUserRequested]; payment.simulatesAskToBuyInSandbox = true; [[SKPaymentQueue defaultQueue] addPayment:payment]; 

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

 [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 

这继续了应用程序的交易。 终止,并使您有能力testing未完成购买的用户(例如,在购买的最后阶段丢失接收)和延期购买。 假设您的购买方法传递了一个延迟参数,如清单4-2在In App Purchasing Guide:Delivering Products中 响应事务状态所述 。 以下是该方法的样子:

模拟挂起购买:

 [self showTransactionAsInProgress:transaction deferred:NO]; 

模拟延期:

 [self showTransactionAsInProgress:transaction deferred:YES]; 

注意:在应用程序。 重新启动,苹果在应用程序。 如果您没有为凭证处理任何其他付款,卸载应用程序,或在“设置”中退出“iTunes和App Store”,购买机制将要求您提供凭据。 另外,如果在这里点击“取消”,那么交易将不会失败,因为支付队列观察者将继续注册SKPaymentTransactionStatePurchased状态。

更新3/4/2016:

我发现这个build议可能被certificate是有帮助的,这是我build议做的一个奇特的方式:

testing中断事务

在您的事务队列观察者的paymentQueue:updatedTransactions:方法中设置一个断点,以便您可以控制它是否交付产品。 然后在testing环境中像往常一样进行购买,并使用断点暂时忽略事务 – 例如,通过在LLDB中使用线程返回命令立即返回该方法。

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

希望这可以帮助! 干杯。

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

此外,您需要通过iTunes连接创buildC帐户,而不是通过家庭共享屏幕上的“创build孩子的帐户”选项。

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

事实certificate,看起来沙箱环境不支持父子关系,所以当有问题的帐户按照@ChrisPrince的回答中提到的那样设置时,邮件将不会被发送。

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

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

关于Ask-To-Buy支持,Sandbox中不支持该function。 “Ask to Buy”不是一个API实现,而是一个由iTunesConnect实现的支持过程,需要StoreKit与特定的iTunes帐户交互。 这种支持只存在于生产环境中。 为了使这个过程在沙箱环境中工作,ITC需要执行testing帐户来引用其他帐户来批准购买。

本文的其余部分重点介绍了Ask to Buy支持的准则和stream程,但是testing必须在子/父帐户关系处于活动状态的生产环境中完成。