iOS 获取蜂窝网络信号强度 包含iPhoneX XS XR XSMASX (最新)
1.虽然各种直接获取信号强度的api都被封杀了。但是还有一个另类的黑魔法可以获取到。那就是遍历UIStatusBar了
网络上有的文章写的会崩溃 比如:
- (int)getSignalStrength{ if (iPhoneX) { id statusBar = [[UIApplication sharedApplication] valueForKeyPath:@"statusBar"]; id statusBarView = [statusBar valueForKeyPath:@"statusBar"]; UIView *foregroundView = [statusBarView valueForKeyPath:@"foregroundView"]; int signalStrength = 0; NSArray *subviews = [[foregroundView subviews][2] subviews]; for (id subview in subviews) { if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarWifiSignalView")]) { signalStrength = [[subview valueForKey:@"numberOfActiveBars"] intValue]; break; }else if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarStringView")]) { signalStrength = [[subview valueForKey:@"numberOfActiveBars"] intValue]; break; } } return signalStrength; } }
实测 iPhoneXSMAX 的 _UIStatusBarStringView 里面没有 numberOfActiveBars的值。所以又重新遍历,再xcode中断点看了一下。是需要在
_UIStatusBarPersistentAnimationView 这个图下面去取值就可以了 。。即
- (int)getSignalStrength{ if (iPhoneX) { id statusBar = [[UIApplication sharedApplication] valueForKeyPath:@"statusBar"]; id statusBarView = [statusBar valueForKeyPath:@"statusBar"]; UIView *foregroundView = [statusBarView valueForKeyPath:@"foregroundView"]; int signalStrength = 0; NSArray *subviews = [[foregroundView subviews][2] subviews]; for (id subview in subviews) { if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarWifiSignalView")]) { signalStrength = [[subview valueForKey:@"numberOfActiveBars"] intValue]; break; }else if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarPersistentAnimationView")]) { signalStrength = [[subview valueForKey:@"numberOfActiveBars"] intValue]; break; } } return signalStrength; } }