Gol*_*Joe 4 in-app-purchase ios skproduct
在 iOS 中,如果用户尝试购买 IAP,而我的服务器对收据的验证失败,正确的行为是什么?在沙盒中测试时,我只是收到大量弹出窗口,要求输入密码。如果我调用 finishTransaction,它会停止询问我的密码,但我相信这可能会导致用户在没有收到产品的情况下被收费。
我认为进行应用内购买时的错误处理是进行应用内购买时较少讨论的困难之一。这里有几个问题。例如: 1)如果您正在设备上对购买收据进行验证(即 >= iOS7 风格的解密风格验证),并且验证失败,该怎么办?2) 如果您使用基于 Web 的服务器进行验证,但失败了,您应该做什么?3) 如果您将收据存储到您自己的基于网络的服务器,但失败了,您应该做什么?我将在我自己的应用程序中提出一些想法。很高兴看到其他人对这种错误处理做了什么。
\n\n1) 如果您正在设备上验证购买收据(即 >= iOS7 解密样式验证),并且验证失败,您应该做什么?
\n\n如果设备上的初始验证失败,Apple 建议您刷新收据 (SKReceiptRefreshRequest)。但是如果刷新后验证失败怎么办?您可以将这种情况解释为存在严重错误(例如,用户以某种方式侵入您的应用程序,故意给您提供错误的收据),告诉用户购买因收据验证失败而失败,并完成交易(SKPaymentQueue finishTransaction:) ,永久失败。然而,我不喜欢这么最终。也许这是我的信心,但我的编程可能出了问题。我喜欢给用户更多的机会。所以,我的解决方案是:1)告诉用户验证失败,2)将SKPaymentTransaction放入\xe2\x80\x9cholding\xe2\x80\x9d状态,3)调用finishTransaction。这种保持状态的想法是我的发明,Apple 没有提出(或支持)任何内容。我创建了 SKPaymentTransaction 的可变子类,并有一个这些对象的队列(称为 SPASMutablePaymentTransaction),我将其存储(使用 NSCoding)到 NSUserDefaults 中。几乎总是,这个队列是空的,但是如果我像这里所说的 I\xe2\x80\x99m 一样验证失败,我会创建一个 SPASMutablePaymentTransaction 对象,复制 SKPaymentTransaction 信息(包括收据,例如来自捆绑包的收据),并将该交易保存到我的持有状态队列中。我使 UI 的一部分(通常隐藏)可见,这可以允许用户重试持有状态事务。
\n\n复杂的?对,一点。然而,由于我们\xe2\x80\x99正在与给你钱的用户打交道,所以我试图保持稳健。到目前为止,它在测试中似乎运行良好。我\xe2\x80\x99还没有收到用户对此的任何反馈(或分析),但它已部署到应用程序商店。
\n\n2) 如果您使用基于 Web 的服务器进行验证,但失败了,您应该做什么?
\n\n对我来说,这与上面的 1) 类似。您尝试验证收据但失败。您可以首先尝试刷新收据(见上文),然后重新尝试服务器验证。在我的应用程序中,由于我总是首先进行设备上收据验证,因此再次刷新收据对我来说没有意义(因为如果设备上收据验证失败,我就会这样做)。因此,我再次将收据置于 \xe2\x80\x9cholding\xe2\x80\x9d 状态(如上所述),并允许用户自行决定重试持有状态交易。
\n\n3) 如果您将收据存储到您自己的基于网络的服务器,但失败了,您应该做什么?
\n\n(a) 想必这绝对不应该是您永远无法向用户提供购买的情况。这是您的服务失败。就我而言,例如,如果我在与服务器通信时出现网络错误,则可能会发生这种情况。我在这里做了一些不同的事情。我不\xe2\x80\x99t立即授予用户访问其购买的权限,并且我不\xe2\x80\x99t将交易置于\xe2\x80\x9cholding\xe2\x80\x9d状态。相反,我设置了一个计时器来重试将收据存储到我的服务器的过程。它会在几分钟后重试。我告诉用户我\xe2\x80\x99m 在做什么。我将收据数据存储到 NSUserDefaults 中(再次使用 SPASMutablePaymentTransaction 对象),因此即使应用程序崩溃/终止,也会持续重试。当我成功地将收据保存到我的服务器时,我授予用户访问购买的权限。
\n\n(b) 在本例中,我确实调用 finishTransaction: 并且尚未授予用户购买的权限。我可以通过不调用 finishTransaction: 来避免这些细节,只需让我的事务观察器再次处理此过程(例如,当应用程序下次启动时),但用户可能必须再次输入他们的 Apple ID。我的想法是,这是我的问题(即,我未能将收据信息保存到我的服务器),所以我试图在幕后处理它。
\n| 归档时间: |
|
| 查看次数: |
2034 次 |
| 最近记录: |