iOS-检测监听网络状态(WIFI、2G/3G/4G)

最近做一个项目,里面要用到网络监听,感觉好难,早上查了一早上的资料,网上的帖子大都差不多。

看了看,最后整理合并了一下,感觉这个用起来最实在,也最简单。

检测网络状态

让用户了解自己的网络状态,防止一些错误操作

根据用户的网络状态进行智能处理,节省用户流量,提高用户体验

WIFI/3G网络:自动下载高清图片

低俗网络:只下载缩略图

没有网络:只显示离线的缓存数据

添加框架:SystemConfiguration.framework

在网络应用中,需要对用户设备的网络状态进行实时监控,

苹果官方提供了一个叫Reachability的实例程序,便于开发者检测网络状态

Reachablibity的使用步骤

1:导入头文件

#import "Reachability.h"


2:注册网络监听

// 监听网络状态发生改变的通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkStateChange) name:kReachabilityChangedNotification object:nil];

    // 获得Reachability对象
    self.reachability = [Reachability reachabilityForInternetConnection];
    // 开始监控网络
    [self.reachability startNotifier];

******网络监听 就那么几行代码,

添加到:AppDelegate.h 中的 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
}
3:实在通知中的代理方法:networkStateChange
-(void)networkStateChange{
    NSLog(@"网络状态改变了");
    if ([AppDelegate isEnableWIFI]) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"wenxintishi", nil) message:NSLocalizedString(@"wifiMessage", nil) delegate:self cancelButtonTitle:NSLocalizedString(@"queding", nil) otherButtonTitles:nil, nil];
        [alert show];
    } else if ([AppDelegate isEnable3G]) {
        if ([[[NSUserDefaults standardUserDefaults]objectForKey:@"wifiSwitch"]isEqualToString:@"on"]) {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"wenxintishi", nil)  message:NSLocalizedString(@"3GMessage", nil) delegate:self cancelButtonTitle:NSLocalizedString(@"fou", nil) otherButtonTitles:NSLocalizedString(@"shi", nil), nil];
            alert.tag = 1;
            [alert show];
        }
    } else {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"wenxintishi", nil) message:NSLocalizedString(@"noWifiMessage", nil) delegate:self cancelButtonTitle:NSLocalizedString(@"queding", nil) otherButtonTitles:nil, nil];
        [alert show];
    }
    
}
********这个里面,其实就三种状态:3g,没网,wifi,我在这里是各自给了一个弹框;

4:实现有返回值的方法:

// 是否WIFI
+ (BOOL)isEnableWIFI {
    return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);
}

// 是否3G
+ (BOOL)isEnable3G {
    return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);
}

********到这里,基本网络监听已经能够实现;不过美中不足的是,只能监听三种状态:3g,没网,wifi。

其实,现在网络状态远远不止3g一种,有人用2G、有人用3G,还有人用4G、5G也快出来了吧。所以只返回一个3G值显然并不满足我们程序的需要;

因为   #import "Reachability.h"  中并没有提供那么多得返回值供我们使用,我在网上查了一下,针对这个问题,好多大牛们已然有了解决方法。


5:修改 Reachability 检测的2G/3G/4G/5G网络 

在networkStatusForFlags:方法里面找到以下的地方,替换就OK;

if (flags & kSCNetworkReachabilityFlagsIsWWAN) {

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {

        CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];

        NSString *currentRadioAccessTechnology = info.currentRadioAccessTechnology;

        if (currentRadioAccessTechnology) {

            if ([currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) {

                return kReachableVia4G;

            } else if ([currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge] || [currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) {

                return kReachableVia2G;

            } else {

                return kReachableVia3G;

            }

        }

    }

    

    if ((flags & kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection) {

        if((flags & kSCNetworkReachabilityFlagsConnectionRequired) == kSCNetworkReachabilityFlagsConnectionRequired) {

            return kReachableVia2G;

        }

        return kReachableVia3G;

    }

    return kReachableViaWWAN;

}


好了,到了这里就完全OK了,辛苦了一早上,顺手整理出来!(本人也是IOS小菜鸟一枚:qq:476987239  欢迎一起探讨学习IOS中的技术点)QQ讨论群:1107415488

你可能感兴趣的:(IOS开发)