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