成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

詳解IOS判斷當(dāng)前網(wǎng)絡(luò)狀態(tài)的三種方法

瀏覽:79日期:2022-09-16 17:28:53

在項(xiàng)目中,為了好的用戶(hù)體驗(yàn),有些場(chǎng)景必須線(xiàn)判斷網(wǎng)絡(luò)狀態(tài),然后才能決定該干嘛。比如視頻播放,需要線(xiàn)判斷是Wifi還是4G,Wifi直接播放,4G先提示用戶(hù)。獲取網(wǎng)絡(luò)狀態(tài)的方法大概有三種:

1. Reachability

這是蘋(píng)果的官方演示demo中使用到的方法,我們可以到蘋(píng)果官方文檔里下載Demo(點(diǎn)擊左上角Download Sample Code 即可下載),然后把Demo里的Reachability.h和.m考到自己項(xiàng)目中,并在Build Phases 的 Link Binary 添加SystemConfiguration.framework框架,然后在需要使用的地方導(dǎo)入Reachability頭文件

在 Reachability頭文件中我們可以看到無(wú)網(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)用戶(hù)網(wǎng)絡(luò)為蜂窩網(wǎng)絡(luò)時(shí),是沒(méi)法判斷3G、4G等網(wǎng)絡(luò)類(lèi)型的,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 ]; //判斷具體類(lèi)型 break;case NotReachable: net = @'當(dāng)前無(wú)網(wǎng)路連接';default: break; } return net;}(2)當(dāng)用戶(hù)為手機(jī)自帶網(wǎng)絡(luò)時(shí),判斷具體網(wǎng)絡(luò)類(lèi)型

這時(shí)可以使用系統(tǒng)自帶的API來(lái)判斷是2G、3G還是4G,這就要使用到CTTelephonyNetworkInfo這類(lèi),記得在工程添加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ò)類(lèi)型有如下類(lèi)型:

CTRadioAccessTechnologyGPRS         //介于2G和3G之間,也叫2.5G ,過(guò)度技術(shù)

CTRadioAccessTechnologyEdge         //EDGE為GPRS到第三代移動(dòng)通信的過(guò)渡,EDGE俗稱(chēng)2.75G

CTRadioAccessTechnologyWCDMA

CTRadioAccessTechnologyHSDPA            //亦稱(chēng)為3.5G(3?G)

CTRadioAccessTechnologyHSUPA            //3G到4G的過(guò)度技術(shù)

CTRadioAccessTechnologyCDMA1x       //3G

CTRadioAccessTechnologyCDMAEVDORev0    //3G標(biāo)準(zhǔn)

CTRadioAccessTechnologyCDMAEVDORevA

CTRadioAccessTechnologyCDMAEVDORevB

CTRadioAccessTechnologyeHRPD        //電信使用的一種3G到4G的演進(jìn)技術(shù), 3.75G

CTRadioAccessTechnologyLTE          //接近4G

2. 通過(guò)系統(tǒng)statusBar判斷

這種方法在iPhone X 上可能引起奔潰,可能是蘋(píng)果修改了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. 通過(guò)AFNetworking

此方法可以寫(xiě)在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(@'沒(méi)網(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)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: IOS
相關(guān)文章: