利用Reachability框架进行网络连接状态监测

来源:互联网 发布:手机散热软件 编辑:程序博客网 时间:2024/06/04 17:53

  网络连接状态监测几乎任何地方都离不了。进行联网状态监测,最简单的方法是使用第三方框架Reachability。其实就两个文件Reachability.h和Reachability.m文件,然后导入头文件就可以使用了。

打开Reachability.h文件。最常使用的是

+ (instancetype)reachabilityWithHostName:(NSString *)hostName;  // 创建一个Reachability对象

hostName:是要连接的网址。

- (NetworkStatus)currentReachabilityStatus; 返回枚举值(连接状态)即Reachability.h开头的枚举值

typedefenum : NSInteger {

NotReachable =0,//没有连接

ReachableViaWiFi,// wifi

ReachableViaWWAN // 2G/3G/4G

} NetworkStatus;

最常用的是封装一个方法,整个工程都可以使用。也可以单独使用在开始的时候添加一个通知 并开启监听。具体代码如下:

<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">////  ViewController.m//  联网状态监测////  Created by apple on 15/10/25.//  Copyright (c) 2015年 LiuXun. All rights reserved.//#import "ViewController.h"#import "Reachability.h"@interface ViewController ()@property(nonatomic, strong) Reachability *reach;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];        // 判断是否能连接到一个主机(是否有网)    self.reach = [Reachability reachabilityWithHostName:@"https://www.baidu.com/"];        // 添加一个通知    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(kReachability) name:kReachabilityChangedNotification object:nil];        // 开始监听    [self.reach startNotifier];}-(void)kReachability{    // 判断状态    switch (self.reach.currentReachabilityStatus) {        case NotReachable:            NSLog(@"没有连接");            break;        case ReachableViaWiFi :            NSLog(@"连接的是WIFI");            break;        case ReachableViaWWAN:            NSLog(@"流量连接");            break;    }}-(void)dealloc{    // 停止监听    [self.reach stopNotifier];        // 移除监听  移除控制器内的所有监听    [[NSNotificationCenter defaultCenter] removeObserver:self];}@end</span></span></span>
运行结果如下:


断网后


也可以自己封装一个公共类或公共函数,由于时间问题,只封装了一个简单方法如下所示:


<span style="font-size:18px;"><span style="font-size:18px;">+(BOOL)isConnectionAvailable{    BOOL isExistenceNetwork = YES;        Reachability *reach = [Reachability reachabilityWithHostName:@"www.apple.com"];    switch ([reach currentReachabilityStatus])    {        case NotReachable:            isExistenceNetwork = NO;            break;        case ReachableViaWiFi:            isExistenceNetwork = YES;            break;        case ReachableViaWWAN:            isExistenceNetwork = YES;            break;    }        return isExistenceNetwork;}</span></span>
吃饭回来,再继续封装一个更简单的函数,连类名都省了。

我发现把常用的东西封装在类中没有封装在函数简单,需要注意的是封装函数时要在.h中加c函数声明。我封装一个更简单的专门用于检测网络连接的函数(必须事先导入Reachability框架)。

GeneralFunction.h如下:

<span style="font-size:18px;">////  GeneralFunction.h//  联网状态监测////  Created by apple on 15/10/25.//  Copyright (c) 2015年 LiuXun. All rights reserved.//#import <UIKit/UIKit.h>#ifdef cplusplusextern  "c"{#endif    BOOL isNetWorkConnect(NSString **status);#ifdef cplusplus}#endif</span>
GeneralFunction.m

<span style="font-size:18px;">////  GeneralFunction.m//  联网状态监测////  Created by apple on 15/10/25.//  Copyright (c) 2015年 LiuXun. All rights reserved.//#import "GeneralFunction.h"#import "Reachability.h"BOOL isNetWorkConnect(NSString **status){    BOOL  isConnect = NO;    NSString *connectStr = nil;    Reachability *reach = [Reachability reachabilityWithHostName:@"https://www.baidu.com/"];    switch (reach.currentReachabilityStatus) {        case NotReachable:            isConnect = NO;            connectStr = @"没有连接网络";            break;        case ReachableViaWiFi :            isConnect = YES;            connectStr = @"WIFI连接";            break;        case ReachableViaWWAN :            isConnect = YES;            connectStr = @"流量连接";            break;    }    if (status) {        *status = [connectStr copy];    }        return isConnect;}</span>
调用方法如下:

<span style="font-size:18px;"> NSString *status = nil;    BOOL isconnect = isNetWorkConnect(&status);    NSLog(@"%d—— %@", isconnect, status);</span>

做一下回顾:在函数内需要创建类的对象且需要使用类的一些变量或方法时,也就是联系比较深的时候。为了防止类的对象被提前释放造成程序崩溃,需要将函数内创建的类的对象声明为static类型,加判断或用GCD中的一次性代码防止重复创建即可。



0 0
原创粉丝点击