iOS 教你如何获取设备的网络状态

1.一般设备下的网络状态获取

获取当前的网络类型

先导入头文件,如下:

#import "AppDelegate.h"

实现方法如下:

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

   if ([netW isEqualToString:@""]) {
       network = @"NO DISPLAY";
   }
   return netW;
}

获取当前的Wifi信息需要借助系统的SystemConfiguration这个库。先导入头文件,如下:

#import <SystemConfiguration/CaptiveNetwork.h>

实现方法如下:

#pragma mark -- 获取Wifi信息

+ (id)getNetWorkInfo {
   NSArray *ifArr = (__bridge_transfer id)CNCopySupportedInterfaces();
   id info = nil;
   for (NSString *ifname in ifArr) {
       info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifname);
       if (info && [info count]) {
           break;
       }
   }
   return info;
}

#pragma mark -- 获取WIFI名字

+ (NSString *)getWifiName {
    return (NSString *)[self getNetWorkInfo][@"SSID"];
}

#pragma mark -- 获取WIFI的MAC地址

+ (NSString *)getWifiMacAddress {
    return (NSString *)[self getNetWorkInfo][@"BSSID"];
}

获取信号强度与获取网络状态有点类似,通过遍历状态栏,从而获取WIFI图标的信号强度。在获取前需注意当前状态是否为WIFI。如下:

+ (int)haveWifiSignalStrength {
    int strength = 0;
    // 判断当前类型是否为WIFI
    if ([[self haveNetworkType]isEqualToString:@"WIFI"]) {
    UIApplication *application = [UIApplication sharedApplication];
    id statusBar = [application valueForKey:@"statusBar"];
    UIView *foregroundView = [statusBar valueForKey:@"foregroundView"];    
    NSArray *subviewArr = [foregroundView subviews];
    NSString *networkItemView = nil; 
    for (id subview in subviewArr) {
        if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
            networkItemView = subview;
            break;
        }
    }    
    strength = [[networkItemView valueForKey:@"_wifiStrengthBars"] intValue];
    }
    return strength;
}

2.iPhone X下的网络状态获取

下载开源类Reachability,然后根据文档使用即可(该类把移动网络统称为WWAN):

+ (NSString *)haveNetworkTypeByReachability {
    NSString *netW = @"";
    switch ([[Reachability reachabilityForInternetConnection]currentReachabilityStatus]){
        case NotReachable:
            netW = @"NONE";
            break;
        case ReachableViaWiFi:
            netW = @"WIFI";
            break;
        case ReachableViaWWAN:
            netW = @"WWAN";
            break;
        default:
            break;
    }

    if ([netW isEqualToString:@""]) {
        netW = @"NO DISPLAY";
    }
    return netW;
}

 

首先,通过添加宏判断是否是iPhone X,如下:

#define IsPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO)

然后通过层级结构判断类型,如下:

+ (NSString *)haveNetworkType {
    UIApplication *application = [UIApplication sharedApplication];
    id statusBar = [application valueForKeyPath:@"statusBar"];
    NSString *netW = @"";
    if (IsPhoneX) {
        // iPhone X
        id statusBarView = [statusBar valueForKeyPath:@"statusBar"];
        UIView *foregroundView = [statusBarView valueForKeyPath:@"foregroundView"];
        NSArray *subviewArr = [[foregroundView subviews][2] subviews];
        for (id subview in subviewArr) {
            if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarWifiSignalView")]) {
                netW = @"WIFI";
            } else if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarStringView")]) {
                netW = [subview valueForKeyPath:@"originalText"];
            }
        }
    } else {
        // 非 iPhone X
        UIView *foregroundView = [statusBar valueForKeyPath:@"foregroundView"];
        NSArray *subviewArr = [foregroundView subviews];
        for (id subview in subviewArr) {
            if ([subview isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
                int networkType = [[subview valueForKeyPath:@"dataNetworkType"] intValue];
                switch (networkType) {
                    case 0:
                        netW = @"NONE";
                        break;
                    case 1:
                        netW = @"2G";
                        break;
                    case 2:
                        netW = @"3G";
                        break;
                    case 3:
                        netW = @"4G";
                        break;
                    case 5:
                        netW = @"WIFI";
                        break;
                    default:
                        break;
                }
            }
        }
    }

    if ([netW isEqualToString:@""]) {
        netW = @"NO DISPLAY";
    }
    return netW;
}

通过结构获取WIFI信号强度

因为上面获取SSID和BSSID的方法在iPhone X依然可用,因此就不多加说明了,获取iPhone X信号强度的方法也类似于上方获取类型。首先判断是否属于WIFI网络,然后根据iPhone X特有的结构找到特定的地方获取值就行,如下:

#pragma mark -- 获取Wifi信号强度

+ (int)haveWifiSignalStrength {
    int strength = 0;
    // 判断类型是否为WIFI
    if ([[self getNetworkType]isEqualToString:@"WIFI"]) {
        UIApplication *application = [UIApplication sharedApplication];
        id statusBar = [application valueForKey:@"statusBar"];
        if (IsPhoneX) {
            //  iPhone X
            id statusBarView = [statusBar valueForKeyPath:@"statusBar"];
            UIView *foregroundView = [statusBarView valueForKeyPath:@"foregroundView"];
            NSArray *subviewArr = [[foregroundView subviews][2] subviews];            
            for (id subview in subviewArr) {
                if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarWifiSignalView")]) {
                    strength = [[subview valueForKey:@"_numberOfActiveBars"] intValue];
                }
            }
        }else {
            // 非 iPhone X
            UIView *foregroundView = [statusBar valueForKey:@"foregroundView"];
            NSArray *subviewArr = [foregroundView subviews];
            NSString *networkItemView = nil;
            for (id subview in subviewArr) {
                if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
                    networkItemView = subview;
                    break;
                }
            }           
            strength = [[networkItemView valueForKey:@"_wifiStrengthBars"] intValue];
        }
    }
    return strength;
}

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值