之前看到某款app,当我开着4G网络但是禁止该app访问网络时,该app会提示我前往设置页面开启数据访问权限,后来在一本书上找到了一个解决方案。
原理其实不难,首先导入头文件<objc/message.h>,状态栏是由当前app控制的,获取当前app后遍历所有属性,找到关于状态栏的
UIApplication *app = [UIApplication sharedApplication];
unsigned int outCount = 0;
Ivar *ivars = class_copyIvarList(app.class, &outCount);
for (int i = 0; i < outCount; i++) {
Ivar ivar = ivars[i];
printf("|%s \n", ivar_getName(ivar));
}
lvarList
输出得到app的所有属性和变量,很明显statusBar就是状态栏的,然后我们一层层往下剥,这里我就不一一赘述了,最后获取到的dataNetworkType就是当前网络状态
UIApplication *application = [UIApplication sharedApplication];
NSArray *children = [[[application valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
for (id child in children) {
if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
id type = [child valueForKeyPath:@"dataNetworkType"];
NSLog(@" type class is %@, value is %@", [type class], type);
}
}
经过测试,发现,可能的值为 1,2,3,5 分别对应的网络状态是2G、3G、4G及WIFI。 当没有网络时,隐藏UIStatusBarDataNetworkItemView,无法获取dataNetworkType值。