亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS中如何判斷當前網絡環境是2G/3G/4G/5G/WiFi

2020-07-26 02:19:30
字體:
來源:轉載
供稿:網友

前言

5G 什么的,還得等蘋果API更新啊,不過將來還是這個處理過程就是了。

關于判斷當前的網絡環境是2G/3G/4G,這個問題以前經??吹?,最近在一工程里看到了如果判斷的API。而在擼WebRTC音視頻通話的時候,看到了Demo中將SCNetworkReachability與其結合,當網絡環境改變時,判斷當前連接的是什么網絡環境,寫法欠佳(因為將其與WebRTC的其他邏輯柔和在了一個類)。其實只需要將官方的Reachability做一下改進即可。

如何判斷當前的網絡環境

我們可以利用#import <CoreTelephony/CTTelephonyNetworkInfo.h>框架下的一些API來判斷當前的網絡。

先來看一下該框架下的一些常量定義:

CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyGPRS   __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyEdge   __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyWCDMA   __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyHSDPA   __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyHSUPA   __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMA1x  __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORev0 __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORevA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORevB __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyeHRPD   __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyLTE   __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);

這不就是2G/3G/4G等網絡環境么?我想等5G普及之后,蘋果肯定也會加入代表5G的常量定義的。

先看隨手寫的一個網絡環境判斷:

- (void)networkStatus{ NSArray *typeStrings2G = @[CTRadioAccessTechnologyEdge,        CTRadioAccessTechnologyGPRS,        CTRadioAccessTechnologyCDMA1x];  NSArray *typeStrings3G = @[CTRadioAccessTechnologyHSDPA,        CTRadioAccessTechnologyWCDMA,        CTRadioAccessTechnologyHSUPA,        CTRadioAccessTechnologyCDMAEVDORev0,        CTRadioAccessTechnologyCDMAEVDORevA,        CTRadioAccessTechnologyCDMAEVDORevB,        CTRadioAccessTechnologyeHRPD];  NSArray *typeStrings4G = @[CTRadioAccessTechnologyLTE];  if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {  CTTelephonyNetworkInfo *teleInfo= [[CTTelephonyNetworkInfo alloc] init];  NSString *accessString = teleInfo.currentRadioAccessTechnology;  if ([typeStrings4G containsObject:accessString]) {   NSLog(@"4G網絡");  } else if ([typeStrings3G containsObject:accessString]) {   NSLog(@"3G網絡");  } else if ([typeStrings2G containsObject:accessString]) {   NSLog(@"2G網絡");  } else {   NSLog(@"未知網絡");  } } else {  NSLog(@"未知網絡"); }}

代碼中的currentRadioAccessTechnology是iOS 7之后新加的API。

改進Reachability

在iOS應用中的使用場景肯定不是主動獲取,應該是網絡產生變化的時候,自動給出通知等,然后做一些相應的處理。下面我們就自己擼一個Reachability,然后給出當前的網絡環境。

我們都知道,使用Reachability時,如果網絡變化,會給出一個通知,但是我們獲取的網絡狀態只有WiFi/WWAN/NotReach幾種。我們可以在Reachability返回的通知里,WWAN這種類型下,再做上面的網絡判斷即可。但是更優的做法就將判斷放在Reachability中,在使用的時候直接返回不同的網絡狀態。

由于最新的Reachability已經支持了IPV6,我也是在最新的Reachability上做了一些改進。

大部分方法跟Reachability一樣,我擴展了枚舉類型,修改了網絡狀態判斷。

主要修改如下:

typedef NS_ENUM(NSUInteger, HLNetWorkStatus) {  HLNetWorkStatusNotReachable = 0,  HLNetWorkStatusUnknown = 1,  HLNetWorkStatusWWAN2G = 2,  HLNetWorkStatusWWAN3G = 3,  HLNetWorkStatusWWAN4G = 4,    HLNetWorkStatusWiFi = 9,};

這里是網絡類型判斷的修改:

