2011-06-30 59 views
22

乾杯,SKProductsRequest - 如何處理超時/連接錯誤?

在我看來,SKProductsRequest不以任何方式處理超時或連接錯誤。如果成功,它可以在其代表上撥打-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response,或者不成功。

我想在檢索產品時向用戶展示某種活動指示器,或者在無法訪問應用商店時彈出提醒。因爲(在失敗的情況下)SKProductsRequest沒有任何反饋,但是我想知道我應該在哪個事件中配合這個反饋的呈現 - 除此之外還需要等待任意的時間。

所以,問題是:是否有一段已知的時間,之後可以安全地假設請求失敗?或者有什麼方法可以檢查我剛纔看不到的待處理請求的狀態?

回答

44

我在我的項目運行此每當一個SKRequest失敗(包括SKProductRequest):

- (void)request:(SKRequest *)request didFailWithError:(NSError *)error 
{ 
    alert = [[UIAlertView alloc] initWithTitle:@"In-App Store unavailable" message:@"The In-App Store is currently unavailable, please try again later." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 

    [alert show]; 
} 

作品一種享受。當然你可以在括號內放置任何東西來代替我的警報,但是這對用戶來說效果很好。

希望這對你有用。

注意:這是在SKRequestDelegate不在SKProductsRequestDelegate,這是有點混淆。 SKRequestDelegate用於採購和產品請求。使用request.delegate設置的代表可以爲兩者實現方法。

+1

!!!!!!我不敢相信我沒有看到這個......我檢查了SKProductDelegate協議,就像上百次一樣,因爲我認爲必須有一個錯誤處理程序......我想我以前從來沒有這樣失望過。真棒!非常感謝,老兄! – Toastor

+0

我也完全沒有注意到這在文檔中.. – Brynjar

+0

但這種方法沒有記載在SKProductsRequestDelegate協議參考?至少不在http://developer.apple.com/library/ios/#documentation/StoreKit/Reference/SKProductsRequestDelegate/Reference/Reference.html –

2

我不相信除了等待任意數量的時間之外,你什麼都不能做。在我的一些應用程序中,我等待30秒(同時顯示模態活動視圖),然後用通用錯誤警報解救出來。問題在於,實際上30秒超出了大多數用戶對此類問題的關注範圍,但如果將其縮短到足夠有用(例如15秒),則實際上您可能會過早提供保釋。

我不認爲有更好的選擇...但我願意學習,否則!

+0

羅傑,我很抱歉把這個接受從你身邊拿走,但薩繆爾斯的回答真的是一個很好的電話。看看它,我想你會和我一樣驚訝,主要是因爲它非常明顯......我很驚訝我們如何設法忽略這個... – Toastor