在目前項(xiàng)目中,為了更好的用戶體驗(yàn)搞疗,有些場(chǎng)景下首先需要進(jìn)行當(dāng)前網(wǎng)絡(luò)狀態(tài)的判斷后,再執(zhí)行后續(xù)流程须肆。
例如:下載匿乃、音頻、視頻的播放等相關(guān)的一些操作前豌汇,首先需要對(duì)當(dāng)前用戶網(wǎng)絡(luò)環(huán)境進(jìn)行判斷幢炸,是 WiFi 還是 4G 等。
WiFi則可以繼續(xù)執(zhí)行后續(xù)操作流程拒贱,如果當(dāng)前網(wǎng)絡(luò)處于 4G 的情況下宛徊,需要使用流量才可執(zhí)行后續(xù)操作佛嬉,則應(yīng)提醒用戶是否執(zhí)行后續(xù)操作的提示,使得用戶體驗(yàn)效果更佳闸天。
一般常用獲取網(wǎng)絡(luò)狀態(tài)的方式如下:
一暖呕、Reachability
首先,蘋果官方提供了演示的 demo 中所用到的方法(飛機(jī)票:ReachabilityDemo)苞氮;
其次湾揽,將 demo 中 Reachability 的類導(dǎo)入至工程,并在 Build Phases -> Link Binary 中添加 SystemConfiguration.framework 框架笼吟;
最后库物,在需要使用的地方引入 Reachability 的頭文件并調(diào)用類中所提供的接口方法即可。
在 Reachability 頭文件中可得知網(wǎng)絡(luò)狀態(tài)的枚舉值贷帮,如下所示:
typedef enum : NSInteger {
NotReachable = 0,
ReachableViaWiFi,
ReachableViaWWAN
} NetworkStatus
獲取網(wǎng)絡(luò)狀態(tài)方法一:
#pragma mark - 獲取當(dāng)前網(wǎng)絡(luò)狀態(tài)
/**
* 獲取當(dāng)前網(wǎng)絡(luò)狀態(tài)
*
* 0:無(wú)網(wǎng)絡(luò) & 1:2G & 2:3G & 3:4G & 5:WIFI
*/
- (NSInteger)getCurrentNetworkState {
NSString *netWorkState = [[AFNetworkReachabilityManager sharedManager] localizedNetworkReachabilityStatusString];
/*
AFNetworkReachabilityStatusUnknown = -1,
AFNetworkReachabilityStatusNotReachable = 0,
AFNetworkReachabilityStatusReachableViaWWAN = 1,
AFNetworkReachabilityStatusReachableViaWiFi = 2,
*/
NSLog(@"NewWorkState --- %@", netWorkState);
if ([netWorkState isEqualToString:@"Unknow"] || [netWorkState isEqualToString:@"Not Reachable"]) {// 未知 或 無(wú)網(wǎng)絡(luò)
return 0;
}
else if ([netWorkState isEqualToString:@"Reachable via WWAN"]) {// 蜂窩數(shù)據(jù)
return 1;
}
else {// WiFi
return 2;
}
}
注:在 iOS7 之前戚揭,當(dāng)用戶網(wǎng)絡(luò)為蜂窩網(wǎng)絡(luò)時(shí),無(wú)法判斷 3G皿桑、4G 等網(wǎng)絡(luò)類型毫目,而在 iOS7 后則可以進(jìn)行該項(xiàng)判斷操作。
方法二:
- (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ú)網(wǎng)路連接";
default:
break;
}
return net;
}
此時(shí)可以使用自帶的 API 進(jìn)行判斷是 2G诲侮、3G镀虐、4G,但需要使用到CTTelephonyNetworkInfo 類沟绪。
當(dāng)用戶手機(jī)為自帶網(wǎng)絡(luò)時(shí)刮便,判斷具體網(wǎng)絡(luò)類型;
首先绽慈,需要在工程中添加 CoreTelephony.framework 框架恨旱;
其次,引入該類頭文件坝疼。
- (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 ,過(guò)度技術(shù)
CTRadioAccessTechnologyEdge //EDGE為GPRS到第三代移動(dòng)通信的過(guò)渡钝凶,EDGE俗稱2.75G
CTRadioAccessTechnologyWCDMA
CTRadioAccessTechnologyHSDPA //亦稱為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
二、通過(guò) statusBar 判斷
注:該方法在 iPhoneX 中運(yùn)行程序會(huì)導(dǎo)致程序 crash耕陷!初步判斷為蘋果官方將 statusBar 的 keyPath 內(nèi)參數(shù)變更所引起獲取數(shù)據(jù)結(jié)果集為 nil掂名,最終導(dǎo)致程序的 crash!坑坝茨=让铩!嗜诀!
#pragma mark - 獲取當(dāng)前網(wǎng)絡(luò)狀態(tài)
/**
* 獲取當(dāng)前網(wǎng)絡(luò)狀態(tài)
*
* 0:無(wú)網(wǎng)絡(luò) & 1:2G & 2:3G & 3:4G & 5:WIFI
*/
- (NSInteger)getCurrentNetworkState {
int type = 0;
NSArray *children = [[[kApplication valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
for (id child in children) {
if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
type = [[child valueForKeyPath:@"dataNetworkType"] intValue];
}
}
return type;
}
三猾警、通過(guò)第三方 AFNetworking
此方法通常使用在 AppDelegate 中孔祸,每當(dāng)網(wǎng)絡(luò)狀態(tài)發(fā)生改變時(shí)便會(huì)發(fā)送當(dāng)前變更狀態(tài),起到了實(shí)時(shí)監(jiān)控當(dāng)前網(wǎng)絡(luò)狀態(tài)變化的監(jiān)控操作肿嘲,有利于及時(shí)處理相關(guān)操作融击。
#pragma mark - ****************************** 網(wǎng)絡(luò)環(huán)境監(jiān)聽
/**
網(wǎng)絡(luò)環(huán)境監(jiān)聽
方法中基于 MBProgressHUD 的方法詳見類方法中筑公,GitHub 鏈接如下
(https://github.com/survivorsfyh/YHTools/blob/master/MBProgressHUD%2BYH.h)
(https://github.com/survivorsfyh/YHTools/blob/master/MBProgressHUD%2BYH.m)
*/
- (void)AFNReachability {
// 創(chuàng)建網(wǎng)絡(luò)監(jiān)聽管理者
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
// 監(jiān)聽網(wǎng)絡(luò)狀態(tài)
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"未知");
[MBProgressHUD showCommonHudWithAlertString:@"未知"
afterDelay:2.0
toView:self.window];
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"暫無(wú)網(wǎng)絡(luò)");
[MBProgressHUD showCommonHudWithAlertString:@"暫無(wú)網(wǎng)絡(luò)"
afterDelay:2.0
toView:self.window];
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"4G");
[MBProgressHUD showCommonHudWithAlertString:@"4G"
afterDelay:2.0
toView:self.window];
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"WIFI");
[MBProgressHUD showCommonHudWithAlertString:@"WiFi"
afterDelay:2.0
toView:self.window];
break;
default:
break;
}
if (status != AFNetworkReachabilityStatusNotReachable && !kStringIsEmpty([UserTableOperation getCurrentUserWithToken])) {// 有網(wǎng)了的情況下通知 bookShelf 檢測(cè) banner 是否存在
[kNotificationCenter postNotificationName:@"NoticeBookShelfCheckBanner" object:nil];
}
}];
// 開啟監(jiān)測(cè)
[manager startMonitoring];
}
注:方法三中 MBProgressHUD 的方法詳見 GitHub雳窟,鏈接如下:
聲明:GitHub 聲明類
實(shí)現(xiàn):GitHub 實(shí)現(xiàn)類
以上為此次分享的內(nèi)容,尤其方法二請(qǐng)慎用匣屡,真的坑封救!如有什么不周之處還請(qǐng)多多指點(diǎn),謝謝捣作!