1

我在我的应用程序中为应用内购买实现了额外的收据验证(灵感来自https://developer.apple.com/library/ios/#releasenotes/StoreKit/IAP_ReceiptValidation/_index.html)。所以,在我得到 SKPaymentTransactionStatePurchased 之后,我执行了这个验证,成功后,我解锁了游戏的新内容,最后,我完成了交易

[[SKPaymentQueue defaultQueue] finishTransaction:myTransaction];

如果由于互联网连接失败或用户在验证过程中终止应用程序而无法完成验证过程会发生什么?在这种情况下,我不会解锁内容,也不会完成交易。我认为这是相当合乎逻辑的。

但是,当我重新启动应用程序(已在“未完成交易”状态下终止)并尝试购买应用程序内时,我陷入了 SKPaymentTransactionStateFailed 状态,transaction.error.code == SKErrorPaymentCancelled。还出现了一个消息框,上面写着:

“您已经购买了此商品,但尚未加载。点击“确定”立即加载。”

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

所以我的问题是:1)可以将交易留在未完成状态(如果无法验证)吗?2)我该如何恢复它?也许我错过了一些伴随“您已经购买......”消息框的回调?

PS 我的应用内购买是“消耗品”。所以我不能使用

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
4

1 回答 1

2

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

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

必须在

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

不在我的自定义购买屏幕的 viewDidLoad 中。

在这里可以找到很好的解释: 我应该什么时候验证应用内购买交易收据?

于 2012-09-02T12:30:10.280 回答