2012-08-31 104 views
1

我已在应用中为应用内购买实施了附加收据验证(受https://developer.apple.com/library/ios/#releasenotes/StoreKit/IAP_ReceiptValidation/_index.html的启发)。 所以,当我拿到SKPaymentTransactionStatePurchased,我执行此验证和成功,我解开游戏的新内容,最后,我通过iOS应用内未完成的购买

[[SKPaymentQueue defaultQueue] finishTransaction:myTransaction]; 

如果验证过程无法完成,会发生什么完成交易说,由于互联网连接失败,还是用户在验证过程中终止应用程序?在这种情况下,我不会解锁内容,也不会完成交易。我认为这很合乎逻辑。但是,当我重新启动应用程序(已经以“未完成的事务”状态终止)并试图购买应用程序时,我进入SKPaymentTransactionStateFailed状态,并且使用transaction.error.code == SKErrorPaymentCancelled进入SKPaymentTransactionStateFailed状态。 此外还出现一个消息框说:

“您已购买此项目,但它尚未加载。点击”确定“现在加载它。

按下“确定”后,我没有得到任何回叫 - 因此我没有解锁内容。

所以我的问题是: 1)是否确定在未完成的状态,此状态的事务(如果它不能被验证)? 2)我该如何恢复它?也许我错过了“你已经购买...”消息箱附带的一些回调?

P.S.我的应用程序内购买是“消费品”。所以我不能使用

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
+0

你有什么作为提供消费型产品? –

回答

2

好吧,我解决了它。最重要的是听取来自App Delegate的支付队列,而不是从“购买UI屏幕”。换句话说,

[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 

必须在

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

不是在我的自定义购入画面的viewDidLoad。

很好的解释可以在这里找到: When should i validate in-app purchase transaction receipt?