欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS开发中监测网络状态实现方案

程序员文章站 2022-03-23 09:38:47
iOS开发中监测网络状态实现方案,我们常常会碰到这样的需求,在2G网络状态下不下载高清图片,只查看文字,在wifi、3G、4G可以下载高清图片,以达到提升用户体验的目的。最近在自己...

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

1、不废话,直接上干货

在Reachability.m文件中导入CoreTelephony库
#import
找到此方法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;
    }
}