詳解IOS判斷當(dāng)前網(wǎng)絡(luò)狀態(tài)的三種方法
在項(xiàng)目中,為了好的用戶體驗(yàn),有些場(chǎng)景必須線判斷網(wǎng)絡(luò)狀態(tài),然后才能決定該干嘛。比如視頻播放,需要線判斷是Wifi還是4G,Wifi直接播放,4G先提示用戶。獲取網(wǎng)絡(luò)狀態(tài)的方法大概有三種:
1. Reachability
這是蘋果的官方演示demo中使用到的方法,我們可以到蘋果官方文檔里下載Demo(點(diǎn)擊左上角Download Sample Code 即可下載),然后把Demo里的Reachability.h和.m考到自己項(xiàng)目中,并在Build Phases 的 Link Binary 添加SystemConfiguration.framework框架,然后在需要使用的地方導(dǎo)入Reachability頭文件
在 Reachability頭文件中我們可以看到無網(wǎng)絡(luò),wifi和蜂窩網(wǎng)三個(gè)網(wǎng)絡(luò)狀態(tài)的枚舉值,如下:
typedef enum : NSInteger { NotReachable = 0, ReachableViaWiFi, ReachableViaWWAN } NetworkStatus;
(1)獲取網(wǎng)絡(luò)狀態(tài)
在iOS 7之前,當(dāng)用戶網(wǎng)絡(luò)為蜂窩網(wǎng)絡(luò)時(shí),是沒法判斷3G、4G等網(wǎng)絡(luò)類型的,iOS 7 后是可以判斷的
(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 = @"蜂窩數(shù)據(jù)"; //net = [self getNetType ]; //判斷具體類型 break; case NotReachable: net = @"當(dāng)前無網(wǎng)路連接"; default: break; } return net; }
(2)當(dāng)用戶為手機(jī)自帶網(wǎng)絡(luò)時(shí),判斷具體網(wǎng)絡(luò)類型
這時(shí)可以使用系統(tǒng)自帶的API來判斷是2G、3G還是4G,這就要使用到CTTelephonyNetworkInfo這類,記得在工程添加CoreTelephony.framework,并導(dǎo)入頭文件
- (NSString *)getNetType { CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init]; NSString *currentStatus = info.currentRadioAccessTechnology; if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyGPRS"]) { netconnType = @"GPRS"; }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyEdge"]) { netconnType = @"2.75G EDGE"; }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyWCDMA"]){ netconnType = @"3G"; }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyHSDPA"]){ netconnType = @"3.5G HSDPA"; }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyHSUPA"]){ netconnType = @"3.5G HSUPA"; }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMA1x"]){ netconnType = @"2G"; }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMAEVDORev0"]){ netconnType = @"3G"; }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMAEVDORevA"]){ netconnType = @"3G"; }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMAEVDORevB"]){ netconnType = @"3G"; }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyeHRPD"]){ netconnType = @"HRPD"; }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyLTE"]){ netconnType = @"4G"; } }
用此方法判斷的蜂窩網(wǎng)絡(luò)類型有如下類型:
CTRadioAccessTechnologyGPRS //介于2G和3G之間,也叫2.5G ,過度技術(shù)
CTRadioAccessTechnologyEdge //EDGE為GPRS到第三代移動(dòng)通信的過渡,EDGE俗稱2.75G
CTRadioAccessTechnologyWCDMA
CTRadioAccessTechnologyHSDPA //亦稱為3.5G(3?G)
CTRadioAccessTechnologyHSUPA //3G到4G的過度技術(shù)
CTRadioAccessTechnologyCDMA1x //3G
CTRadioAccessTechnologyCDMAEVDORev0 //3G標(biāo)準(zhǔn)
CTRadioAccessTechnologyCDMAEVDORevA
CTRadioAccessTechnologyCDMAEVDORevB
CTRadioAccessTechnologyeHRPD //電信使用的一種3G到4G的演進(jìn)技術(shù), 3.75G
CTRadioAccessTechnologyLTE //接近4G
2. 通過系統(tǒng)statusBar判斷
這種方法在iPhone X 上可能引起奔潰,可能是蘋果修改了statusBar的keyPath,所以拿到的東西為nil,導(dǎo)致崩潰//獲取當(dāng)前網(wǎng)絡(luò)狀態(tài) (iPhone X 上可能引發(fā)崩潰)
+ (NSString *)networkingStatesFromStatebar { // 狀態(tài)欄是由當(dāng)前app控制的,首先獲取當(dāng)前app UIApplication *app = [UIApplication sharedApplication]; //iphone X 會(huì)在這里崩潰 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; }
3. 通過AFNetworking
此方法可以寫在AppDelegate中,每當(dāng)網(wǎng)絡(luò)狀態(tài)發(fā)生變化時(shí),就可以發(fā)通知,實(shí)時(shí)監(jiān)測(cè)網(wǎng)絡(luò)變化,然后做相應(yīng)的處理
#pragma mark - ------------- 監(jiān)測(cè)網(wǎng)絡(luò)狀態(tài) ------------- - (void)monitorNetworking { [[AFNetworkReachabilityManager sharedManager] startMonitoring]; [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { switch (status) { case -1: NSLog(@"未知網(wǎng)絡(luò)"); break; case 0: NSLog(@"網(wǎng)絡(luò)不可達(dá)"); break; case 1: { NSLog(@"GPRS網(wǎng)絡(luò)"); //發(fā)通知,帶頭搞事 [[NSNotificationCenter defaultCenter] postNotificationName:@"monitorNetworking" object:@"1" userInfo:nil]; } break; case 2: { NSLog(@"wifi網(wǎng)絡(luò)"); //發(fā)通知,搞事情 [[NSNotificationCenter defaultCenter] postNotificationName:@"monitorNetworking" object:@"2" userInfo:nil]; } break; default: break; } if (status == AFNetworkReachabilityStatusReachableViaWWAN || status == AFNetworkReachabilityStatusReachableViaWiFi) { NSLog(@"有網(wǎng)"); }else{ NSLog(@"沒網(wǎng)"); } }]; }
以上就是詳解IOS判斷當(dāng)前網(wǎng)絡(luò)狀態(tài)的三種方法的詳細(xì)內(nèi)容,更多關(guān)于IOS判斷當(dāng)前網(wǎng)絡(luò)狀態(tài)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android NavigationController 右滑手勢(shì)詳解
目前蘋果手機(jī)在人機(jī)交互中盡力做到極致,在ios7中,新增了一個(gè)小小功能,用戶不用點(diǎn)擊右上角的返回按鈕,在屏幕左邊一滑,就會(huì)返回。下面給大家詳解Android NavigationController 右滑手勢(shì),需要的朋友可以參考下2015-08-08iOS開發(fā)中使用Quartz2D繪制上下文棧和矩陣的方法
這篇文章主要介紹了iOS開發(fā)中使用Quartz2D繪制上下文棧和矩陣的方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-11-11Xcode8下iOS10常見報(bào)錯(cuò)閃退,字體適配和編譯不過的問題及解決方案
蘋果推送了iOS10,好多朋友迅速即將系統(tǒng)升級(jí)了ios10,然后遇到好多問題。下面小編給針對(duì)遇到的問題給大家介紹解決方法,希望對(duì)大家有所幫助,感興趣的朋友可以參考下2016-09-09ios 實(shí)現(xiàn)倒計(jì)時(shí)的兩種方式
這篇文章主要介紹了ios實(shí)現(xiàn)倒計(jì)時(shí)的兩種方式,第一種方式使用NSTimer來實(shí)現(xiàn),第二種方式使用GCD來實(shí)現(xiàn)。具體內(nèi)容詳情大家參考下本文2017-01-01iOS開發(fā)筆記--詳解UILabel的相關(guān)屬性設(shè)置
這篇文章主要介紹了iOS開發(fā)筆記--詳解UILabel的相關(guān)屬性設(shè)置,對(duì)初學(xué)者具有一定的參考價(jià)值,有需要的可以了解一下。2016-11-11