通过遍历statusBar上层级视图结构来判断iphoneX的网络状态,其实在以前的iphone6/7/plus等机型上这个办法一直可用,不过在iphoneX上多了刘海之后,statusBar层级结构略有改变,所以判断的视图变了.
这个方法用在iphoneX上判断网络状态也是有缺陷的,就是只能区分
wifi
手机网络
和无信号
这三种,具体是4G,3G,2G其实是无法区分的.
- 代码如下
NSString+MR.h
#import <UIKit/UIKit.h>
@interface NSString (MR)
/**
获取网络状态
*/
+ (NSString *)getNetStatus;
@end
NSString+MR.m
//屏幕高度
#define H [UIScreen mainScreen].bounds.size.height
#define W [UIScreen mainScreen].bounds.size.width
//适配iPhoneX的宏
#define k_iPhoneX (W == 375.f && H == 812.f ? YES : NO)
#import "NSString+MR.h"
#import <UIKit/UIApplication.h>
@implementation NSString (MR)
+ (NSString *)getNetStatus{
NSString *network = @"";
UIApplication *app = [UIApplication sharedApplication];//获取当前app
UIView *statusBar = [app valueForKeyPath:@"statusBar"];
if (k_iPhoneX) {
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")]) {
network = @"WIFI";
}else if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarStringView")]) {
network = [subview valueForKeyPath:@"originalText"];
}
}
return network;
}else{
UIApplication *app = [UIApplication sharedApplication];//获取当前app
NSArray *chidren = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
int type = 0;
for(id child in chidren){
if([child isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
type = [[child valueForKeyPath:@"dataNetworkType"] intValue];
}
}
switch(type) {
case 0:
network = @"notReachable";
break;
case 1:
network = @"2g";
break;
case 2:
network = @"3g";
break;
case 3:
network = @"4g";
break;
case 4:
network = @"LTE";
break;
case 5:
network = @"wifi";
break;
default:
break;
}
return network;
}
}
@end
网友评论