昨天在判斷網(wǎng)絡(luò)的發(fā)現(xiàn)發(fā)現(xiàn)xcode12竟然沒有5G相關(guān)的key,今天升級(jí)到Xcode12.1發(fā)現(xiàn)多了CTRadioAccessTechnologyNRNSA和CTRadioAccessTechnologyNR。
NR是New Radio的縮寫,新無線(5G)的意思,
NRNSA表示5G NR的非獨(dú)立組網(wǎng)(NSA)模式
具體解釋可看5G新無線
網(wǎng)絡(luò)判斷使用了Reachability
方式一:通過CoreTelephony獲取網(wǎng)絡(luò)狀態(tài)
引入頭文件
#import "Reachability.h"
#import <CoreTelephony/CTCarrier.h>
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
開始網(wǎng)絡(luò)判斷:
+ (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 = @"當(dāng)前無網(wǎng)路連接";
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;
}
鑒于評(píng)論區(qū)反饋iOS14.0.1對(duì)5G判斷產(chǎn)生的崩潰,這里5G的判斷從14.1開始判斷(獨(dú)白:但是官方寫著就是14.0,真是個(gè)左右為難的問題~)
方式二:通過狀態(tài)欄獲取網(wǎng)絡(luò)狀態(tài)(不推薦)
因?yàn)樗接袑傩栽谥蟮陌姹緯?huì)被取消,不推薦這種方式
- (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) {
//wifi
if ([child isKindOfClass:NSClassFromString(@"_UIStatusBarWifiSignalView")]) {
state = @"wifi";
}
//2G 3G 4G
if ([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")]) {
//獲取到狀態(tài)欄
switch ([[child valueForKeyPath:@"dataNetworkType"] intValue]) {
case 0:
state = @"無網(wǎng)絡(luò)";
//無網(wǎng)模式
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) {}
}