判断网络情况 这里没有用AFN判断,下文方法是通过扫描状态栏
的显示情况进行判断的:
一、之前(非刘海屏)
的用法:
1、首先定义网络类型为枚举类型:
// 网络类别枚举类型
typedef NS_ENUM(NSUInteger, NetWorkType) {
NetWorkTypeNone = 0, // 无网
NetWorkType2G = 1, // 2G
NetWorkType3G = 2, // 3G
NetWorkType4G = 3, // 4G
NetWorkTypeWiFI = 5, // wifi
};
2、自定义方法,(通过遍历手机状态栏的显示)
求得网络类型:
+ (NetWorkType)currentNetworkType{
// 1、求出状态栏的子视图数组
NSArray *infoArray = [[[[UIApplication sharedApplication] valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
// 2、遍历子视图求出网络类型
NetWorkType type;
for (id info in infoArray){
if ([info isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
type = [[info valueForKeyPath:@"dataNetworkType"] integerValue];
return (NetWorkType)type; // 0 : 无网; 1 : 2G网; 2 : 3G网; 3 : 4G网;5 : wifi网;
}
}
return NetWorkTypeNone;
}
注意:利用这种遍历的方法在iPhoneX/Xs/XR/Xs Max 机型上运行是崩溃,其实根本原因是手机刘海儿的状态栏子视图发生了变化,用以下方法便可解决。
二、刘海屏
的用法:
+ (NetWorkType)currentNetworkType{
// iPhoneX、iPhoneXR、iPhoneXS_Max是宏定义 (iPhoneX == iPhoneXs)
if (iPhoneX || iPhoneXR || iPhoneXS_Max) {
UIApplication *app = [UIApplication sharedApplication];
id statusBar = [app valueForKeyPath:@"statusBar"];
id statusBarView = [statusBar valueForKeyPath:@"statusBar"];
UIView *foregroundView = [statusBarView valueForKeyPath:@"foregroundView"];
NSArray *subviews = [[foregroundView subviews][2] subviews];
for (id subview in subviews) {
if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarWifiSignalView")]) {
return NetWorkTypeWiFI; // wifi网
}else if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarStringView")]) {
NSString *str = [subview valueForKeyPath:@"_originalText"]; // @"text" @"originalText"一样
if ([str isEqualToString:@"4G"]) {
return NetWorkType4G; // 4G网
}else if([str isEqualToString:@"3G"]){
return NetWorkType3G; // 3G网
}else{
return NetWorkType2G; // 2G网
}
}
}
return NetWorkTypeNone; // 无网络
}
}
另:关于刘海儿
的视图分层如下图所示(手机是4G
),结果获得的就是4G网络
:
注意:我们用的这种方法提交之后,审核被拒,说是在iOS 12上,崩溃,通过解析苹果返回的崩溃日志,可得知,有的设备key-value键值对是不存在的,截图如下所示:
崩溃日志解决办法:使用苹果自带的:Reachability
第一步:从Demo(左上角)中,把Reachability.h & Reachability.m文件拷贝到项目里
第二步:代码实现
+ (NetWorkType)currentNetworkType{
Reachability *reachability = [Reachability reachabilityWithHostName:@"www.apple.com"];
NetworkStatus internetStatus = [reachability currentReachabilityStatus];
NetWorkType net = NetWorkTypeNone;
switch (internetStatus) {
case ReachableViaWiFi:
net = NetWorkTypeWiFI;
break;
case ReachableViaWWAN:
net = NetWorkType4G;
// net = [self getNetType]; //判断具体类型
break;
case NotReachable:
net = NetWorkTypeNone;
default:
break;
}
return net;
}
+ (NSString *)getNetType
{
CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
NSString *currentStatus = info.currentRadioAccessTechnology;
NSString *netconnType;
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";
}
return netconnType;
}
over!
网友评论