paymentQueueRestoreCompletedTransactions完成:vs updatedTransactions:

时间:2013-01-13 23:22:28

标签: ios objective-c in-app-purchase

我正在使用

恢复已完成的交易(重复出现)
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

并在

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

我得到了应用程序恢复的历史记录事务列表,但方法是:

- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue

甚至没有被调用一次,所以我想知道我应该使用哪一个?我做了一些研究,发现updatedTransactions:方法应该用于检查事务状态,但是如果我得到了一个恢复的事务列表,那么将它们全部视为事务就没有意义了。我应该使用哪一个? paymentQueueRestoreCompletedTransactionsFinished仅向我提供最新版本(即沙盒订阅在几分钟后到期,我在updatedTransactions)中获得了测试时完成的历史记录事务列表。

4 个答案:

答案 0 :(得分:9)

有一个关于使用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语句中调用单独的方法并将事务作为参数传递。当然,实施取决于你。

答案 1 :(得分:2)

  1. 如果适用,请致电[[SKPaymentQueue defaultQueue] addTransactionObserver:self]中的(void)viewDidLoad或同等身份。
  2. 然后致电[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]
  3. (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions将通过(2)进行相应调用。
  4. 如果你没有调用(1)中的方法,应用程序将永远不会达到(3)首先恢复交易。

答案 2 :(得分:0)

我也遇到了同样的问题,paymentQueueRestoreCompletedTransactionsFinished从未被调用过。我通过在“设置”中的iTunes&Aoo Stores进行修复,并退出了沙盒测试帐户,然后再次尝试。在提示您再次登录以还原后,下一次按预期方式工作。

答案 3 :(得分:-1)

来自Apple文档:

  

paymentQueueRestoreCompletedTransactionsFinished:此方法称为   付款完成所有可恢复的交易后   队列。您的应用程序无需使用此方法做任何事情。