- (HLNetWorkStatus)networkStatusForFlags:(SCNetworkReachabilityFlags)flags{  if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)  {    // The target host is not reachable.    return HLNetWorkStatusNotReachable;  }    HLNetWorkStatus returnValue = HLNetWorkStatusNotReachable;  if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)  {    /*     If the target host is reachable and no connection is required then we'll assume (for now) that you're on Wi-Fi...     */    returnValue = HLNetWorkStatusWiFi;  }    if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||     (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))  {    /*     ... and the connection is on-demand (or on-traffic) if the calling application is using the CFSocketStream or higher APIs...     */        if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)    {      /*       ... and no [user] intervention is needed...       */      returnValue = HLNetWorkStatusWiFi;    }  }    if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)  {    /*     ... but WWAN connections are OK if the calling application is using the CFNetwork APIs.     */    NSArray *typeStrings2G = @[CTRadioAccessTechnologyEdge,              CTRadioAccessTechnologyGPRS,              CTRadioAccessTechnologyCDMA1x];        NSArray *typeStrings3G = @[CTRadioAccessTechnologyHSDPA,              CTRadioAccessTechnologyWCDMA,              CTRadioAccessTechnologyHSUPA,              CTRadioAccessTechnologyCDMAEVDORev0,              CTRadioAccessTechnologyCDMAEVDORevA,              CTRadioAccessTechnologyCDMAEVDORevB,              CTRadioAccessTechnologyeHRPD];        NSArray *typeStrings4G = @[CTRadioAccessTechnologyLTE];    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {      CTTelephonyNetworkInfo *teleInfo= [[CTTelephonyNetworkInfo alloc] init];      NSString *accessString = teleInfo.currentRadioAccessTechnology;      if ([typeStrings4G containsObject:accessString]) {        return HLNetWorkStatusWWAN4G;      } else if ([typeStrings3G containsObject:accessString]) {        return HLNetWorkStatusWWAN3G;      } else if ([typeStrings2G containsObject:accessString]) {        return HLNetWorkStatusWWAN2G;      } else {        return HLNetWorkStatusUnknown;      }    } else {      return HLNetWorkStatusUnknown;    }  }  return returnValue;}

改進后的Reachability用法

為了便于使用,盡量按照Reachability的做法來處理,所以用法與之前沒什么太大區別,就換了個通知而已。

  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kNetWorkReachabilityChangedNotification object:nil];    HLNetWorkReachability *reachability = [HLNetWorkReachability reachabilityWithHostName:@"www.baidu.com"];  self.hostReachability = reachability;  [reachability startNotifier];// 通知處理- (void)reachabilityChanged:(NSNotification *)notification{  HLNetWorkReachability *curReach = [notification object];  HLNetWorkStatus netStatus = [curReach currentReachabilityStatus];  switch (netStatus) {    case HLNetWorkStatusNotReachable:      NSLog(@"網絡不可用");      break;    case HLNetWorkStatusUnknown:      NSLog(@"未知網絡");      break;    case HLNetWorkStatusWWAN2G:      NSLog(@"2G網絡");      break;    case HLNetWorkStatusWWAN3G:      NSLog(@"3G網絡");      break;    case HLNetWorkStatusWWAN4G:      NSLog(@"4G網絡");      break;    case HLNetWorkStatusWiFi:      NSLog(@"WiFi");      break;          default:      break;  }}

