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网络监听的更多相关文章

  1. iOS 网络监听、判断

    一 网络监听 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary ...

  2. iOS 使用AFNetWorking监听APP网络状态变化(可用于更改缓存策略、提示网络等)

    前言 我们知道在APP开发过程中.监听手机当前的网络状态还是一个非经常常使用的方法,这里我来为大家接受一种使用AFNetWorking来监听当前的网络状态的方法:网络监听对程序开发的帮助有非常多:比方 ...

  3. 从零开始学 Web 之 HTML5(三)网络监听,全屏,文件读取,地理定位接口,应用程序缓存

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  4. java实现网络监听

    Java实现网络监听 import java.net.*; import java.io.*; public class tcpServer { public static void main(Str ...

  5. H5C3--语义标签以及语义标签IE8兼容,表单元素新属性,度量器,自定义属性,dataList,网络监听,文件读取

    HTML5新增标签以及HTML5新增的api     1.H5并不是新的语言,而是html语言的第五次重大修改--版本     2.支持:所有的主流浏览器都支持h5.(chrome,firefox,s ...

  6. Android实现网络监听

    一.Android Wifi常用广播 网络开发中主体会使用到的action: ConnectivityManager.CONNECTIVITY_ACTION WifiManager.WIFI_STAT ...

  7. iOS: 使用KVO监听控制器中数组的变化

    一.介绍: KVO是一种能动态监听到属性值的改变的方式,使用场景非常广泛,这里我只讲如何监听控制器ViewController中数组的变化. 二.了解: 首先我们应该知道KVO是不能直接监听控制器Vi ...

  8. 类似吸顶功能解决ios不能实时监听onscroll的触发问题

    问题:近期项目需要一个类似西东功能,当页面向上滚动160px后div固定在顶部 解决方法:首先,想到的是window.onscroll方法 .fixed{position:fixed;-webkit- ...

  9. Oracle的网络监听配置

    listener.ora.tnsnames.ora和sqlnet.ora这3个文件是关系oracle网络配置的3个主要文件,都是放在$ORACLE_HOME\network\admin目录下.其中li ...

随机推荐

  1. linux命令(4):vmstat命令

    CPU监控如下: vmstat 2 10  //表示每隔2秒运行10次 内存监控如下: vmstat –s 监控进程及CPU.内存状态 如下: top

  2. LeetCode解题报告—— Jump Game & Merge Intervals & Permutation Sequence

    1. Jump Game Given an array of non-negative integers, you are initially positioned at the first inde ...

  3. 深度学习方法:受限玻尔兹曼机RBM(三)模型求解,Gibbs sampling

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. 接下来重点讲一下RBM模型求解 ...

  4. Markdown语法简编

    [笔者按]Markdown语法的最大的特点在于原文语法少而简,内容纯文本化,且生成的版式简洁优雅.本文参考了一些网上的参考文字,经自行精简整理. 区块元素 段落和换行,标题,引用,列表,代码块,分隔线 ...

  5. WebDriver自动化测试工具(2)---基本操作

    一.设置打开的浏览器大小/位置 driver.Manage().Window.Maximize(); //最大化 driver.Manage().Window.Position = , ); //设置 ...

  6. Simditor学习--vuejs集成simditor

    唠叨 因为项目需要我自己研究了和集成在vue方便以后再使用,详情官方文档在这里.希望大家有好的建议提出让我继续改进. simditor介绍 Simditor 是团队协作工具 Tower 使用的富文本编 ...

  7. 不同版本的jquery的复选框checkbox的相关问题

    在尝试写复选框时候遇到一个问题,调试了很久都没调试出来,极其郁闷: IE10,Chrome,FF中,对于选中状态,第一次$('#checkbox').attr('checked',true)可以实现 ...

  8. Linux的重定向与管道

    (1).输出重定向 定义:将命令的标准输出结果保存到指定的文件中,而不是直接显示在显示器上. 输出重定向使用>和>>操作符. 语法:cmd > filename,表示将标准输出 ...

  9. XML--读写操作

    XML文档的相关操作 1.配置文件:在实际项目开发中,XML作为配置文件是不可取代的(框架中的部分功能可以以注解形式来取代) (1) 不同技术,XML配置文件的作用也不一样. (2) 比如当前和这个阶 ...

  10. Python开发基础-Day8-装饰器扩展和迭代器

    wraps模块 让原函数保留原来的说明信息 import time import random from functools import wraps def auth(func): '''auth ...