获取iPhone/iPad设备网络类型(2G,3G,4G,5G,WIFI)
目前我们获取手机网络类型主要还是用的 AFNetwork
但是AFNetwork有个问题就是类型不够充分,只能四种类型
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {AFNetworkReachabilityStatusUnknown = -1,AFNetworkReachabilityStatusNotReachable = 0,AFNetworkReachabilityStatusReachableViaWWAN = 1,AFNetworkReachabilityStatusReachableViaWiFi = 2,
};
- AFNetworkReachabilityStatusUnknown 未知网络
- AFNetworkReachabilityStatusNotReachable 无网络
- AFNetworkReachabilityStatusReachableViaWWAN 蜂窝移动网络
- 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发现多了CTRadioAccessTechnologyNRNSA和CTRadioAccessTechnologyNR。
NR是New 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)相关推荐
- 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 ...
- 什么是1G/2G/3G/4G/5G
什么是1G/2G/3G/4G/5G 参考:http://www.360doc.com/content/14/1213/22/5458405_432718054.shtml 介绍 1G:表示第一代移动通 ...
- 检查SIM卡当前环境是否支持2G/3G/4G/5G
我的是小米手机,就以小米为例子 设置 移动网络SIM卡信息 网络类型选择 选择2G/3G/4G/5G
- 关于物联网2G/3G/4G/5G/NB模组开机后模组AT指令无反应/模块开机失败/模块开机不响应AT指令等问题
一.背景 近些年物联网行业如日中天,越来越多的设备需要接入网络平台.因此无线通信模组便成为了连接物联网感知层和网络层的关键环节,属于底层硬件环节,具备其不可替代性,且无线通信模块与物联网终端存在一一对 ...
- NSA组网下2G/3G/4G/5G系统协同策略的研究
[摘 要]从NSA组网原理出发,以中国移动的现网实际情况和需求为例,通过分析不同系统的特点,探讨了NSA模式下2G/3G/4G/5G组网下不同网络间的协同策略.经测试验证,该套策略对5G网络的覆盖. ...
- 一文让你读懂——什么是1G,2G,3G,4G,5G
一文让你读懂--什么是1G,2G,3G,4G,5G 无线通信日新月异,现在我们已经进入到了5G时代.5G代表了更快的速度,更低的延时,更多的链接数,它在人们的生活中所占有的比重和所起的作用越来越大.那 ...
- 中国电信频段测试软件,中国四大运营商2G/3G/4G/5G工作频率以及网络制式
原标题:中国四大运营商2G/3G/4G/5G工作频率以及网络制式 中国四大运营商2G/3G/4G/5G工作频率以及网络制式,值得收藏! 中国移动 1. 900MHz(Band8),889~904/93 ...
- 技术至简-7:2G/3G/4G/5G基站系统中混合调制的技术框架
2G/3G/4G/5G基站系统并非采用单一的调制技术,是数字调制和模拟调制的综合,是QAM调制与IQ调制的综合,是幅度调制与相位调制的综合. 1. 调制模型 在此模型中,包含了三种调制: (1)数字基 ...
- 2G 3G 4G 5G 基站覆盖范围
2G基站的覆盖半径约为5-10公里 3G基站的覆盖半径约为2-5公里 4G基站的覆盖半径约为1-3公里 5G基站的覆盖半径约为100-300米 原文链接:2G 3G 4G 5G 基站覆盖距离
最新文章
- 使用Codeception进行Yii2的单元测试(一)安装以及简介篇
- java 反射 json_java 反射机制构建JSON字符串
- Java基础——Arrays工具类的使用
- 【连载】如何掌握openGauss数据库核心技术?秘诀四:拿捏事务机制(2)
- UE3 Light Functions (光照函数)
- DanmuManager 一个简单的弹幕工具
- 8.Postman中发送请求被拦截(证书问题)
- CNN是如何一层一层'理解'图像信息的
- [MetalKit]37-Using-ARKit-with-Metal使用ARKit与Metal
- 深入浅出WPF(一)
- 编码 - ASCII码表
- 站长说说之SEO流量翻倍增长的秘密
- 从中序与后序遍历序列构造二叉树
- C/S架构的优点和缺点
- 接受数据的php文件源码,PHP文件上传源码分析(RFC1867)
- gpuz怎么看显存颗粒
- H5静态网页设计与制作_川西旅游网设计作品(HTML+CSS+jQuery)
- 杨辉三角形延伸(菱形)
- 电脑英语--著名软件篇
- 变量的存储方式和生存期