2012-03-08 18 views
7

後,我已閱讀我發現,使用reachabilityWithHostName不以URL像這樣的工作對於this question答案:mySite.com/service.asmx,反正是有檢查可達不要使用reachabilityWithHostName此網址或任何reachability類方法?檢查對特定頁面可達性的URL

非常感謝。

+1

可達只有那裏檢查,如果您有互聯網連接,所以你可以決定你是否應該提醒用戶,因此使用緩存的數據。這是Apple用戶交互準則的一部分。如果您想檢查特定的URL,請嘗試訪問它,將超時設置得非常小並捕獲錯誤。 – 2012-03-08 11:42:51

回答

18

可達性類和-reachabilityWithHostname:被設計成一個快速的快速故障快速機制,用於確定您是否具有與主機的基本網絡連接。如果您需要驗證是否可以下載特定的URL,則需要查看使用NSURLConnection來檢索URL的內容,以驗證它是否真正可用。

根據您是否需要這樣做的前景或背景,你可以使用簡單,但阻斷:

+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error 

,或者您可以使用創建一個NSURLConnection的對象的更復雜的方法,建立一個委託接收響應,並等待這些響應進來

對於簡單的情況:

NSURL *myURL = [NSURL URLWithString: @"http://example.com/service.asmx"]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: myURL]; 
[request setHTTPMethod: @"HEAD"]; 
NSURLResponse *response; 
NSError *error; 
NSData *myData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error]; 

如果您收到的回on-nil myData,你有一些連接。 responseerror會告訴你服務器對你做出了什麼反應(在響應的情況下,如果你收到了非零的myData)或者發生了什麼樣的錯誤,在無數據的情況下。

對於非平凡的情況,您可以從Apple的Using NSURLConnection得到很好的指導。

如果你不想拖延你的前臺進程,你可以通過兩種不同的方式來做到這一點。上述文檔將提供有關如何實現委託等的信息。但是,更簡單的實現是使用GCD在後臺線程上發送同步請求,然後在完成後在主線程上發出自己的消息。

事情是這樣的:

NSURL *myURL = [NSURL URLWithString: @"http://example.com/service.asmx"]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: myURL]; 
[request setHTTPMethod: @"HEAD"]; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, NULL), ^{ 
     NSURLResponse *response; 
     NSError *error; 
     NSData *myData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error]; 
     BOOL reachable; 

     if (myData) { 
      // we are probably reachable, check the response 
      reachable=YES; 
     } else { 
      // we are probably not reachable, check the error: 
      reachable=NO; 
     } 

     // now call ourselves back on the main thread 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self setReachability: reachable]; 
     }); 
}); 
+0

你能提供一個簡單的例子來說明如何在後臺執行它以防止掛起應用程序? – JAHelia 2012-03-08 12:06:56

+0

我已經添加了一個示例,使用GCD在異步調用後臺線程時發出同步請求,並在完成時將響應作爲消息返回給主線程。希望有所幫助。 – gaige 2012-03-08 12:18:12

+0

真棒!在上面的代碼中有一個小錯誤,你必須在第一個if語句中設置reachable = YES,並在第二個if語句中設置NO。非常感謝你gaige。 – JAHelia 2012-03-08 12:29:15

5

如果你想檢查對URL(通常使用的是一個主機名)的可達性,只需使用NSURLConnection做一個HEAD請求。