Iphone 验证应用内购买

Iphone 验证应用内购买,iphone,in-app-purchase,Iphone,In App Purchase,我正在构建一个iPhone应用程序,它应该通过应用内购买来处理订阅。当我在我的应用程序中从苹果取回收据时,我想将收据保存在我自己的服务器上,并且在我的服务器上,我还想用苹果服务器验证收据。与我的服务器建立连接是非常重要的,因为这样可以保存稍后需要的用户信息 在我的SKPaymentTransactionObserver中,我现在尝试在SKPaymentTransactionStates上调用我的服务器。问题是,在SKPaymentTransactionStatePurchased上,似乎有一个标

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

在我的SKPaymentTransactionObserver中,我现在尝试在SKPaymentTransactionStates上调用我的服务器。问题是,在SKPaymentTransactionStatePurchased上,似乎有一个标准警报,上面写着“谢谢”,并且购买已经完成。由于应用程序需要一段时间才能与我的服务器联系,因此在呼叫我的服务器完成之前会显示此标准警报,如果用户在此处退出应用程序,会发生什么情况,他认为购买已按其所述完成?我应该什么时候联系我的服务器?如果我想在对我的服务器的调用完成时向用户显示警报,我应该在什么时候这样做

这是我正在使用的代码:

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

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

当服务器返回给您时,从NSUserDefaults中删除密钥

如果应用程序在服务器返回给您之前退出,则下次启动时密钥仍将处于NSUserDefault中,您可以在那时发送购买信息

萨姆

PS记住调用
[[NSUserDefaults standardUserDefaults]同步]
以确保您的密钥被写入


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

这是
SKPaymentQueue
文档中关于
finishTransaction
方法的说明:

您的应用程序应该调用 finishTransaction:仅在完成 已成功处理该事务 并解锁了功能 由用户购买

因此,我认为您需要在服务器上保存和验证事务,并且只有在确认后才调用
finishTransaction
方法。正如dean所指出的,您需要满足用户在您成功验证之前退出的情况


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

我尝试删除finishTransaction,但似乎显示了验证成功付款的弹出窗口?嗯,此时付款已成功。这笔钱已经从他们的iTunes帐户中取出
finishTransaction
表示您已完成事务。我不认为你可以改变事件的顺序,你只需要调整你的用户界面来适应。谢谢!我看到的许多指南都说,这是在应用程序启动时直接添加事务观察器的好方法。这么重会让我的应用程序变慢吗?您认为什么时候添加观察者是最好的方法?如果队列中没有任何内容,我希望它是相当轻量级的,但您确实需要进行测试。我想检查的是,添加此行不会提示输入用户名/密码。在我的应用程序中,我在“升级”屏幕中有此检查。因此,在用户打开“购买”屏幕之前,您不会添加观察员?谢谢您的帮助!我一直在努力实现此解决方案,但什么是[[NSUserDefaults standardUserDefaults]synchronize]?我以前从未使用过,是否需要写入默认值?synchronize方法强制NSUserDefaults立即保存自身。如果你不调用这个,变量仍然会被保存,但在未来的某个时刻,这在99%的情况下是可以的,但是你想保护自己,防止用户快速退出应用程序,所以最好确保!