獲取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和蜂窩網。
- typedef enum : NSInteger {
- NotReachable = 0,//沒有網絡
- ReachableViaWiFi,//當前使用Wifi網絡
- ReachableViaWWAN//使用的蜂窩網絡
- } NetworkStatus;
4、獲取網絡狀態的代碼
- #pragma mark - 獲取網絡狀態
- +(NSString *)internetStatus {
- Reachability *reachability = [Reachability reachabilityWithHostName:@"www.apple.com"];
- NetworkStatus internetStatus = [reachability currentReachabilityStatus];
- NSString *net = @"wifi";
- switch (internetStatus) {
- case ReachableViaWiFi:
- net = @"wifi";
- break;
- case ReachableViaWWAN:
- net = @"wwan";
- break;
- case NotReachable:
- net = @"notReachable";
- default:
- break;
- }
- return net;
- }
值得一提的是HostName改成"www.baidu.com"或者其他中國網站時經常會獲取網絡狀態錯誤,不能得到正確的網絡狀態。所以最好使用蘋果的網站“www.apple.com
”
這種方法是目前最普遍的使用方式,由於是蘋果官方demo,所以比較權威。但是這種方法的缺點是不能知道用戶使用的手機網絡是2G、3G還是4G。
這樣就有了第二種獲取網絡狀態的方法。
方法二:
這種方法通過監聽手機的statusbar的狀態還獲取用戶的網絡狀態。可以通過蘋果的審覈在Appstore上架。代碼量非常小,簡單易懂,最重要的是能區分2G、3G、4G、LTE。話不多說,直接上代碼。
- + (NSString *)networkingStatesFromStatebar {
- // 狀態欄是由當前app控制的,首先獲取當前app
- UIApplication *app = [UIApplication sharedApplication];
- NSArray *children = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
- int type = 0;
- for (id child in children) {
- if ([child isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
- type = [[child valueForKeyPath:@"dataNetworkType"] intValue];
- }
- }
- NSString *stateString = @"wifi";
- switch (type) {
- case 0:
- stateString = @"notReachable";
- break;
- case 1:
- stateString = @"2G";
- break;
- case 2:
- stateString = @"3G";
- break;
- case 3:
- stateString = @"4G";
- break;
- case 4:
- stateString = @"LTE";
- break;
- case 5:
- stateString = @"wifi";
- break;
- default:
- break;
- }
- return stateString;
- }
不過需要注意的是,使用這種方法時一定要保證statusbar沒有隱藏。如果你的App隱藏了statusbar,那麼你也就不能通過這種方法獲得網絡狀態。