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