很多情况下会用到这个功能,距离来说现在比较火的微视,有一个功能就是在WiFi环境下自动播放微视,而在3G环境下则需要用户点击才会开始播放.
包括在线音频,视频或者包含大量图片的应用都可以通过这个功能来为用户节省宝贵的流量.
用到的东西就叫做Reachability,可以在https://github.com/tonymillion/Reachability下载完整三方库和文档.
如果想要使用Reachability的话需要引入SystemConfiguration.framework
简单的Demo:
//
// NESMainViewController.m
// ReachabilityDemo
//
// Created by Nestor on 14-3-2.
// Copyright (c) 2014年 NesTalk. All rights reserved.
//
#import "NESMainViewController.h"
#import "Reachability.h"
@interface NESMainViewController ()
@property (nonatomic,retain) UILabel *lab;
@end
@implementation NESMainViewController
-(void)changeStatus:(NSNotification *)sender
{
Reachability *reach = sender.object;
switch (reach.currentReachabilityStatus) {
case ReachableViaWWAN:
self.lab.text = @"通过3G连接";
break;
case NotReachable:
self.lab.text = @"没有连接";
break;
case ReachableViaWiFi:
self.lab.text = @"通过WiFi连接";
break;
}
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.lab = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, 300, 30)];
[self.view addSubview:self.lab];
Reachability *reach = [Reachability reachabilityWithHostname:@"www.163.com"];
reach.reachableOnWWAN = NO;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeStatus:) name:kReachabilityChangedNotification object:nil];
[reach startNotifier];
}
@end
Reachability *reach = [Reachability reachabilityWithHostname:@"www.163.com"];
创建了一个Reachbility对象,参数为需要连接的服务器地址
reach.reachableOnWWAN = NO;
意思是禁用3G连接
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeStatus:) name:kReachabilityChangedNotification object:nil];
通过通知中心添加了一个监听,在网络连接状态发生改变的时候会调用changeStatus:方法
switch (reach.currentReachabilityStatus) {
case ReachableViaWWAN:
self.lab.text = @"通过3G连接";
break;
case NotReachable:
self.lab.text = @"没有连接";
break;
case ReachableViaWiFi:
self.lab.text = @"通过WiFi连接";
break;
}
这里则是针对不同的连接状态进行的对应处理,非常简单~
当然,Reachability还提供了更简单的实现方式,一个block就可以搞定了,如果了解GCD的话会好理解很多,关于GCD的内容这里不展开讨论
reach.reachableBlock = ^(Reachability *reach){
dispatch_async(dispatch_get_main_queue(), ^{
self.lab.text = @"连接可用,通过block修改";
});
NSLog(@"连接可用");
};
reach.unreachableBlock = ^(Reachability *reach)
{
dispatch_async(dispatch_get_main_queue(), ^{
self.lab.text = @"连接不可用,通过block修改";
});
NSLog(@"连接不可用");
};
通过两个block来指定在连接状态发生改变的时候要执行的操作,需要注意的是,这两个block会在子线程中运行,但是对于UI的修改必须在主线程中完成,所以需要通过GCD回调主线程