8

我正在恢复已完成的交易(重复)

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

并且在

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions

我得到了应用程序恢复的历史交易列表,但是方法:

- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue

甚至没有被调用一次,所以我想知道我应该使用哪个?我做了一些研究,发现该updatedTransactions:方法应该与检查事务状态一起使用,但如果我得到一个恢复的事务列表,将它们全部视为事务是没有意义的。我应该使用哪一个?只paymentQueueRestoreCompletedTransactionsFinished给我最新的一个(即沙盒订阅在几分钟后到期,我得到了测试时进行的历史交易的完整列表,在updatedTransactions)。

4

4 回答 4

10

有一个关于使用 StoreKit 的优秀 WWDC 视频,它是 WWDC2012 Session 302。

要隔离每次购买,您的updatedTransactions方法可能如下所示:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {

        for (SKPaymentTransaction *transaction in transactions) {

            switch(transaction.transactionState) {
                case SKPaymentTransactionStatePurchased:
                    // Unlock content
                    //... Don't forget to call `finishTransaction`!
                    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                    break;
                case SKPaymentTransactionStatePurchasing:
                    // Maybe show a progress bar?
                    break;
                case SKPaymentTransactionStateFailed:
                    // Handle error
                    // You must call finishTransaction here too!
                    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                    break;
                case SKPaymentTransactionStateRestored:
                    // This is the one you want ;)
                    // ...Re-unlock content...
                    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                    break;
             }
         }
}

一旦您确定购买正在恢复,您就可以提供您认为合适的内容 - 最好通过从该 switch 语句中调用一个单独的方法并将交易作为参数传递。当然,实施取决于您。

于 2013-01-14T05:31:08.913 回答
2
  1. 如果适用,请致电或[[SKPaymentQueue defaultQueue] addTransactionObserver:self]等效。(void)viewDidLoad
  2. 然后调用[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]
  3. (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions将通过(2)相应地调用。

如果您不调用 (1) 中的方法,应用程序将永远不会到达 (3) 来恢复事务。

于 2013-01-14T00:16:17.657 回答
1

我有同样的问题,paymentQueueRestoreCompletedTransactionsFinished 从来没有被调用过。我通过进入设置中的 iTunes 和 Aoo 商店进行修复,然后退出沙盒测试帐户并再次尝试。在被提示在恢复时再次登录后,下次按预期工作。

于 2019-06-24T19:59:10.420 回答
0

来自苹果文档:

paymentQueueRestoreCompletedTransactionsFinished:支付队列处理完所有可恢复交易后调用此方法。您的应用程序不需要在此方法中执行任何操作。

于 2019-09-26T15:44:03.127 回答