2012-11-16 84 views
10

我正在使用Apple的可達性代碼,並且在網絡可達性發生變化時以及啓動服務器連接之前設置了初始通知。該代碼在我使用wi-fi時起作用,並關閉wi-fi接入點。但是,當我用Wi-Fi和底層寬帶連接啓動應用程序並運行應用程序時,然後斷開Wi-Fi路由器與寬帶路由器的連接(即,Wi-Fi已打開但沒有互聯網連接),並且我做了可達性檢查,我得到的網絡狀態是ReachableViaWiFi。我已經嘗試了reachabilityForInternetConnection和reachabilityWithHostName。當無線網絡連接但沒有互聯網時,可達性不工作

關於蘋果的可達性代碼是否可用於檢測WiFi連接但沒有底層網絡連接的情況的任何想法?

謝謝!

回答

5

好吧,我找到了答案 - 蘋果的可達性並沒有測試與主機的實際連接。見@Zhami答案在下面的SO鏈接:

How to write a simple Ping method in Cocoa/Objective-C

從本質上講,當你第一次啓動應用程序,並做了可達性檢查,iOS版似乎做DNS查詢,如果沒有互聯網,檢查失敗。所以第一次檢查可達性時,它實際上會返回一個有意義的值。但是,如果您在應用程序啓動時連接並在一段時間後失去互聯網連接(雖然仍連接到WiFi/3G/4G,但沒有基礎互聯網連接),但即使互聯網或您指定的主機無法訪問,其他可達性檢查仍會返回到可達狀態了。

所以,如果你想真正爲您在實時連接,可以考慮使用以下:

-(BOOL) isConnected 
{ 

    NSString* url = [NSURL URLWithString:@"http://www.google.com/m"]; 
    ASIHTTPRequest* request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:url]]; 
    [request setTimeOutSeconds:10]; 
//customize as per your needs - note this check is synchronous so you dont want to block the main thread for too long 
    [request setNumberOfTimesToRetryOnTimeout:0]; 
    [request startSynchronous]; 

    NSError *error = [request error]; 
    if (error) 
    { 
     DLog(@"connectivity error"); 
     return NO; 
    } 
    else 
    { 
     DLog(@"connectivity OK"); 
     return YES; 
    } 

} 
+0

這不起作用... – user3079872

+0

它會工作,當我檢查互聯網是否可用。如何在互聯網斷開連接的情況下立即收聽並自動顯示互聯網不可用狀態? – NandhaKumar

1

這是一個非常古老的職位,但會留下來,以供參考。在可達性示例類中,您可以找到以下代碼:

- (BOOL)startNotifier 
{ 
    BOOL returnValue = NO; 
    SCNetworkReachabilityContext context = {0, (__bridge void *)(self), NULL, NULL, NULL}; 

    if (SCNetworkReachabilitySetCallback(_reachabilityRef, ReachabilityCallback, &context)) 
    { 
     if (SCNetworkReachabilityScheduleWithRunLoop(_reachabilityRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode)) 
     { 
      returnValue = YES; 
     } 
    } 

    return returnValue; 
} 

這將使您的_reachabilityRef更新爲網絡更改。

相關問題