监听网络状态

一、说明

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

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

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

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

  低速网络:只下载缩略图

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

 

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

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

二、监测网络状态

Reachability的使用步骤

添加框架SystemConfiguration.framework

 

添加源代码

 

包含头文件

#import "Reachability.h"

在AppDelegate.m中添加如下代码:

@property (nonatomic, strong) Reachability *conn;

 

 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

 

    //监听网络改变

    [self observerNetWorkChange];    

    return YES;

}

 

 

- (void)observerNetWorkChange{

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

    self.conn = [Reachability reachabilityForInternetConnection];

    [self.conn startNotifier];

}

- (void)dealloc{

    [self.conn stopNotifier];

    [[NSNotificationCenter defaultCenter] removeObserver:self];

}

 - (void)networkStateChange

 {

     [self checkNetworkState];

 }

 

 - (void)checkNetworkState

 {

     // 1.检测wifi状态

     Reachability *wifi = [Reachability reachabilityForLocalWiFi];

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

     Reachability *conn = [Reachability reachabilityForInternetConnection];

     // 3.判断网络状态

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

         NSLog(@"有wifi");

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

            NSLog(@"使用手机自带网络进行上网");

     } else { // 没有网络

            NSLog(@"没有网络");

     }

}

 

注:

一、监测网络状态(AFN里面已经封装)

    AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];
    [mgr setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        // 当网络状态发生改变的时候调用这个block
        switch (status) {
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"WIFI");
                break;
                
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"自带网络");
                break;
                
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"没有网络");
                break;
                
            case AFNetworkReachabilityStatusUnknown:
                NSLog(@"未知网络");
                break;
            default:
                break;
        }
    }];
    // 开始监控
    [mgr startMonitoring];
}

- (void)dealloc
{
    [[AFNetworkReachabilityManager sharedManager] stopMonitoring];
}

 

二、获取当前网络状态

[AFNetworkReachabilityManager sharedManager].networkReachabilityStatus 

 

三、写一个基类继承UIViewController 

基类里面写一个第一层添加 statusView (自定义一个没有网的情况下显示的view 优化) 提供接口

1、- (void) show; (除了statusView.hidden = No 控制器view 其他view hidden = Yes)

2、-(void) remove; (除了statusView.hidden = Yes 控制器view 其他view hidden = No)

3、-(void)updateImage:(UIImage *)img andText:(NSString *)text andButtonText:(NSString *)buttonText andButtonType:(MCStateViewButtonType)type  

statusView 不同的类型:1.当前无网时 2.请求无数据3.网络请求失败4.等等可自己定义

 

posted @ 2016-04-26 19:09  俊华的博客  阅读(707)  评论(0编辑  收藏  举报