iOS:Reachability网络监听
iOS利用Reachability确认网络环境3G/WIFI
开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息。如果没有处理它们,是不会通过Apple的审查的,一般情况下,可以把网络监听放在程序启动时执行。
Apple 的 例程 Reachability 中介绍了取得/检测网络状态的方法。在你的程序中使用 Reachability 只须将该例程中的 Reachability.h 和 Reachability.m 拷贝到你的工程中。如下图:

我们来看看Reachability.h文件中的具体内容:
#import <Foundation/Foundation.h>
#import <SystemConfiguration/SystemConfiguration.h> //! Project version number for MacOSReachability.
FOUNDATION_EXPORT double ReachabilityVersionNumber; //! Project version string for MacOSReachability.
FOUNDATION_EXPORT const unsigned char ReachabilityVersionString[]; /**
* Create NS_ENUM macro if it does not exist on the targeted version of iOS or OS X.
*
* @see http://nshipster.com/ns_enum-ns_options/
**/
#ifndef NS_ENUM
#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
#endif extern NSString *const kReachabilityChangedNotification; //但前网络类型
typedef NS_ENUM(NSInteger, NetworkStatus) {
// Apple NetworkStatus Compatible Names.
NotReachable = ,
ReachableViaWiFi = ,
ReachableViaWWAN =
}; @class Reachability; typedef void (^NetworkReachable)(Reachability * reachability);
typedef void (^NetworkUnreachable)(Reachability * reachability);
typedef void (^NetworkReachability)(Reachability * reachability, SCNetworkConnectionFlags flags); @interface Reachability : NSObject @property (nonatomic, copy) NetworkReachable reachableBlock;
@property (nonatomic, copy) NetworkUnreachable unreachableBlock;
@property (nonatomic, copy) NetworkReachability reachabilityBlock; @property (nonatomic, assign) BOOL reachableOnWWAN; //类方法创建网络监听对象
+(instancetype)reachabilityWithHostname:(NSString*)hostname;
// This is identical to the function above, but is here to maintain
//compatibility with Apples original code. (see .m)
+(instancetype)reachabilityWithHostName:(NSString*)hostname;
+(instancetype)reachabilityForInternetConnection;
+(instancetype)reachabilityWithAddress:(void *)hostAddress;
+(instancetype)reachabilityForLocalWiFi; //实例方法传附件网络监听对象
-(instancetype)initWithReachabilityRef:(SCNetworkReachabilityRef)ref; -(BOOL)startNotifier; //开始监听网络
-(void)stopNotifier; //停止监听网络 -(BOOL)isReachable; //是否没有网
-(BOOL)isReachableViaWWAN; //是否使自带的网络
-(BOOL)isReachableViaWiFi; //是否是WIFI // WWAN may be available, but not active until a connection has been established.
// WiFi may require a connection for VPN on Demand.
-(BOOL)isConnectionRequired; // Identical DDG variant.
-(BOOL)connectionRequired; // Apple's routine.
// Dynamic, on demand connection?
-(BOOL)isConnectionOnDemand;
// Is user intervention required?
-(BOOL)isInterventionRequired; -(NetworkStatus)currentReachabilityStatus; //获取当前网络状态
-(SCNetworkReachabilityFlags)reachabilityFlags;//
-(NSString*)currentReachabilityString;//当前网络字符串
-(NSString*)currentReachabilityFlags; //当前网络标识 @end
下面我们用代码实现一下对自己主机的网络的监听
方法一:直接使用Reachability这两个文件
// 网络状态监听
//
// Created by ma c on 16/01/29.
// Copyright (c) 2016年 XYQ. All rights reserved.
//
#import "AppDelegate.h"
#import "Reachability.h"
@interface AppDelegate ()
@property(nonatomic,strong)Reachability *reachability; //网络监听对象
@end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //创建网络监听
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkStateChange) name:kReachabilityChangedNotification object:nil];
//创建网络监听对象
self.reachability = [Reachability reachabilityForInternetConnection];
//self.reachablity = [Reachability reachabilityWithHostName:@"localhost"]; //本机网络
//开始检测
[self.reachability startNotifier]; return YES;
}
//监听网络类型
-(void)NetWorkState
{
if ([self.reachablity isReachableViaWiFi]) {
NSLog(@"是WIFI");
}
else if([self.reachablity isReachableViaWWAN]){
NSLog(@"是WWAN");
}
else{
NSLog(@"没有网");
}
} //网络链接改变时会调用的方法
-(void)reachabilityChanged:(NSNotification *)note
{
[self NetWorkState]; Reachability *currReach = [note object];
NSParameterAssert([currReach isKindOfClass:[Reachability class]]); //对连接改变做出响应处理动作
NetworkStatus status = [currReach currentReachabilityStatus];
//如果没有连接到网络就弹出提醒实况
self.isReachable = YES;
if(status == NotReachable)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"网络连接异常" message:@"暂无法访问" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];
[alert show];
self.isReachable = NO;
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"网络连接信息" message:@"网络连接正常" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];
[alert show];
self.isReachable = YES;
}
} -(void)dealloc
{
//停止监听,并移除通知
[self.reachablity stopNotifier];
[[NSNotificationCenter defaultCenter]removeObserver:self];
}
@end
输出结果如下:我的电脑连接的就是WIFI
-- ::18.779 网络状态监听[:] 是WIFI

