2011-04-26 86 views
8

我正在使用StoreKit進行應用內購買。當用戶按下「取消」按鈕時,我發現該API的行爲古怪。處理取消的IAP交易

例如,如果我在「確認您的應用程序內購買」屏幕上按下取消,我會按照我的預期收到SKPaymentTransactionStateFailed交易error.code == SKErrorPaymentCancelled

但是,如果我推動Buy,然後按取消,我得到一個Failed交易與error.code == 0error.localizedDescription是「無法連接到iTunes Store」,這顯然是謊言。

將所有Failed交易視爲可忽略的取消是很誘人的,但我也可以清楚地看到,如果設備在飛行模式下處於脫機狀態,我會收到Failed交易,並且不會顯示警報彈出窗口;在這種情況下,我應該通知用戶解釋問題。

我注意到MKStoreKit假設所有失敗都是取消。 MKStoreManagerfailedTransaction方法永遠不會被調用; MKStoreObserver總是針對所有Failed交易調用transactionCanceledMKStoreManager.h評論recommend no error messagetransactionCanceled,這是有道理的,但誰會通知用戶關於Failed未取消的交易?

處理這些故障的最佳做法是什麼?我應該吞下錯誤嗎?始終顯示錯誤,即使它是多餘的?

回答

11

我們有移動連接,只顯示一個警報相當可觀的用戶羣購買的東西的

code != SKErrorPaymentCancelled && code != SKErrorPaymentNotAllowed 

顯然,這是你能做的最好的。我也看到了你提到的取消上的奇怪行爲,據我所知,這是一個框架錯誤。

3

上一個答案非常接近。 MKStoreKit可以自動顯示錯誤消息,以顯示有效的錯誤情況,如開啓家長控制等等。

儘管如此,爲了處理購買取消,我還提供了一個名爲transactionCanceled in MKStoreKitDelegate的委託(從v3.5開始)。

句柄,並停止任何活動紡紗或視圖控制器,使購買呼叫進展HUD ...

+2

MKStoreKit 3.5不區分故障和取消。我在github https://github.com/MugunthKumar/MKStoreKit/issues/3上記錄了一個問題,我已經將它修復在我的叉子中。 – 2011-04-29 06:47:16

+0

謝謝!我合併了你的拉取請求 – Mugunth 2011-04-29 07:24:50

+0

現在我的拉取請求被合併了,最新的MKStoreKit會自動顯示失敗時的錯誤,然後在委託上調用transactionCanceled,以便用戶可以隱藏微調器。 – 2011-04-29 09:42:09

-1

還有一個問題... 點擊購買按鈕,它會顯示另一個警報視圖後並詢問賬戶信息。

如果我沒有取消有那麼它將進入的情況下SKErrorUnknown: 然後 我不能表現出這樣的 消息「您的訂單無法完成,請檢查您的網絡設置,稍後再試。」

- (void) failedTransaction: (SKPaymentTransaction *)transaction 
{ 
    switch (transaction.error.code) { 
     case SKErrorUnknown: 
      NSLog(@"SKErrorUnknown"); 
      break; 
     case SKErrorClientInvalid: 
      NSLog(@"SKErrorClientInvalid"); 
      break; 
     case SKErrorPaymentCancelled: 
      NSLog(@"SKErrorPaymentCancelled"); 
     break; 
     case SKErrorPaymentInvalid: 
      NSLog(@"SKErrorPaymentInvalid"); 
      break; 
     case SKErrorPaymentNotAllowed: 
      NSLog(@"SKErrorPaymentNotAllowed"); 
     break; 
     default: 
      NSLog(@"No Match Found for error"); 
      break; 
    } 
    NSLog(@"transaction.error.code %@",[transaction.error description]); 
    if (transaction.error.code == SKErrorPaymentCancelled) { 
     [[MKStoreManager sharedManager] transactionCanceled:transaction]; 
    } else { 
     [[MKStoreManager sharedManager] failedTransaction:transaction]; 
    } 
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 
} 
0

我只是想補充的是,由於沒有互聯網連接的錯誤應該被大多之前,使用蘋果可達類IMO任何交易抓獲。這樣,您就不需要依賴Apple的API來處理簡單且常見的錯誤。

0

我認爲這是您的責任和決定在何處顯示取消交易的提醒。但是你一定要完成它,否則它會一直下降到失敗。所以,應該是這樣的:

if (transaction.error.code == SKErrorPaymentCancelled) { 
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
} else { 
    [self notifyError:transaction.error]; 
} 

UPDATE: 由於The Business of iPhone App Development: Making and Marketing Apps that Succeed我們應該任何更新失敗的狀態之後,完成交易。知道是否存在我們不應該的情況會很有趣。