完整Demo地址:HLNetWorkReachability (本地下載)。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美国产成人| 国产精品久久久久久av| 91精品久久久久久久久青青| 欧美整片在线观看| 影音先锋欧美在线资源| 久久精品人人做人人爽| 欧美一级大片视频| 亚洲japanese制服美女| 欧美日韩裸体免费视频| 欧美日韩亚洲91| 国产不卡在线观看| 亚洲天堂男人天堂| 欧美日韩国内自拍| 亚洲图片制服诱惑| 国产精品观看在线亚洲人成网| 久久精品视频在线| 性金发美女69hd大尺寸| 国产精品电影久久久久电影网| 精品久久久久久久久久ntr影视| 福利一区视频在线观看| 亚洲一区二区三区香蕉| 亚洲国产又黄又爽女人高潮的| 欧美成年人视频网站欧美| 亚洲香蕉av在线一区二区三区| 这里只有精品丝袜| 国产精品欧美亚洲777777| 日av在线播放中文不卡| 97精品在线观看| 欧美亚洲成人网| 欧美日韩午夜激情| 日韩在线www| 欧美激情二区三区| 亚洲欧美国产日韩中文字幕| 亚洲图片欧美午夜| 国产欧美日韩视频| 日韩av免费一区| 精品国产91久久久| 久久影视电视剧免费网站清宫辞电视| 一区二区欧美久久| 久久久久久久91| 久久久久久久久久久av| 庆余年2免费日韩剧观看大牛| 国产欧美日韩中文字幕在线| 日韩电影视频免费| 国产91对白在线播放| 国产精品中文字幕在线观看| 日韩在线观看成人| 日韩精品视频免费| 亚洲欧美国产精品va在线观看| 亚洲一区二区三区视频| 国产成人综合久久| 色偷偷av一区二区三区| 国产91精品久| 一区二区欧美日韩视频| 成人羞羞国产免费| 久久精品国产成人精品| 国产精品久久久久久久久久新婚| 国产成人精品视频在线观看| 欧美第一页在线| 欧美国产日韩中文字幕在线| 最近免费中文字幕视频2019| 92看片淫黄大片看国产片| 精品国产91久久久久久老师| 欧美午夜精品久久久久久浪潮| 久久久久中文字幕2018| 91亚洲精品在线观看| 伊人男人综合视频网| 精品久久久久久久久久国产| 日韩欧美精品中文字幕| 高清日韩电视剧大全免费播放在线观看| 综合激情国产一区| 精品国产91久久久| 亚洲成人久久网| 黑人与娇小精品av专区| 少妇av一区二区三区| 色多多国产成人永久免费网站| 精品女同一区二区三区在线播放| 国产大片精品免费永久看nba| 成人激情综合网| 久久福利视频网| 亚洲精品国产成人| 国产成人精品久久二区二区91| 日韩av免费一区| 欧美成人剧情片在线观看| 国产欧美在线播放| 亚洲欧美日本另类| 日韩中文av在线| 麻豆国产精品va在线观看不卡| 国产精品久久久久久久久久久久久久| 亚洲a在线观看| 欧美视频一二三| 中文精品99久久国产香蕉| 91九色国产社区在线观看| 一区二区成人精品| 97视频色精品| 久久久国产精品视频| 欧美日韩裸体免费视频| 欧美视频在线视频| 日韩精品欧美国产精品忘忧草| 亚洲成人av资源网| 成人性生交xxxxx网站| 日韩电视剧在线观看免费网站| 久久久之久亚州精品露出| 国产精品一二区| 亚洲精品国产欧美| 久久精品视频免费播放| 国产精品日韩在线| 久久久日本电影| 国产97在线播放| 日韩av免费看网站| 国产欧美韩国高清| 久久久亚洲网站| 日韩免费精品视频| 欧美日韩人人澡狠狠躁视频| 亚洲少妇激情视频| 久久伊人免费视频| 久久久久久91香蕉国产| 欧美视频在线视频| 欧美国产乱视频| 亚洲成年网站在线观看| 久久国产精品偷| 国产欧洲精品视频| 中文字幕日韩av| 亚洲男人第一网站| 国产一区二区三区久久精品| 亚洲国产精品大全| 欧美性猛交xxxx乱大交| 国产精品aaa| 亚洲精品影视在线观看| 国产专区欧美专区| 成人免费淫片视频软件| 色综合天天狠天天透天天伊人| 久久噜噜噜精品国产亚洲综合| 亚洲精品动漫100p| 国产视频精品在线| 欧美激情影音先锋| 国产精品高潮粉嫩av| 亚洲性69xxxbbb| 最新的欧美黄色| 狠狠久久亚洲欧美专区| 日韩一区二区久久久| 91理论片午午论夜理片久久| 日韩中文字幕欧美| 欧美大学生性色视频| 日韩有码在线视频| 97欧美精品一区二区三区| 亚洲成人av在线| 亚洲跨种族黑人xxx| 日韩精品免费在线视频| 亚洲香蕉av在线一区二区三区| 日韩va亚洲va欧洲va国产| 色偷偷av一区二区三区乱| 久久精品福利视频| 亚洲影院在线看| 欧美电影在线免费观看网站| 国产精品久久久一区| 疯狂蹂躏欧美一区二区精品| 岛国视频午夜一区免费在线观看| 亚洲在线一区二区| 这里只有精品视频| 狠狠躁夜夜躁人人爽天天天天97| 久久99青青精品免费观看| 欧美一级大胆视频| 精品视频9999|