美文网首页iOS专业知识分享(iOS)iOS项目框架搭建
iOS使用Reachability检测2G、3G、4G网络

iOS使用Reachability检测2G、3G、4G网络

作者: 北海有鱼w | 来源:发表于2016-05-25 15:32 被阅读3437次

我们常常会碰到这样的需求,在2G网络状态下不下载高清图片,只查看文字,在wifi、3G、4G可以下载高清图片,以达到提升用户体验的目的。最近在自己的项目里面也有类似的需求,查找资料,稍微修改了苹果官方的Reachability实时监测网络状态变化。

1、不废话,直接上干货

Reachability.m文件中导入CoreTelephony库
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
找到此方法if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)修改,对了 ,先修改枚举值在Reachability.h

typedef enum : NSInteger {
    NotReachable = 0,
    ReachableViaWiFi,
    ReachableViaWWAN,
    kRaeachableVia4G,
    kReachableVia2G,
    kReachableVia3G
} NetworkStatus;

增加代码

if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
    {
        /*
         ... but WWAN connections are OK if the calling application is using the CFNetwork APIs.
         */
        returnValue = ReachableViaWWAN;
        if (IOS_VERSION >= 7.0) {
            CTTelephonyNetworkInfo *phonyNetwork = [[CTTelephonyNetworkInfo alloc] init];
            NSString *currentStr = phonyNetwork.currentRadioAccessTechnology;
            if (currentStr) {
                if ([currentStr isEqualToString:CTRadioAccessTechnologyLTE]) {
                    return kRaeachableVia4G;
                }else if ([currentStr isEqualToString:CTRadioAccessTechnologyGPRS]|| [currentStr isEqualToString:CTRadioAccessTechnologyEdge]){
                    return kReachableVia2G;
                }else{
                    return kReachableVia3G;
                }
            }
        }
        if ((flags & kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection) {
            if((flags & kSCNetworkReachabilityFlagsConnectionRequired) == kSCNetworkReachabilityFlagsConnectionRequired) {
                return kReachableVia2G;
            }
            return kReachableVia3G;
        }
        return ReachableViaWWAN;
    }

2、在需要的地方引入#import "Reachability.h"监听网络状态变化通知

- (void)viewDidLoad {
    [super viewDidLoad];
    // 监测网络情况
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(reachabilityChanged:)
                                                 name: kReachabilityChangedNotification
                                               object: nil];
    NSString *remoteHostName = @"www.apple.com";
    NSString *remoteHostLabelFormatString = NSLocalizedString(@"Remote Host: %@", @"Remote host label format string");
    UILabel *remoteHostLabel = [[UILabel alloc] init];
    remoteHostLabel.text = [NSString stringWithFormat:remoteHostLabelFormatString, remoteHostName];
    self.hostReachability = [Reachability reachabilityWithHostName:remoteHostName];
    [self.hostReachability startNotifier];
}

3、记得在delloc里面销毁通知

- (void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

4、处理通知方法

- (void)reachabilityChanged:(NSNotification *)no{
    Reachability* curReach = [no object];
    NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
    NetworkStatus status = [curReach currentReachabilityStatus];
    switch (status)
    {
            
        case NotReachable:
            NSLog(@"====当前网络状态不可达=======");
            //其他处理
            self.kReachableVia = @"当前网络状态不可达";
            break;
            
        case ReachableViaWiFi:
            NSLog(@"====当前网络状态为Wifi=======");
            self.kReachableVia = @"ReachableViaWiFi";
            //其他处理
            break;
        case kReachableVia2G:
            NSLog(@"====当前网络状态为2G=======");
            self.kReachableVia = @"kReachableVia2G";
            break;
        case kReachableVia3G:
            NSLog(@"====当前网络状态为3G=======");
            //其他处理
            self.kReachableVia = @"kReachableVia3G";
            break;
        case kRaeachableVia4G:
            NSLog(@"====当前网络状态为4G=======");
            self.kReachableVia = @"kRaeachableVia4G";
            //其他处理
            break;
        default:
            NSLog(@"你是外星来的吗?");
            //其他处理
            self.kReachableVia = @"你是外星来的吗?";
            break;
    }
}

结束语:网络监听状态就到这里了,还是挺简单的,make一下,也希望能帮助到需要的人。

相关文章

网友评论

  • 5bb1efc3ccb2:为什么我一直返回NotReachable 我切换WiFi时 会同时返回NotReachable和ReachableViaWiFi
    5bb1efc3ccb2:@M_ZL 我知道了 ,本来网址是www.baidu.com我前面还加了https://
  • 7cdfc67f5acd:reachability.m在哪儿添加代码?出错了
    北海有鱼w:@Yuving 不会啊,你是在官方下载的嘛
    7cdfc67f5acd:@394e6f841540 没这段代码呀
    北海有鱼w:@Yuving 搜索一下if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
  • adb2395b3e32:if ((flags & kSCNetworkReachabilityFlagsIsWWAN)
    ==
    kSCNetworkReachabilityFlagsIsWWAN) 里面的 IOS_VERSION 是怎么定义的啊? 为什么我报错了?
    北海有鱼w:@嘉伟人来疯 哦 ,那是检测iOS版本的一个宏,sorry啊
    雪夜月:@Bob林 :+1:
    Bob林:@嘉伟人来疯 double IOS_VERSION = [[UIDevice currentDevice].systemVersion doubleValue];

本文标题:iOS使用Reachability检测2G、3G、4G网络

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