方法二:使用第三方库AFNetworing封装的网络监听方法,创建网络监听管理者进行监听
如何使用AFNetworking做网络监控呢?AFNetworkReachabilityManager这个类中自带着监听网络的方法,同时AFNetworkReachabilityManager还拥有一个枚举,代表着网络状况.
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
AFNetworkReachabilityStatusUnknown = -,//未识别的网络
AFNetworkReachabilityStatusNotReachable = ,//不可达的网络(未连接)
AFNetworkReachabilityStatusReachableViaWWAN = ,//2G,3G,4G...
AFNetworkReachabilityStatusReachableViaWiFi = ,//wifi网络
};
#import "AppDelegate.h"
#import <AFNetworking/AFNetworkReachabilityManager.h> @interface AppDelegate () @property(nonatomic,strong)AFNetworkReachabilityManager *reachabilityManager; @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //创建网络监控对象
self.reachabilityManager = [AFNetworkReachabilityManager sharedManager]; //设置监听
[_reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"未识别的网络");
break; case AFNetworkReachabilityStatusNotReachable:
NSLog(@"不可达的网络(未连接)");
break; case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"2G,3G,4G...的网络");
break; case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"wifi的网络");
break;
default:
break;
}
}]; //开始监听网络状况.
[_reachabilityManager startMonitoring]; return YES;
} -(void)dealloc{ //停止监听网络状况.
[_reachabilityManager stopMonitoring]; }
总结:与Reachability相比之下,AFNetworking是不是代码更加的简练呢?AFNetworking其实封装了Reachability,使我们的代码更加的简单易上手.
iOS:Reachability网络监听的更多相关文章
- iOS 网络监听、判断
		
一 网络监听 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary ...
 - iOS 使用AFNetWorking监听APP网络状态变化(可用于更改缓存策略、提示网络等)
		
前言 我们知道在APP开发过程中.监听手机当前的网络状态还是一个非经常常使用的方法,这里我来为大家接受一种使用AFNetWorking来监听当前的网络状态的方法:网络监听对程序开发的帮助有非常多:比方 ...
 - 从零开始学 Web 之 HTML5(三)网络监听,全屏,文件读取,地理定位接口,应用程序缓存
		
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
 - java实现网络监听
		
Java实现网络监听 import java.net.*; import java.io.*; public class tcpServer { public static void main(Str ...
 - H5C3--语义标签以及语义标签IE8兼容,表单元素新属性,度量器,自定义属性,dataList,网络监听,文件读取
		
HTML5新增标签以及HTML5新增的api 1.H5并不是新的语言,而是html语言的第五次重大修改--版本 2.支持:所有的主流浏览器都支持h5.(chrome,firefox,s ...
 - Android实现网络监听
		
一.Android Wifi常用广播 网络开发中主体会使用到的action: ConnectivityManager.CONNECTIVITY_ACTION WifiManager.WIFI_STAT ...
 - iOS: 使用KVO监听控制器中数组的变化
		
一.介绍: KVO是一种能动态监听到属性值的改变的方式,使用场景非常广泛,这里我只讲如何监听控制器ViewController中数组的变化. 二.了解: 首先我们应该知道KVO是不能直接监听控制器Vi ...
 - 类似吸顶功能解决ios不能实时监听onscroll的触发问题
		
问题:近期项目需要一个类似西东功能,当页面向上滚动160px后div固定在顶部 解决方法:首先,想到的是window.onscroll方法 .fixed{position:fixed;-webkit- ...
 - Oracle的网络监听配置
		
listener.ora.tnsnames.ora和sqlnet.ora这3个文件是关系oracle网络配置的3个主要文件,都是放在$ORACLE_HOME\network\admin目录下.其中li ...
 
随机推荐
- hdu 1426(DFS+坑爹的输入输出)
			
Sudoku Killer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
 - Linux 基础——ls 命令
			
第二天,继续学习Linux命令... 一.查看文件和目录列表的命令 ls:显示当前目录下的文件和目录,但是不会显示隐藏的文件和目录. ls -a:显示当前目录下的所有文件和目录. ls -l:显示当前 ...
 - 使用python读取文本中结构化数据
			
需求 read some .txt file in dir and find min and max num in file. solution: echo *.txt > file.name ...
 - 【转载】JAVA多线程和并发基础面试问答
			
转载自这里. 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题.(校对注: ...
 - 微信小程序-表格形式如何布局?
			
微信小程序没有现成的table标签,该怎么布局呢? <view class="my-grids"> <block wx:for="{{grids}}&q ...
 - [水煮 ASP.NET Web API2 方法论](1-2)在 WebForm 应用程序中添加 ASP.NET Web API
			
问题 怎么样将 Asp.Net Web Api 加入到 Asp.Net Web From 应用程序中 解决方案 在 Visual Studio 2013 中,创建新的 Web From,可以直接在&q ...
 - 使用 gulp 构建一个项目
			
本章将介绍 gulp-watch-path stream-combiner2 gulp-sourcemaps gulp-autoprefixer 您还可以直接学习以下模块: 安装 Node 和 gul ...
 - ubuntu16.04编译安装GPAC
			
参考:http://blog.csdn.net/tianlong_hust/article/details/9273875 1.获取gpac的源代码 sudo apt-get install subv ...
 - 缓存(LruCache)机制
			
LruCache 1.变量 private final LinkedHashMap<K, V> map; private int size;//已经存储的数据大小 private int ...
 - 贪心【CF1029E】Tree with Small Distances
			
Description 给定一棵树.要求往树中加入一些边使得从1到其他节点的距离至多是2 . 输出加入边的最小数量.(边全部都是无向的) Input 第一行一个整数n,表示树中的节点个数. 接下来n− ...