2011-10-13 173 views
8

我正在實施應用內購買功能還原按鈕。StoreKit:Catch失敗的恢復?

我有一個全新的測試用戶設置,沒有任何付款。

當我點擊恢復按鈕並使用新的測試用戶登錄時,我找不到任何委託方法告訴我恢復事務失敗(因爲沒有任何恢復)。

被調用的唯一方法是-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue*)queue,但在還原成功時也會調用此方法。

我現在能做什麼?我怎麼能抓住這樣的情況?


增加:我有說「聯繫App Store的」進度指示器,我需要調用,我可以在失敗的情況下隱藏這一點。

+0

由於該問題不是由Test用戶購買的,您將不會從iTunesConnect獲得'SKPaymentTransactionStateRestored'作爲回覆,最終完成您的轉換。 – Hisenberg

+0

這很清楚。但是我發現了一個「聯繫App Store」進度指示器,並且我仍然需要一個事件來在失敗時隱藏它。 – Geri

+1

沒有失敗,當沒有事務存在時還原。其實這個案件是作爲成功處理的。 – Felix

回答

1

當恢復交易,這裏有兩種方法下放:

- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error 

當所有的交易都將恢復第一個(paymentQueueRestoreCompletedTransactionsFinished)被調用。如果您以前沒有任何購買,它也會調用此方法,因爲恢復的工作正常,但無法恢復。

另一種方法(restoreCompletedTransactionsFailedWithError)在恢復事務時出錯時被調用。

如果需要顯示一條消息給用戶,告訴他,他沒有任何交易,以恢復您可以使用:

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

這裏有一個小片段爲這個代表:

// 
// called when the transaction status is updated 
// 
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 
{ 
    for (SKPaymentTransaction *transaction in transactions) 
    { 
     switch (transaction.transactionState) 
     { 
      case SKPaymentTransactionStatePurchased: 
       [self completeTransaction:transaction]; 
       break; 
      case SKPaymentTransactionStateFailed: 
       [self failedTransaction:transaction]; 
       break; 
      case SKPaymentTransactionStateRestored: 
       [self restoreTransaction:transaction]; 
       restoredTransaction++; 
       break; 
      default: 
       break; 
     } 
    } 
} 

然後你可以使用restoredTransaction可變知道,如果任何交易已經恢復對paymentQueueRestoreCompletedTransactionsFinished

+0

但Geri是如何解決這個問題的?他說,如果以前沒有購買任何產品,他將返回從NSLog返回的0來解決此問題。 – MasterRazer

0

對於還原事務,可以使用以下委託方法。

-(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error{ 
NSLog(@"Error when purchasing: %@",error); 

} 
+0

只有在還原被取消或互聯網連接錯誤時纔會調用委託。我想如果用戶之前沒有做過任何購買,那就是問題所在。看看這個問題的評論。有一個解決方案返回一個值,但我不知道如何。 – MasterRazer

6

諾亞:這裏是你的代碼片段:

-(void)restore { 

    [self.delegate showLoadingScreen]; 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 


} 

,按照下述方式:

-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue { 

    if (!queue.transactions || [queue.transactions count] == 0) { 

     [self showAlertScreenWithTitle:@"Error Restoring Subscription" message:@"No subscription was found to restore."]; 

    } else { 

     BOOL didRestore = NO; 

     for (SKPaymentTransaction *t in queue.transactions) { 

      if (t.transactionState == SKPaymentTransactionStateRestored || t.transactionState == SKPaymentTransactionStatePurchased) { 

       NSTimeInterval now = [[NSDate date] timeIntervalSince1970] - _timeOffset; 
       NSTimeInterval expire = [t.transactionDate timeIntervalSince1970] + kExplorerSubscriptionSecondLength; 
       NSTimeInterval purchase = [t.transactionDate timeIntervalSince1970]; 

       if (purchase <= now && now <= expire) { 

        didRestore = YES; 
       } 

      } 


     } 

     if (!didRestore) 
      [self showAlertScreenWithTitle:@"Error Restoring Subscription" message:@"No subscription was found to restore."]; 

    }  

    [self.delegate dismissLoadingScreen]; 

} 

讓我知道如果這能幫助你....

+0

感謝您的維修人員。要檢查現在 – MasterRazer

+0

thx,解決了......用這一行:D(!queue.transactions || [queue.transactions count] == 0) – MasterRazer

+0

我仍然發現我需要else語句。但我現在記得在什麼情況下......如果用戶的訂閱已過期,並且您嘗試還原,它仍然會返回用戶訂閱每月的以前購買。這就是爲什麼我檢查時間段。如果「現在」不屬於任何時間段,則不會恢復任何內容。這可能不適用於你的情況 –