2013-02-28 19 views
7

我正在努力獲得真實的互聯網連接狀態。我已經使用蘋果的可達性,但它只給我的WiFi連接狀態,即不包括設備通過WiFi連接(到路由器或熱點),但無線路由器或熱點本身沒有連接到互聯網的情況。這種情況可以通過從wifi路由器拉出互聯網輸入電纜來重現。對於reachabilityForInternetConnectionReachabilityWithHostName,可達性的通知程序均返回ReachableViaWiFi。我很解決這個問題。我也通過NSURLConnection嘗試過,但這太耗電了,我個人不喜歡這種解決方案來繼續提供URL請求,儘管它在後臺線程中。如何檢測wifi資源丟失連接時互聯網可達性的損失?

下面是我使用的代碼(SO同胞的禮貌,不記得,雖然確切的鏈接)

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil]; 

    internetReachable = [[Reachability reachabilityForInternetConnection] retain]; 
    [internetReachable startNotifier]; 

    // check if a pathway to a random host exists 
    hostReachable = [[Reachability reachabilityWithHostName: @"www.google.com"] retain]; 
    [hostReachable startNotifier]; 

然後在觀測方法:

- (void) checkNetworkStatus:(NSNotification *)notice{ 

    // called after network status changes 

    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus]; 
    switch (internetStatus) 

    { 
     case NotReachable: 
     { 
      NSLog(@"The internet is down."); 
      self.isInternetReachable = NO; 

      break; 

     } 
     case ReachableViaWiFi: 
     { 
      NSLog(@"The internet is working via WIFI."); 
      self.isInternetReachable = YES; 

      break; 

     } 
     case ReachableViaWWAN: 
     { 
      NSLog(@"The internet is working via WWAN."); 
      self.isInternetReachable = YES; 

      break; 

     } 
    } 
    NetworkStatus hostStatus = [hostReachable currentReachabilityStatus]; 
    switch (hostStatus) 

    { 
     case NotReachable: 
     { 
      NSLog(@"A gateway to the host server is down."); 
      self.isHostReachable = NO; 

      break; 

     } 
     case ReachableViaWiFi: 
     { 
      NSLog(@"A gateway to the host server is working via WIFI."); 
      self.isHostReachable = YES; 

      break; 

     } 
     case ReachableViaWWAN: 
     { 
      NSLog(@"A gateway to the host server is working via WWAN."); 
      self.isHostReachable = YES; 

      break; 

     } 
} 
} 
+1

嗨@艾哈邁德。你有沒有找到解決這個問題的方法?我有完全相同的問題 - 我的用戶將他們的設備連接到Wifi熱點,當熱點失去連接時,應用程序不知道。 – 2015-11-18 01:01:23

+0

2016年仍然沒有解決,得到同樣的問題。 – 2016-01-13 15:39:52

回答

7

Reachability它不僅檢查wifi,還檢查WWAN/3G和沒有互聯網接入,爲什麼你認爲它不檢查除WIFI外?

typedef enum { 

    NotReachable = 0, 

    ReachableViaWiFi, 

    ReachableViaWWAN 

} NetworkStatus; 

,如果你想查詢的可達性,以一個特定的主機,那麼你可以自己設置主機這樣

Reachability *hostReach = [Reachability reachabilityWithHostName: @"www.google.com"]; 

NetworkStatus netStatus = [hostReach currentReachabilityStatus]; 

switch (netStatus) 
    { 
     case ReachableViaWWAN: 
     { 
      NSLog(@"WWAN/3G"); 
      break; 
     } 
     case ReachableViaWiFi: 
     { 
      NSLog(@"WIFI"); 
      break; 
     } 
     case NotReachable: 
     { 
      NSLog(@"NO Internet"); 
      break; 
     } 
} 
+0

我正在按照主機可達性的規定進行操作,但每次都會收到ReachableViaWiFi? – Ahmed 2013-02-28 22:28:18

+0

,因爲你可能連接到WIFI那一刻,嘗試禁用設備的WIFI,然後嘗試看看你得到的狀態? – nsgulliver 2013-02-28 22:29:54

+0

@Ahmed是否解決了您的問題?它是第一次使用'Reachability'嗎? – nsgulliver 2013-02-28 22:48:44

0

我得到太多了WIFI標誌,即使它斷開。有一個在Reachability.m方法的錯誤:

- (NetworkStatus)networkStatusForFlags:(SCNetworkReachabilityFlags)flags 

它使用BOOL作爲返回值,但其分配給它一個結構的值與3個值:

typedef enum : NSInteger { 
    NotReachable = 0, 
    ReachableViaWiFi, 
    ReachableViaWWAN 
} NetworkStatus; 

所以,如果是否Wi-Fi或蜂窩是可用的,它會ReachableViaWiFi(作爲BOOL可以是0或1,但不是兩個)

爲了修正它,就在上述這種方法改變:

BOOL returnValue = NotReachable; 

對於這一點:

int returnValue = NotReachable; 

,你是好去。希望能幫助到你。

+0

我將BOOL更改爲NetworkStatus(這是正確的類型),但它仍然不適用於我。即使WiFi關閉,我仍然可以使用ReachableViaWiFi。 – progrmr 2014-01-03 19:48:20

4

查看喬丹的答案。蘋果官方Reachability.m中有一個愚蠢的錯誤。該類型的returnValue應該是「NetworkStatus」,而不是「BOOL」:

- (NetworkStatus)networkStatusForFlags:(SCNetworkReachabilityFlags)flags 
{ 
    ... 
    NetworkStatus returnValue = NotReachable; 
    ... 
} 

否則,你最終得到以下可怕的後果:

  1. 即使蜂窩連接可用時,它會報因爲 不可用。
  2. 如果Wifi不可用,則在蜂窩連接可用時,Wifi將被報告爲可用。

不能相信蘋果從來沒有打擾到解決這個問題。

(P.S.新堆棧溢出,沒有代表upvote喬丹)

相關問題