虽然各种直接获取信号强度的api都被封杀了。但是还有一个另类的黑魔法可以获取到。那就是遍历UIStatusBar了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
- (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 获取到网络连接类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
- (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的留海设计,所以元素与布局都发现了变化。
1 |
id statusBar = [[UIApplication sharedApplication] valueForKeyPath:@"statusBar"]; |
断点后执行
1 |
po [statusBar recursiveDescription] |
即可查看新的结构,遍历iPhoneX WIFI信号方法
1 2 3 4 5 6 7 8 9 10 11 12 |
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信号强度