判断当前app是否被禁止使用网络

之前看到某款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值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,203评论 25 708
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,229评论 4 61
  • 简评:之前,Chrome 已经提供了无界面模式(Chrome Headless)。Chromeless 这个项目又...
    极小光阅读 1,924评论 0 20
  • 得到的这些 别人也很快能得到 可是 为了得到 而所失去的 什么时候弥补回来呢
    祎言阅读 146评论 0 0
  • 每一天,经过川流不息的这条路,不曾停留不曾关注。每一年,花开又花落,身旁的建筑静立如初。你来到这个城市,就像从未来...
    从八到九阅读 254评论 0 0