目前我们获取手机网络类型主要还是用的 AFNetwork

但是AFNetwork有个问题就是类型不够充分,只能四种类型

typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {AFNetworkReachabilityStatusUnknown          = -1,AFNetworkReachabilityStatusNotReachable     = 0,AFNetworkReachabilityStatusReachableViaWWAN = 1,AFNetworkReachabilityStatusReachableViaWiFi = 2,
};
  1. AFNetworkReachabilityStatusUnknown 未知网络
  2. AFNetworkReachabilityStatusNotReachable 无网络
  3. AFNetworkReachabilityStatusReachableViaWWAN 蜂窝移动网络
  4. AFNetworkReachabilityStatusReachableViaWiFi WIFI

具体获取代码如下

/**监测网络类型*/
-(void)configReachabilityStatusByAFNetwork {AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {[MyAppConfigModel sharedSingleton].netWorkReachabilityStatus = status;switch (status) {case AFNetworkReachabilityStatusUnknown:NSLog(@"⚠️⚠️⚠️⚠️⚠️⚠️⚠️当前网络:未知");break;case AFNetworkReachabilityStatusNotReachable:NSLog(@"⚠️⚠️⚠️⚠️⚠️⚠️⚠️当前网络:网络无连接\n请检查网络");break;case AFNetworkReachabilityStatusReachableViaWWAN:NSLog(@"⚠️⚠️⚠️⚠️⚠️⚠️⚠️当前网络:3G|4G");break;case AFNetworkReachabilityStatusReachableViaWiFi:NSLog(@"⚠️⚠️⚠️⚠️⚠️⚠️⚠️当前网络:WiFi");break;default:break;}}];
}

那么 如何获取蜂窝移动网络的具体类型呢?
这里就需要用到

#import <CoreTelephony/CoreTelephonyDefines.h>
#import <CoreTelephony/CTCarrier.h>
#import <CoreTelephony/CTTelephonyNetworkInfo.h>

具体代码如下


+ (NSInteger)getDeviceNetWorkingStatus{NSString *state = [[NSString alloc] init];NSInteger stateType = 0;AFNetworkReachabilityStatus netWorkReachabilityStatus =  [MyAppConfigModel sharedSingleton].netWorkReachabilityStatus;switch (netWorkReachabilityStatus) {case AFNetworkReachabilityStatusUnknown:state = @"无网络";stateType = 5;break;case AFNetworkReachabilityStatusNotReachable:state = @"无网络";stateType = 5;break;case AFNetworkReachabilityStatusReachableViaWWAN:{NSArray *typeStrings2G = @[CTRadioAccessTechnologyEdge,CTRadioAccessTechnologyGPRS,CTRadioAccessTechnologyCDMA1x];NSArray *typeStrings3G = @[CTRadioAccessTechnologyHSDPA,CTRadioAccessTechnologyWCDMA,CTRadioAccessTechnologyHSUPA,CTRadioAccessTechnologyCDMAEVDORev0,CTRadioAccessTechnologyCDMAEVDORevA,CTRadioAccessTechnologyCDMAEVDORevB,CTRadioAccessTechnologyeHRPD];NSArray *typeStrings4G = @[CTRadioAccessTechnologyLTE];CTTelephonyNetworkInfo *teleInfo= [[CTTelephonyNetworkInfo alloc] init];NSString *accessString = teleInfo.currentRadioAccessTechnology;if ([typeStrings4G containsObject:accessString]) {state = @"4G";stateType = 2;} else if ([typeStrings3G containsObject:accessString]) {state = @"3G";stateType = 3;} else if ([typeStrings2G containsObject:accessString]) {state = @"2G";stateType = 4;} else {state = @"无网络";stateType = 5;}}break;case AFNetworkReachabilityStatusReachableViaWiFi:state = @"WIFI";stateType = 1;break;default:state = @"无网络";stateType = 5;break;}NSLog(@"当前网络网络状态 %@",state);return stateType;
}

昨天在判断网络的发现发现xcode12竟然没有5G相关的key,今天升级到Xcode12.1发现多了CTRadioAccessTechnologyNRNSACTRadioAccessTechnologyNR

