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. cf786a

    title: CodeForces 786A Berzerk data: 2018-3-3 10:29:40 tags: 博弈论 bfs 无限 with draw copyright: true ca ...

  2. django使用haystack对接Elasticsearch实现商品搜索

    # 原创,转载请留言联系 前言: 在做一个商城项目的时候,需要实现商品搜索功能. 说到搜索,第一时间想到的是数据库的 select * from tb_sku where name like %苹果手 ...

  3. linux命令(1):sed命令

    实例一: Config_file文件内容如下: sed去除注释行:sed -i -c -e '/^#/d' config_file  [会删除指定文件带有注释行] sed去除空行: sed -i -c ...

  4. Restful Framework (二)

    目录 一.认证 二.权限 三.限制访问频率 四.总结 一.认证(补充的一个点) 回到顶部 认证请求头 #!/usr/bin/env python # -*- coding:utf-8 -*- from ...

  5. Sqrt(x)——二分法,防越界

    Implement int sqrt(int x). Compute and return the square root of x. 转自:http://blog.csdn.net/doc_sgl/ ...

  6. “无法在web服务器上启动调试,不是Debugger User组成员..."

    在使用VS.net2003开发asp.net项目时,有时候在你调试项目时,会提示”无法在web服务器上启动调试,不是Debugger User组成员..."这样一个错误信息.很是让人头疼,一 ...

  7. centos 7 开机启动配置

    centos 7 开机启动 1 开机启动配置文件位于/usr/lib/systemd/system/ 2 nginx的配置[Unit]Description=nginx - high performa ...

  8. 关于在windows下部署发布QT程序的总结

    原文请看:http://www.cnblogs.com/javaexam2/archive/2011/05/18/2632916.html 关于在windows下部署发布QT程序的总结 2008-06 ...

  9. thinkjphp 模板中获取url中的action

    <if condition="ACTION_NAME eq 'add'">新增<else/>编辑</if>

  10. Codeforces 714B. Filya and Homework

    题目链接:http://codeforces.com/problemset/problem/714/B 题意: 给你一个含有 n 个数的数组, 问你是否存在一个 x, 使得这个数组中的某些数加上 x, ...