2013-01-13 17 views
5

我恢復完成的交易(經常性)與paymentQueueRestoreCompletedTransactionsFinished:VS updatedTransactions:

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 

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

我得到了恢復歷史記錄列表,通過該應用進行的,但該方法:

- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 

甚至不叫一次,所以我不知道我應該哪一個我們è?我做了一些研究,發現updatedTransactions:方法應該用於檢查事務狀態,但是如果我得到了一個恢復的事務列表,將它們全部視爲事務是沒有意義的。我應該使用哪一個? paymentQueueRestoreCompletedTransactionsFinished只給了我最新的一個(即沙箱訂閱在幾分鐘內到期,我在測試時獲得了完整的歷史記錄列表,在updatedTransactions)。

回答

7

有一位優秀的WWDC視頻有關使用StoreKit,它WWDC2012會議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語句內調用單獨的方法並將該事務作爲參數傳遞。當然,這個實現是由你自己決定的。

+0

是的,但是我得到的是同一產品ID恢復的1個以上的事務,那麼我是否將該事務與最近的transactionDate一起使用? – hzxu

+0

嗯,不應該發生......這可能意味着,以前,事務沒有完成與'finishTransaction:'。我會重置您的應用程序(清理構建和刪除iOS模擬器中的數據)以擺脫排隊的事務。在你做之前,你在哪裏設置你的'TransactionObserver'? – Ephemera

+0

在SKPaymentTransactionStatePurchasing情況下可能缺少休息時間? – neoneye

2
  1. 撥打電話[[SKPaymentQueue defaultQueue] addTransactionObserver:self]或撥打(void)viewDidLoad或等同物(如果適用)。
  2. 然後致電[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]。 (2)相應地調用
  3. (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions

如果您沒有調用(1)中的方法,則應用程序將永遠無法到達(3)來首先恢復事務。

+2

是的,我做了1.問題是3中的方法。給我一個沙箱帳戶所有訂閱的列表。我只需要成功恢復的那個。 – hzxu

+0

@hzxu我有同樣的問題,你找到任何解決方案? –

相關問題