NRNew Radio的缩写,新无线(5G)的意思,
NRNSA表示5G NR的非独立组网(NSA)模式
具体解释可看5G新无线

网络判断使用了Reachability

方式一:通过CoreTelephony获取网络状态

引入头文件

#import "Reachability.h"
#import <CoreTelephony/CTCarrier.h>
#import <CoreTelephony/CTTelephonyNetworkInfo.h>

开始网络判断:

+ (NSString *)networkStatus{Reachability *reachability   = [Reachability reachabilityWithHostName:@"www.apple.com"];NetworkStatus internetStatus = [reachability currentReachabilityStatus];NSString *net = @"WIFI";switch (internetStatus) {case ReachableViaWiFi:net = @"WIFI";break;case ReachableViaWWAN:net = [self getNetType];   //判断具体类型break;case NotReachable:net = @"当前无网路连接";default:break;}NSLog(@"net is %@", net);return net;
}+ (NSString *)getNetType
{CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];/// 注意:没有SIM卡,值为空NSString *currentStatus;NSString *currentNet = @"5G";if (@available(iOS 12.1, *)) {if (info && [info respondsToSelector:@selector(serviceCurrentRadioAccessTechnology)]) {NSDictionary *radioDic = [info serviceCurrentRadioAccessTechnology];if (radioDic.allKeys.count) {currentStatus = [radioDic objectForKey:radioDic.allKeys[0]];}}}else{currentStatus = info.currentRadioAccessTechnology;}if ([currentStatus isEqualToString:CTRadioAccessTechnologyGPRS]) {currentNet = @"GPRS";}else if ([currentStatus isEqualToString:CTRadioAccessTechnologyEdge]) {currentNet = @"2.75G EDGE";}else if ([currentStatus isEqualToString:CTRadioAccessTechnologyWCDMA]){currentNet = @"3G";}else if ([currentStatus isEqualToString:CTRadioAccessTechnologyHSDPA]){currentNet = @"3.5G HSDPA";}else if ([currentStatus isEqualToString:CTRadioAccessTechnologyHSUPA]){currentNet = @"3.5G HSUPA";}else if ([currentStatus isEqualToString:CTRadioAccessTechnologyCDMA1x]){currentNet = @"2G";}else if ([currentStatus isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0]){currentNet = @"3G";}else if ([currentStatus isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA]){currentNet = @"3G";}else if ([currentStatus isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]){currentNet = @"3G";}else if ([currentStatus isEqualToString:CTRadioAccessTechnologyeHRPD]){currentNet = @"HRPD";}else if ([currentStatus isEqualToString:CTRadioAccessTechnologyLTE]){currentNet = @"4G";}else if (@available(iOS 14.1, *)) {if ([currentStatus isEqualToString:CTRadioAccessTechnologyNRNSA]){currentNet = @"5G NSA";}else if ([currentStatus isEqualToString:CTRadioAccessTechnologyNR]){currentNet = @"5G";}}return currentNet;
}

鉴于评论区反馈iOS14.0.1对5G判断产生的崩溃,这里5G的判断从14.1开始判断(独白:但是官方写着就是14.0,真是个左右为难的问题~)

方式二:通过状态栏获取网络状态(不推荐)

因为私有属性在之后的版本会被取消,不推荐这种方式

