2013-02-28 38 views
7

Tôi đang cố gắng hết sức để có được trạng thái kết nối internet đích thực. Tôi đã sử dụng Khả năng hiển thị của Apple nhưng nó chỉ cho tôi trạng thái kết nối wifi tức là không bao gồm trường hợp thiết bị được kết nối qua wifi (tới bộ định tuyến hoặc điểm phát sóng), nhưng bộ định tuyến wifi hoặc điểm phát sóng không được kết nối với internet. Kịch bản này có thể tái sản xuất bằng cách kéo cáp đầu vào internet từ bộ định tuyến wifi. Trình thông báo khả năng hiển thị trả về ReachableViaWiFi cho cả hai reachabilityForInternetConnectionReachabilityWithHostName. Tôi khá nhiều trong một sửa chữa với vấn đề này. Tôi đã thử nó thông qua các NSURLConnection quá nhưng đó là tiêu hao pin quá nhiều và cá nhân tôi không thích giải pháp đó để tiếp tục yêu cầu URL, mặc dù trong một chủ đề nền.Làm thế nào để phát hiện mất khả năng truy cập internet khi nguồn wifi mất kết nối?

Dưới đây là đoạn code mà tôi đang sử dụng (lịch sự của một SO đồng, không nhớ đường dẫn chính xác mặc dù)

[[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]; 

sau đó trong phương pháp quan sát:

- (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

Xin chào @Ahmed. Bạn đã bao giờ tìm thấy một giải pháp cho điều này? Tôi gặp vấn đề tương tự - người dùng của tôi có thiết bị của họ được kết nối với điểm phát sóng Wifi và khi điểm phát sóng mất kết nối mà ứng dụng không biết. –

+0

2016 và vẫn chưa được giải quyết, gặp vấn đề tương tự. –

Trả lời

7

Theo Reachability nó kiểm tra không chỉ wifi mà còn cho WWAN/3G và không có truy cập internet, tại sao bạn nghĩ rằng nó không kiểm tra khác hơn WIFI?

typedef enum { 

    NotReachable = 0, 

    ReachableViaWiFi, 

    ReachableViaWWAN 

} NetworkStatus; 

nếu bạn muốn kiểm tra reachability đến một máy chủ cụ thể thì bạn có thể thiết lập máy chủ bản thân như thế này

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

Tôi đang làm chính xác những gì bạn đã nói cho khả năng tiếp cận máy chủ lưu trữ nhưng tôi sẽ nhận được ReachableViaWiFi mỗi lần? – Ahmed

+0

vì bạn có thể kết nối với WIFI vào thời điểm đó, hãy thử tắt WIFI thiết bị của bạn và sau đó thử và xem những gì bạn nhận được cho trạng thái? – nsgulliver

+0

@Ahmed đã giải quyết được sự cố của bạn chưa? là lần đầu tiên bạn sử dụng 'Khả năng hiển thị '? – nsgulliver

0

tôi đã nhận được quá cờ Wifi ngay cả với nó ngắt kết nối. Có một lỗi trong các phương pháp Reachability.m:

- (NetworkStatus)networkStatusForFlags:(SCNetworkReachabilityFlags)flags 

nó sử dụng một BOOL như giá trị trả về, nhưng nó gán cho nó giá trị của một cấu trúc với 3 giá trị:

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

Vì vậy, nếu liệu wifi hoặc Cellular có sẵn, nó sẽ ReachableViaWiFi (như là một BOOL có thể là 0 hoặc 1, nhưng không phải là hai)

Để khắc phục điều đó, chỉ cần thay đổi trong phương pháp trên đây:

BOOL returnValue = NotReachable; 

Đối với điều này:

int returnValue = NotReachable; 

Và bạn đã sẵn sàng. Hy vọng nó giúp.

+0

Tôi đã thay đổi BOOL thành 'NetworkStatus' (đúng loại) nhưng nó vẫn không hoạt động đối với tôi. Tôi vẫn nhận được ReachableViaWiFi ngay cả khi WiFi tắt. – progrmr

4

Xem câu trả lời của Jordan. Có một lỗi ngu ngốc trong Reachability.m chính thức của Apple. Các kiểu cho returnValue nên "NetworkStatus" thay vì "BOOL":

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

Nếu không, bạn kết thúc với những hậu quả khủng khiếp sau:

  1. Ngay cả khi kết nối di động có sẵn, nó sẽ được báo cáo dưới dạng không khả dụng.
  2. Nếu không có Wifi, Wifi sẽ được báo cáo là có sẵn nếu kết nối di động khả dụng.

Không thể tin Apple không bao giờ làm phiền để sửa lỗi này.

(P.S. Mới đối với tràn ngăn xếp và không có đại diện nào để upvote Jordan)

Các vấn đề liên quan