最新消息:iOS编程开发交流群(6906921) ,Mac.Cocoa开发交流群(7758675) 欢迎iOS/macOS开发编程爱好及学习者加入!

iOS开发之获取WIFI信号强度

iOS 天狐 32521浏览 2评论

095115206

虽然各种直接获取信号强度的api都被封杀了。但是还有一个另类的黑魔法可以获取到。那就是遍历UIStatusBar了

 

- (void)getSignalStrength{
    UIApplication *app = [UIApplication sharedApplication];
    NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];
    NSString *dataNetworkItemView = nil;
    
    for (id subview in subviews) {
        if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
            dataNetworkItemView = subview;
            break;
        }
    }
    
    int signalStrength = [[dataNetworkItemView valueForKey:@"_wifiStrengthBars"] intValue];
    
    NSLog(@"signal %d", signalStrength);
}

当然我们还可以遍历UIStatusBar 获取到网络连接类型

- (void)getNetworkType
{
    UIApplication *app = [UIApplication sharedApplication];
    NSArray *subviews = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
    for (id subview in subviews) {
        if ([subview isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
            int networkType = [[subview valueForKeyPath:@"dataNetworkType"] intValue];
            switch (networkType) {
                case 0:
                    NSLog(@"NONE");
                    break;
                case 1:
                    NSLog(@"2G");
                    break;
                case 2:
                    NSLog(@"3G");
                    break;
                case 3:
                    NSLog(@"4G");
                    break;
                case 5:
                {
                    NSLog(@"WIFI");
                }
                    break;
                default:
                    break;
            }
        }
    }
}

iPhone X状态栏图标元素结构变了

我们之前通过遍历foregroundView,UIStatusBarDataNetworkItemView可以找到wifi信号强度。

由于iPhoneX的留海设计,所以元素与布局都发现了变化。

    id statusBar = [[UIApplication sharedApplication] valueForKeyPath:@"statusBar"];

断点后执行

po [statusBar recursiveDescription]

即可查看新的结构,遍历iPhoneX WIFI信号方法

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"];
    }
}

 

不得不说遍历UIStatusBar 还有很多炫酷功能与溢处等待我们探索。但是黑魔法能用多久。什么时候失效。就看我们自己的造化了。。

还有一种使用NetworkExtension/NEHotspotHelper来获取WIFI信息。但是得向苹果申请权限。感兴趣可以研究研究。

iPhonex 下获取WiFI强度,参考这里的回答: https://stackoverflow.com/questions/44167577/using-private-api-to-read-wifi-rssi-value/48083845#48083845

转载请注明:天狐博客 » iOS开发之获取WIFI信号强度

微信 OR 支付宝 扫描二维码
为天狐 打赏
非常感谢你的支持,哥会继续努力!
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (2)

  1. 想问下,在iPhonex下 如何获取wifi的强度,求大神具体一点。。
    嘿嘿8年前 (2017-11-07)回复
  2. iPhonex 下获取WiFI强度,参考这里的回答: https://stackoverflow.com/questions/44167577/using-private-api-to-read-wifi-rssi-value/48083845#48083845
    crafttang8年前 (2018-01-04)回复