2013-10-10 50 views
0

我正在使用遠程存儲數據的iPhone應用程序。該應用僅供我們的客戶使用(無應用商店),我不允許指定應用的上下文。iOS:如何減少FTP連接超時?

我可以告訴你的唯一上下文是該應用程序允許輸入代碼,並下載與該代碼相關的數據。

我們的客戶告訴我們,有時我們需要使用應用程序的地方互聯網不可訪問或太慢。

已經得出的解決方案如下:

  1. 我們會嘗試下載一個本地FTP服務器,它實際上只是一個路由器的代碼作爲其名稱共享目錄上的數據,可以通過已知的IP訪問(例如,ftp://192.168.1.1/some-path)。

  2. 如果失敗,它會嘗試從Web服務器下載。

我發現了一個名爲FTPManager的真棒庫,由Nico Kreipke完成。 (click here for its GitHub

不幸的是,當FTP地址不可用時,大約需要一分鐘超時並轉到第二步。

有沒有人可以幫助減少這種超時?也許快速ping到IP?如果是這樣,該怎麼辦?

感謝您的時間,
蒂亞戈

一些更多的信息

我試着通過Rauru鐵的答案靈感的解決方案。但不幸的是,它並沒有幫助。 用於測試的代碼如下:

 
NSString *ftp = [NSString stringWithFormat:@"ftp://user:[email protected]%@/sda1/%@", ip, code]; 
NSURL *url = [NSURL URLWithString:ftp]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0]; 
NSURLResponse *response = nil; 
NSError *error = nil; 
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

我試過幾個超時值,但無濟於事。它總是以超時錯誤結束。但是,下載代碼能夠從路由器的共享目錄下載數據(使用相同的憑證)。

回答

0

嘗試使用此代碼(是建立與POST列舉HTTPMethod HTTP連接,但它是一個beginnning):

NSURL *url = [NSURL URLWithString:yourURL]; 
NSMutableURLRequest *request = [NSMutableURLRequest 
           requestWithURL:url 
           cachePolicy:NSURLRequestReloadIgnoringCacheData 
           timeoutInterval:20.0]; 
[request setHTTPMethod:@"POST"]; 
+0

感謝您的幫助。我試過類似的東西,但不幸的是它沒有工作。它不僅會拋出一些異常,當它不會,我不能得到任何數據。我將用我剛剛執行的測試來編輯帖子。 – rtiago42

+0

我忘記了證書:當我找到時間時,我必須重試。目前,這個超時問題已被置於待命狀態,同時我們修復了一些重要的錯誤。再次感謝;) – rtiago42

+0

嘿rtiago,你能告訴我你是怎麼做到的嗎? –

0

有幾件事情,當你連接到服務器,以考慮。首先要確定的是「我連接到服務器」,第二個是「服務器響應需要多長時間?」。

使用FTP,首先向服務器發送低級別tcp/ip連接,然後服務器將響應初始2xx級別的歡迎/ Hello消息。

使用高級別類接口(如NSMutableURLRequest)時,可能很難區分連接超時和服務器響應超時。您可能連接到服務器,但服務器陷入困境,響應歡迎消息的速度很慢。

我的建議是去低級別,並使用通用的BSD套接字對象,創建套接字,然後連接到服務器。您還可以使用低級別的setsockopt()調用來限制connect()調用將等待連接的時間量。通過FTP,您還可以選擇執行recv()以從服務器檢索歡迎消息。您可以在此調用上設置不同的超時時間,以確保服務器及時響應。

稍微高一點的CFSocket類會給你更多的來自BSD層的封裝,但你仍然應該能夠突破連接時間和初始響應時間之間的差異。

希望有幫助! Michael