1. 程式人生 > >iOS 獲取當前網路狀態(轉載)

iOS 獲取當前網路狀態(轉載)

轉載自:http://blog.csdn.net/u014483033/article/details/39229417

獲取iOS網路狀態,我目前知道的有兩種辦法。

方法一:Reachability。

相信大家使用最多的方法就是使用Reachability

這是蘋果的官方演示demo中使用到的方法。

1、首先你需要下載並匯入Reachability。這是蘋果官方演示demo,把裡面的Reachability檔案拷貝到自己的工程。下載地址:https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html

2、匯入SystemConfiguration.framework框架。

3、分析reachability中的程式碼含義,可以看到以下三種網路狀態:無網路,wifi和蜂窩網。

  1. typedef enum : NSInteger {  
  2.     NotReachable = 0,//沒有網路  
  3.     ReachableViaWiFi,//當前使用Wifi網路  
  4.     ReachableViaWWAN//使用的蜂窩網路  
  5. } NetworkStatus;  

4、獲取網路狀態的程式碼

  1. #pragma mark - 獲取網路狀態  
  2. +(NSString *)internetStatus {  
  3.     Reachability *reachability   = [Reachability reachabilityWithHostName:@"www.apple.com"];  
  4.     NetworkStatus internetStatus = [reachability currentReachabilityStatus];  
  5.     NSString *net = @"wifi";  
  6.     switch (internetStatus) {  
  7.         case ReachableViaWiFi:  
  8.             net = @"wifi";  
  9.             break;  
  10.         case ReachableViaWWAN:  
  11.             net = @"wwan";  
  12.             break;  
  13.         case NotReachable:  
  14.             net = @"notReachable";  
  15.         default:  
  16.             break;  
  17.     }  
  18.     return net;  
  19. }  


值得一提的是HostName改成"www.baidu.com"或者其他中國網站時經常會獲取網路狀態錯誤,不能得到正確的網路狀態。所以最好使用蘋果的網站“www.apple.com

這種方法是目前最普遍的使用方式,由於是蘋果官方demo,所以比較權威。但是這種方法的缺點是不能知道使用者使用的手機網路是2G、3G還是4G。

這樣就有了第二種獲取網路狀態的方法。

方法二:

這種方法通過監聽手機的statusbar的狀態還獲取使用者的網路狀態。可以通過蘋果的稽核在Appstore上架。程式碼量非常小,簡單易懂,最重要的是能區分2G、3G、4G、LTE。話不多說,直接上程式碼。

  1. + (NSString *)networkingStatesFromStatebar {  
  2.     // 狀態列是由當前app控制的,首先獲取當前app  
  3.     UIApplication *app = [UIApplication sharedApplication];  
  4.     NSArray *children = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];  
  5.     int type = 0;  
  6.     for (id child in children) {  
  7.         if ([child isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {  
  8.             type = [[child valueForKeyPath:@"dataNetworkType"] intValue];  
  9.         }  
  10.     }  
  11.     NSString *stateString = @"wifi";  
  12.     switch (type) {  
  13.         case 0:  
  14.             stateString = @"notReachable";  
  15.             break;  
  16.         case 1:  
  17.             stateString = @"2G";  
  18.             break;  
  19.         case 2:  
  20.             stateString = @"3G";  
  21.             break;  
  22.         case 3:  
  23.             stateString = @"4G";  
  24.             break;  
  25.         case 4:  
  26.             stateString = @"LTE";  
  27.             break;  
  28.         case 5:  
  29.             stateString = @"wifi";  
  30.             break;  
  31.         default:  
  32.             break;  
  33.     }  
  34.     return stateString;  
  35. }  


不過需要注意的是,使用這種方法時一定要保證statusbar沒有隱藏。如果你的App隱藏了statusbar,那麼你也就不能通過這種方法獲得網路狀態。