美文网首页ios相关点
iOS 中如何判断当前是2G/3G/4G/WiFi

iOS 中如何判断当前是2G/3G/4G/WiFi

作者: SwordDevil | 来源:发表于2017-02-23 16:22 被阅读2166次

    最近经常会碰到一些问到如何判断手机网络,在这里我简单的介绍几种方法:

    一、RealReachability Demo下载

    使用Reachability时,如果网络变化,会给出一个通知,但是我们获取的网络状态只有WiFi/WWAN/NotReach几种。我们可以在Reachability返回的通知里,WWAN这种类型下,再做上面的网络判断即可。但是更优的做法就将判断放在Reachability中,在使用的时候直接返回不同的网络状态。
    由于最新的Reachability已经支持了IPV6,我也是在最新的Reachability上做了一些改进。
    大部分方法跟Reachability一样,我扩展了枚举类型,修改了网络状态判断。
    主要修改如下:

    typedef NS_ENUM(NSUInteger, HJNetWorkStatus) {
        HJNetWorkStatusNotReachable = 0,
        HJNetWorkStatusUnknown = 1,
        HJNetWorkStatusWWAN2G = 2,
        HJNetWorkStatusWWAN3G = 3,
        HJNetWorkStatusWWAN4G = 4,
        HJNetWorkStatusWiFi = 5,
    };
    

    简单的介绍下RealReachability使用

    头文件:#import "RealReachability.h"
    
    @property (nonatomic, assign) BOOL isUserReal; // 当前网络是否可用
    @property (nonatomic, assign) NSInteger status; // 当前网络状态
    
    //发送通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(netWorkChanged:) name:kRealReachabilityChangedNotification object:nil];
    
    - (void)netWorkChanged:(NSNotification *)notification
    {
        RealReachability *reachability = (RealReachability *)notification.object;
        ReachabilityStatus status = [reachability currentReachabilityStatus];
        self.isUserReal = YES;
        switch (status) {
            case RealStatusNotReachable:
                self.isUserReal = NO;
                self.status = 0;
                [self alertMessage:@"没网络"];
                break;
            case RealStatusViaWiFi:
                self.isUserReal = YES;
                self.status = 1;
                [self alertMessage:@"WIFI"];
                break;
            case RealStatusViaWWAN:
                self.isUserReal = YES;
                self.status = 2;
                [self alertMessage:@"2G/3G/4G"];
                break;
                
            default:
                break;
        }
    }
    

    二、根据状态栏的wifi标志

    - (NSString *)getNetWorkStates{
        UIApplication *app = [UIApplication sharedApplication];
        NSArray *children = [[[app valueForKeyPath:@"statusBar"]valueForKeyPath:@"foregroundView"]subviews];
        NSString *state = [[NSString alloc]init];
        int netType = 0;
        //获取到网络返回码
        for (id child in children) {
            if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
                //获取到状态栏
                netType = [[child valueForKeyPath:@"dataNetworkType"]intValue];
                 
                switch (netType) {
                    case 0:
                        state = @"无网络";
                        //无网模式
                        break;
                    case 1:
                        state =  @"2G";
                        break;
                    case 2:
                        state =  @"3G";
                        break;
                    case 3:
                       state =   @"4G";
                        break;
                    case 5:
                    {
                        state =  @"wifi";
                        break;
                    default:
                        break;
                }
            }
        }
        //根据状态选择
        return state;
    }
    

    结束语

    到这里就结束了,如若不懂的话可以👇留言,也可以加入群讨论
    喜欢的话 记得关注、收藏、点赞哟

    群号:552048526

    相关文章

      网友评论

      • hu9134:发现在iphoneX上,第二种方法会报错
        SwordDevil:@轩辕小爱 xcode9 他们说是改上面那个 其他版本的xcode 不需要改吧
        轩辕小爱:@SwordDevil 改完程序还是会挂
        SwordDevil:foregroundView 这个改成_ foregroundView

      本文标题:iOS 中如何判断当前是2G/3G/4G/WiFi

      本文链接:https://www.haomeiwen.com/subject/sasbwttx.html