ios 获取网络状态

1.基于AFNetworking  

AFHTTPSessionManager *manager = [AFHTTPSessionManagermanager];

// 网络判断以及网络监测;

    [manager.reachabilityManager   setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

        if (status==AFNetworkReachabilityStatusReachableViaWiFi ||status==AFNetworkReachabilityStatusReachableViaWWAN) {

            NSLog(@"可以联网");

        }elseif(status==AFNetworkReachabilityStatusNotReachable){

            [ProgressHUD displayHudError: @"请检查网络连接"];

            return ;

        }else{

            NSLog(@"未知网络");

        }

    }];

//    开启网络监测

    [manager.reachabilityManagerstartMonitoring];

注:这个方法方便在是用AFNetworking ,适用性强,使用的是block;  (此方法建议在请求中加入,可实时监控网络状态)

2.是基于获取状态栏的信息来判断的;<这个在iphoneX上无法使用>

先创建枚举:

typedef enum : NSUInteger {

    DatabaseOperationNetWorkStateNotReachable,

    DatabaseOperationNetWorkStateReachableViaWWAN,

    DatabaseOperationNetWorkState2G,

    DatabaseOperationNetWorkState3G,

    DatabaseOperationNetWorkState4G,

    DatabaseOperationNetWorkStateUnknown,

} DatabaseOperationNetWorkState;


- (DatabaseOperationNetWorkState)getNetWorkStates{

    UIApplication *app = [UIApplicationsharedApplication];

    NSArray *children = [[[appvalueForKeyPath:@"statusBar"]valueForKeyPath:@"foregroundView"]subviews];

    self.netWorkState =DatabaseOperationNetWorkStateUnknown;

    int netType =0;

    //获取到网络返回码

    for (id childin children) {

        if ([childisKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {

            //获取到状态栏

            netType = [[child valueForKeyPath:@"dataNetworkType"]intValue];

            

            switch (netType) {

                case0:

                    self.netWorkState =DatabaseOperationNetWorkStateNotReachable;

                    //无网模式

                    break;

                case1:

                    self.netWorkState =DatabaseOperationNetWorkState2G;

                    break;

                case2:

                    self.netWorkState =DatabaseOperationNetWorkState3G;

                    break;

                case3:

                    self.netWorkState =DatabaseOperationNetWorkState4G;

                    break;

                case5:

                {

                    self.netWorkState =DatabaseOperationNetWorkStateReachableViaWWAN;

                    break;

                default:

                    self.netWorkState =DatabaseOperationNetWorkStateUnknown;

                    break;

                }

            }

        }

        //根据状态选择

    }

    if (self.netWorkState == DatabaseOperationNetWorkStateUnknown) {

        self.netWorkState =DatabaseOperationNetWorkStateNotReachable;

    }

    returnself.netWorkState;

}

注:这个可以迅速获取网络状态,但是有一个缺点:当用的是WiFi的时候,此时如果WiFi没有网,就无法识别,(有局限性);(此方法建议在做请求前进行网络判断);


上面的方法在iphoneX上无法获取到,可以使用下面的方法,下面的方法是根据运营商获取的,所以只能获取4G/3G/2G网络,局限性太大(建议使用方法1或者方法3)

NSArray *typeStrings2G = @[CTRadioAccessTechnologyEdge,
                                CTRadioAccessTechnologyGPRS,
                                CTRadioAccessTechnologyCDMA1x];
     
NSArray *typeStrings3G = @[CTRadioAccessTechnologyHSDPA,
                                CTRadioAccessTechnologyWCDMA,
                                CTRadioAccessTechnologyHSUPA,
                                CTRadioAccessTechnologyCDMAEVDORev0,
                                CTRadioAccessTechnologyCDMAEVDORevA,
                                CTRadioAccessTechnologyCDMAEVDORevB,
                                CTRadioAccessTechnologyeHRPD];
     
     NSArray *typeStrings4G = @[CTRadioAccessTechnologyLTE];
     // 该 API 在 iOS7 以上系统才有效
     if  ([[[UIDevice currentDevice] systemVersion] floatValue] >=  7.0 ) {
         CTTelephonyNetworkInfo *teleInfo= [[CTTelephonyNetworkInfo alloc] init];
         NSString *accessString = teleInfo.currentRadioAccessTechnology;
         if  ([typeStrings4G containsObject:accessString]) {
             NSLog(@ "4G网络" );
         else  if  ([typeStrings3G containsObject:accessString]) {
             NSLog(@ "3G网络" );
         else  if  ([typeStrings2G containsObject:accessString]) {
             NSLog(@ "2G网络" );
         else  {
             NSLog(@ "未知网络" );
         }
     else  {
         NSLog(@ "未知网络" );
     }


3.基于Reachability基于

添加Reachability.h和Reachability.m到工程中,导入 SystemConfiguration.framwork到工程中,


// 监听网络状态改变

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getTheNetworkStateWhenItChange) name:kReachabilityChangedNotification object:nil];


// 创建Reachability

self.reachability = [Reachability reachabilityForInternetConnection];

// 开始监控网络

[self.reachability startNotifier];


- (void)getTheNetworkStateWhenItChange

{

    // 1.检测wifi状态

    Reachability *wifi = [Reachability reachabilityForLocalWiFi];

    // 2.检测手机是否能上网络(WIFI\2G\3G\4G)

    Reachability *conn = [Reachability reachabilityForInternetConnection];

    // 3.判断网络状态

    if ([wifi currentReachabilityStatus] != NotReachable) {//wifi

        NSLog(@"wifi");

    } elseif ([conn currentReachabilityStatus] != NotReachable) {//没有使用wifi,使用手机自带网络进行上网

        NSLog(@"使用流量");

    } else {//没有网络

        NSLog(@"没有网络");

    }

}


注:这个没用过,是在找的时候,收集过来的,


(如果觉得还可以,点个赞 ^_^ )


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值