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

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

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

我得到了由应用程序还原的历史事务的列表,但是方法是:
- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue

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

最佳答案

有关使用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语句中调用一个单独的方法,然后将交易作为参数传递。当然,具体实现取决于您。

10-08 06:09