- (NSString *)getNetStatusByStatusBar{@try {NSArray *children;UIApplication *app = [UIApplication sharedApplication];NSString *state;// 全屏if ([[app valueForKeyPath:@"_statusBar"] isKindOfClass:NSClassFromString(@"UIStatusBar_Modern")]) {children = [[[[app valueForKeyPath:@"_statusBar"] valueForKeyPath:@"_statusBar"] valueForKeyPath:@"foregroundView"] subviews];for (UIView *view in children) {for (id child in view.subviews) {//wifiif ([child isKindOfClass:NSClassFromString(@"_UIStatusBarWifiSignalView")]) {state = @"wifi";}//2G 3G 4Gif ([child isKindOfClass:NSClassFromString(@"_UIStatusBarStringView")]) {if ([[child valueForKey:@"_originalText"] containsString:@"G"]) {state = [child valueForKey:@"_originalText"];}}}}}else {children = [[[app valueForKeyPath:@"_statusBar"] valueForKeyPath:@"foregroundView"] subviews];for (id child in children) {if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {//获取到状态栏switch ([[child valueForKeyPath:@"dataNetworkType"] intValue]) {case 0:state = @"无网络";//无网模式break;case 1:state = @"2G";break;case 2:state = @"3G";break;case 3:state = @"4G";break;case 5:state = @"wifi";break;default:break;}}}}return state;}@catch (NSException * __unused exception) {}
}

以下是项目中获取设备网络类型的代码:

//设备网络类型:Unknown=0; Wifi=1; 2G=2; 3G=3; 4G=4; 5G=5

-(NSInteger)connType{

NSString *state = [[NSString alloc] init];

NSInteger stateType = 0;

AFNetworkReachabilityStatus netWorkReachabilityStatus =  [AFNetworkReachabilityManager sharedManager].networkReachabilityStatus;

switch (netWorkReachabilityStatus) {

case AFNetworkReachabilityStatusUnknown:

state = @"无网络";

stateType = 0;

break;

case AFNetworkReachabilityStatusNotReachable:

state = @"无网络";

stateType = 0;

break;

case AFNetworkReachabilityStatusReachableViaWWAN:

{

NSArray *typeStrings2G = @[CTRadioAccessTechnologyEdge,

CTRadioAccessTechnologyGPRS,

CTRadioAccessTechnologyCDMA1x];

NSArray *typeStrings3G = @[CTRadioAccessTechnologyHSDPA,

CTRadioAccessTechnologyWCDMA,

CTRadioAccessTechnologyHSUPA,

CTRadioAccessTechnologyCDMAEVDORev0,

CTRadioAccessTechnologyCDMAEVDORevA,

CTRadioAccessTechnologyCDMAEVDORevB,

CTRadioAccessTechnologyeHRPD];

NSArray *typeStrings4G = @[CTRadioAccessTechnologyLTE];

NSArray *typeStrings5G;

if (@available(iOS 14.1, *)) {

typeStrings5G = @[CTRadioAccessTechnologyNRNSA,CTRadioAccessTechnologyNR];

}

CTTelephonyNetworkInfo *teleInfo= [[CTTelephonyNetworkInfo alloc] init];

NSString *accessString = teleInfo.currentRadioAccessTechnology;

if (@available(iOS 14.1, *)) {

if ([typeStrings5G containsObject:accessString]) {

state = @"5G";

stateType = 5;

}

}

if ([typeStrings4G containsObject:accessString]) {

state = @"4G";

stateType = 4;

} else if ([typeStrings3G containsObject:accessString]) {

state = @"3G";

stateType = 3;

} else if ([typeStrings2G containsObject:accessString]) {

state = @"2G";

stateType = 2;

} else {

state = @"无网络";

stateType = 0;

}

}

break;

case AFNetworkReachabilityStatusReachableViaWiFi:

state = @"WIFI";

stateType = 1;

break;

default:

state = @"无网络";

stateType = 0;

break;

}

NSLog(@"当前网络网络状态 %@",state);

return stateType;

}

获取iPhone/iPad设备网络类型(2G,3G,4G,5G,WIFI)相关推荐

  1. 1G,2G,3G,4G,5G有什么区别?5G的优势在哪?有什么应用?

    目录 1G,2G,3G,4G,5G的区别 5G的应用 5G技术的突出特点 5G技术在物联网领域的广阔应用前景 5G在自动驾驶领域的应用 1G,2G,3G,4G,5G的区别 1G,2G,3G,4G和5G ...

  2. 什么是1G/2G/3G/4G/5G

    什么是1G/2G/3G/4G/5G 参考:http://www.360doc.com/content/14/1213/22/5458405_432718054.shtml 介绍 1G:表示第一代移动通 ...

  3. 检查SIM卡当前环境是否支持2G/3G/4G/5G

    我的是小米手机,就以小米为例子 设置 移动网络SIM卡信息 网络类型选择 选择2G/3G/4G/5G

  4. 关于物联网2G/3G/4G/5G/NB模组开机后模组AT指令无反应/模块开机失败/模块开机不响应AT指令等问题

    一.背景 近些年物联网行业如日中天,越来越多的设备需要接入网络平台.因此无线通信模组便成为了连接物联网感知层和网络层的关键环节,属于底层硬件环节,具备其不可替代性,且无线通信模块与物联网终端存在一一对 ...

  5. NSA组网下2G/3G/4G/5G系统协同策略的研究

    [摘  要]从NSA组网原理出发,以中国移动的现网实际情况和需求为例,通过分析不同系统的特点,探讨了NSA模式下2G/3G/4G/5G组网下不同网络间的协同策略.经测试验证,该套策略对5G网络的覆盖. ...

  6. 一文让你读懂——什么是1G,2G,3G,4G,5G

    一文让你读懂--什么是1G,2G,3G,4G,5G 无线通信日新月异,现在我们已经进入到了5G时代.5G代表了更快的速度,更低的延时,更多的链接数,它在人们的生活中所占有的比重和所起的作用越来越大.那 ...

  7. 中国电信频段测试软件,中国四大运营商2G/3G/4G/5G工作频率以及网络制式

    原标题:中国四大运营商2G/3G/4G/5G工作频率以及网络制式 中国四大运营商2G/3G/4G/5G工作频率以及网络制式,值得收藏! 中国移动 1. 900MHz(Band8),889~904/93 ...

  8. 技术至简-7:2G/3G/4G/5G基站系统中混合调制的技术框架

    2G/3G/4G/5G基站系统并非采用单一的调制技术,是数字调制和模拟调制的综合,是QAM调制与IQ调制的综合,是幅度调制与相位调制的综合. 1. 调制模型 在此模型中,包含了三种调制: (1)数字基 ...

  9. 2G 3G 4G 5G 基站覆盖范围

    2G基站的覆盖半径约为5-10公里 3G基站的覆盖半径约为2-5公里 4G基站的覆盖半径约为1-3公里 5G基站的覆盖半径约为100-300米 原文链接:2G 3G 4G 5G 基站覆盖距离

最新文章

  1. 使用Codeception进行Yii2的单元测试(一)安装以及简介篇
  2. java 反射 json_java 反射机制构建JSON字符串
  3. Java基础——Arrays工具类的使用
  4. 【连载】如何掌握openGauss数据库核心技术?秘诀四:拿捏事务机制(2)
  5. UE3 Light Functions (光照函数)
  6. DanmuManager 一个简单的弹幕工具
  7. 8.Postman中发送请求被拦截(证书问题)
  8. CNN是如何一层一层'理解'图像信息的
  9. [MetalKit]37-Using-ARKit-with-Metal使用ARKit与Metal
  10. 深入浅出WPF(一)
  11. 编码 - ASCII码表
  12. 站长说说之SEO流量翻倍增长的秘密
  13. 从中序与后序遍历序列构造二叉树
  14. C/S架构的优点和缺点
  15. 接受数据的php文件源码,PHP文件上传源码分析(RFC1867)
  16. gpuz怎么看显存颗粒
  17. H5静态网页设计与制作_川西旅游网设计作品(HTML+CSS+jQuery)
  18. 杨辉三角形延伸(菱形)
  19. 电脑英语--著名软件篇
  20. 变量的存储方式和生存期

热门文章

  1. 一帘幽梦——培养优秀
  2. 12. 对日企4年的简单反省
  3. 17岁男孩跳下高架桥死亡:你在等父母道歉,父母在等你认错
  4. android 光晕效果,【转】七、android图片特效处理之光晕效果
  5. JVM工具之jmap命令使用
  6. Win10 共享文件夹相关操作(以及设置用户和密码)
  7. ubuntu一键安装msf
  8. Word中设置大纲目录和图表目录
  9. gorm多表联合查询
  10. java计算机毕业设计医院管理系统源程序+mysql+系统+lw文档+远程调试