我正在构建一个iPhone应用程序,应该通过In App Purchase来处理订阅。当我在我的应用程序中从Apple收到回执时,我想将收据保存在我自己的服务器上和我的服务器上,我还要验证Apple服务器的收据。与我的服务器建立此连接非常重要,因为这样可以保存稍后将需要的用户信息。
在我的SKPaymentTransactionObserver中,我现在尝试在SKPaymentTransactionStatePurchased上调用我的服务器。问题是,在SKPaymentTransactionStatePurchased上,似乎有一个标准的警告说“谢谢”并且购买已完成。由于应用程序需要一段时间才能联系我的服务器,因此在完成对我的服务器的调用之前会显示此标准警报,如果用户在此处退出应用程序会发生什么情况,他认为购买已完成,因为它已经完成了?我何时应该联系我的服务器?如果我想在完成对服务器的调用时为用户显示警报,我该怎么做?
这是我正在使用的代码:
//This is called on "SKPaymentTransactionStatePurchased"
- (void) completeTransaction: (SKPaymentTransaction *)transaction
{
[self saveAndVerifyOnServer:transaction];
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
答案 0 :(得分:2)
这是SKPaymentQueue
关于finishTransaction
方法的文档:
您的申请应该致电 finishTransaction:只有在它之后 成功处理了交易 并解锁了功能 由用户购买。
由此,我认为您需要在服务器上保存并验证交易,并且只有在确认时才调用finishTransaction
方法。院长指出,您需要在用户验证之前满足用户退出的情况。
好消息是SKPaymentQueue
会话持续存在,所以它会记住你还没有买完东西。这意味着下次添加事务观察器时,您可以立即在您的委托中进行调用。您可能需要对服务器进程进行编码,以便它可以重新启动事务。
答案 1 :(得分:0)
您可以立即将购买内容存储在应用中(仅限NSUserDefaults),直到您成功与服务器通信为止。
当您的服务器回复给您时,请从NSUserDefaults中删除密钥。
如果应用程序在服务器返回给您之前退出,则下次启动时密钥仍将在NSUserDefaults中,然后您可以发送购买。
萨姆
PS请记得致电[[NSUserDefaults standardUserDefaults] synchronize]
以确保您的密钥被写入!
PPS您需要以某种方式防止多次购买。可能是应用程序生成的某种独特密钥。