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

网络连接状态监测几乎任何地方都离不了。进行联网状态监测,最简单的方法是使用第三方框架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 cplusplus
extern  "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中的一次性代码防止重复创建即可。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值