iOS 獲取當前網絡狀態的兩種方法

獲取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和蜂窩網。

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

4、獲取網絡狀態的代碼

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

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

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

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


方法二:

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

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

不過需要注意的是,使用這種方法時一定要保證statusbar沒有隱藏。如果你的App隱藏了statusbar,那麼你也就不能通過這種方法獲得網絡狀態。
發佈了60 篇原創文章 · 獲贊 17 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章