2

我正在构建一个应该通过应用内购买处理订阅的 iPhone 应用。当我在我的应用程序中从 Apple 取回收据时,我想将收据保存在我自己的服务器和我的服务器上,我还想通过 Apple 服务器验证收据。建立与我的服务器的连接非常重要,因为这样可以保存以后需要的用户信息。

在我的 SKPaymentTransactionObserver 中,我现在尝试在 SKPaymentTransactionStatePurchased 上调用我的服务器。问题是在 SKPaymentTransactionStatePurchased 上似乎有一个标准警报说“谢谢”并且购买已完成。由于应用程序需要一些时间来联系我的服务器,所以在完成对我的服务器的调用之前会显示此标准警报,如果用户在此处退出应用程序会发生什么,他认为购买完成了?我应该什么时候联系我的服务器?如果我想在对我的服务器的调用完成时向用户显示警报,我应该什么时候这样做?

这是我正在使用的代码:

//This is called on "SKPaymentTransactionStatePurchased"
- (void) completeTransaction: (SKPaymentTransaction *)transaction
{
    [self saveAndVerifyOnServer:transaction];
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
4

2 回答 2

2

这就是文档中SKPaymentQueue有关该finishTransaction方法的内容:

您的应用程序应该调用 finishTransaction: 只有在它成功处理了事务并解锁了用户购买的功能之后。

由此,我认为您需要在服务器上保存并验证交易,并且只有在确认时才调用该finishTransaction方法。正如院长指出的那样,您需要在您设法验证之前满足用户退出的情况。

好消息是SKPaymentQueue跨会话持续存在,因此它会记住您还没有完成购买。这意味着下次您添加事务观察者时,您可能会立即在您的委托中收到调用。您可能需要对服务器进程进行编码,以便它可以重新启动事务。

于 2010-01-18T20:24:45.803 回答
0

您可以立即将购买存储在应用程序中(仅在 NSUserDefaults 中),直到您成功与服务器通信。

当您的服务器回复您时,请从 NSUserDefaults 中删除该密钥。

如果应用程序在服务器返回给您之前退出,则下次启动时密钥仍会在 NSUserDefaults 中,然后您可以发送购买。

山姆

PS记得打电话[[NSUserDefaults standardUserDefaults] synchronize]以确保您的密钥被写入!

PPS 您需要以某种方式防止多次购买。可能使用应用程序生成的某种唯一密钥。

于 2010-01-18T20:08:05.510 回答