1.雖然各種直接獲取信號強度的api都被封殺了。但是還有一個另類的黑魔法可以獲取到。那就是遍歷UIStatusBar了
//獲取網(wǎng)絡信號強度(dBm)
- (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;
} else {
UIApplication *app = [UIApplication sharedApplication];
NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];
NSString *dataNetworkItemView = nil;
int signalStrength = 0;
for (id subview in subviews) {
if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]] && [[self getNetworkType] isEqualToString:@"WIFI"] && ![[self getNetworkType] isEqualToString:@"NONE"]) {
dataNetworkItemView = subview;
signalStrength = [[dataNetworkItemView valueForKey:@"_wifiStrengthBars"] intValue];
break;
}
if ([subview isKindOfClass:[NSClassFromString(@"UIStatusBarSignalStrengthItemView") class]] && ![[self getNetworkType] isEqualToString:@"WIFI"] && ![[self getNetworkType] isEqualToString:@"NONE"]) {
dataNetworkItemView = subview;
signalStrength = [[dataNetworkItemView valueForKey:@"_signalStrengthRaw"] intValue];
break;
}
}
return signalStrength;
}
}
-(void)displayWifiViewWithNetStatus:(NSInteger)networkStatus {
switch (networkStatus) {
case 1:
self.networkView.image = [UIImage imageNamed:@"ic_WiFi-3"];
break;
case 2:
self.networkView.image = [UIImage imageNamed:@"ic_WiFi-2"];
break;
case 3:
self.networkView.image = [UIImage imageNamed:@"ic_WiFi-1"];
break;
default:
self.networkView.image = [UIImage imageNamed:@"ic_WiFi-1"];
break;
}
}
//檢查當前是否連網(wǎng)
- (BOOL)whetherConnectedNetwork
{
//創(chuàng)建零地址,0.0.0.0的地址表示查詢本機的網(wǎng)絡連接狀態(tài)
struct sockaddr_storage zeroAddress;//IP地址
bzero(&zeroAddress, sizeof(zeroAddress));//將地址轉(zhuǎn)換為0.0.0.0
zeroAddress.ss_len = sizeof(zeroAddress);//地址長度
zeroAddress.ss_family = AF_INET;//地址類型為UDP, TCP, etc.
// Recover reachability flags
SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
SCNetworkReachabilityFlags flags;
//獲得連接的標志
BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
CFRelease(defaultRouteReachability);
//如果不能獲取連接標志,則不能連接網(wǎng)絡,直接返回
if (!didRetrieveFlags)
{
return NO;
}
//根據(jù)獲得的連接標志進行判斷
BOOL isReachable = flags & kSCNetworkFlagsReachable;
BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
return (isReachable&&!needsConnection) ? YES : NO;
}
//獲取網(wǎng)絡類型
- (NSString *)getNetworkType {
if (![self whetherConnectedNetwork]) return @"NONE";
UIApplication *app = [UIApplication sharedApplication];
NSArray *subviews = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
NSString *type = @"NONE";
for (id subview in subviews) {
if ([subview isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
int networkType = [[subview valueForKeyPath:@"dataNetworkType"] intValue];
switch (networkType) {
case 0:
type = @"NONE";
break;
case 1:
type = @"2G";
break;
case 2:
type = @"3G";
break;
case 3:
type = @"4G";
break;
case 5:
type = @"WIFI";
break;
}
}
}
return type;
}
2.還有一種使用NetworkExtension/NEHotspotHelper來獲取WIFI信息。但是得向蘋果申請權限。感興趣可以研究研究。