iOS实时监控网络状态的改变

 

在网络应用中,有的时候需要对用户设备的网络状态进行实时监控,有两个目的:

(1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能)

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

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

  4G/3G网络:只下载缩略图

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

 常用的有以下两种方法:

  (1)、使用苹果观法提供的检测iOS设备网络环境用的库 Reachablity

  (2)、使用AFN框架中的AFNetworkReachabilityManager来监听网络状态的改变

 

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

使用之前请从Apple网站下载示例:

https://developer.apple.com/library/ios/samplecode/Reachability/Reachability.zip

然后将Reachability.h 和 Reachability.m 加到自己的项目中,并引用 SystemConfiguration.framework,就可以使用了。
Reachability 中定义了3种网络状态:

typedef enum : NSInteger {

    NotReachable = 0,  //无连接
    ReachableViaWiFi,  //使用3G/GPRS网络
    ReachableViaWWAN  //使用WiFi网络

} NetworkStatus;

 

我们可以在程序启动以后启动实时监测

// AppDelegate.m


@interface AppDelegate ()

@property (nonatomic, strong) Reachability *reachability;

@end

// 程序启动器,启动网络监视
- (void)applicationDidFinishLaunching:(UIApplication *)application {

    // 设置网络检测的站点
       NSString *remoteHostName = @"www.apple.com";
    self.reachability = [Reachability reachabilityWithHostName:remoteHostName];
    // 设置网络状态变化时的通知函数
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:)
                                             name:@"kNetworkReachabilityChangedNotification" object:nil];
    [self updateStatus];
}


- (void)reachabilityStatusChange:(NSNotification *)notification
{
    Reachability* curReach = [notification object];
    NSParameterAssert([curReach isKindOfClass:[Reachability class]]);
    [self updateInterfaceWithReachability:curReach];
}

- (void)updateInterfaceWithReachability:(Reachability *)reachability
{
    if (reachability == _reachability)
    {
        NetworkStatus netStatus = [reachability currentReachabilityStatus];
        switch (netStatus)
        {
            case NotReachable:      {
                NSLog(@"没有网络!");
                break;
            }
            case ReachableViaWWAN:  {
                NSLog(@"4G/3G");
                break;
            }
            case ReachableViaWiFi:  {
                NSLog(@"WiFi");
                break;
            }
        }
    }
}


- (void)dealloc
{
     [_reachability stopNotifier];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:kReachabilityChangedNotification object:nil];
}

 

二、使用AFN框架中的AFNetworkReachabilityManager来监听网络状态的改变

 

//使用AFN框架来检测网络状态的改变
-(void)AFNReachability
{
    //1.创建网络监听管理者
    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];

    //2.监听网络状态的改变
    /*
     AFNetworkReachabilityStatusUnknown          = 未知
     AFNetworkReachabilityStatusNotReachable     = 没有网络
     AFNetworkReachabilityStatusReachableViaWWAN = 3G
     AFNetworkReachabilityStatusReachableViaWiFi = WIFI
     */
    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusUnknown:
                NSLog(@"未知");
                break;
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"没有网络");
                break;
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"3G");
                break;
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"WIFI");
                break;

            default:
                break;
        }
    }];

    //3.开始监听
    [manager startMonitoring];
}

 

posted @ 2016-08-10 17:04  Running2Snail  阅读(6658)  评论(0编辑  收藏  举报