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 = 0,
    ReachableViaWiFi = 2,
    ReachableViaWWAN = 1
};

@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

下面我们用代码实现一下对自己主机的网络的监听

//  ViewController.m
//  网络状态监听
//
//  Created by ma c on 16/01/29.
//  Copyright (c) 2016年 XYQ. All rights reserved.
//

#import "ViewController.h"
#import "Reachability.h"

@interface ViewController ()
@property (strong,nonatomic)Reachability *reachablity;//网络监听对象
@property (assign,nonatomic)BOOL isReachable;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //1.创建网络监听通知
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];

    //2.创建Reachability监听对象
    Reachability *reachablity = [Reachability reachabilityWithHostName:@"localhost"];
    self.reachablity = reachablity;

    //3.开始监听
    [self.reachablity startNotifier];
}

//监听网络类型
-(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

2016-01-29 16:20:18.779 网络状态监听[4854:325480] 是WIFI

时间: 2024-08-10 21:16:39

iOS:Reachability网络监听的相关文章

IOS开发—网络监听

网络监听用到的类为Reachability.h,这个Xcode项目里面是不自带的,需要从github上面下载,在使用的时候记着导入SystemConfiguration.framework. 首先是在AppDelegate.m中设置网络监听 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotifica

iOS手机信号网络监听

//设置网络监听 - (void)monitorNetworking { //监听网络状态 AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager]; //显然是枚举值 /* typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) { AFNetworkReachabilityStatusUnknown = -1,//未识别的网络

ios ---键盘的监听事件

//在view将要出现的时候重载viewWillAppear方法添加通知 监听事件 keyboardWillShow:  keyboardWillHide: - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:

高大上的“网络监听”,其实你也能做!

出来工作一年了,回忆大学那时,我所在专业里有一位大神级人物,他每天都和我们聊一下很“美丽”的事物.他最经常喜欢所得一句话,“一切事物都可以用01表示出来”.那时的他,很喜欢分享,很喜欢去研究一些高大上的问题,数学是他的强项.那时,我们桂林高校的五子棋大赛,他拿了冠军,证明了自己,并不是一个只会说不会做的人.其实我对他还是很有好感的,不过由于各种原因吧,我们交往并不算太深.还记得的那些夜晚,学习和生活上遇到很多困惑,经常很他一起聊到11点半,讨论各种奇怪的事情.从那开始,我就渐渐地更喜欢写程序啦.

网络监听原理(局域网数据窃听)

在网络中,当信息进行传播的时候,可以利用工具,将网络接口设置在监听的模式,便可将网络中正在传播的信息截获或者捕获到,从而进行攻击.网络监听在网络中的任何一个位置模式下都可实施进行.而黑客一般都是利用网络监听来截取用户口令.比如当有人占领了一台主机之后,那么他要再想将战果扩大到这个主机所在的整个局域网话,监听往往是他们选择的捷径.很多时候我在各类安全论坛上看到一些初学的爱好者,在他们认为如果占领了某主机之后那么想进入它的内部网应该是很简单的.其实非也,进入了某主机再想转入它的内部网络里的其它机器也

java实现网络监听

Java实现网络监听 import java.net.*; import java.io.*; public class tcpServer { public static void main(String args[]) { int port; ServerSocket server_socket; BufferedReader input; try { port = Integer.parseInt(args[0]); } catch (Exception e) { System.out.p

转:网络监听原理

网络监听是指利用计算机的网络接口截获目的地为第三方计算机的数据报文的一种技术.利用这种技术可以监听网络的当前流量状况:网络程序的运行以及非法窃取网络中传输的机密信息. 在共享式以太网中,所有的通讯都是广播的,也就是说通常在同一网段的所有网络接口都可以访问在物理媒体上传输的所有数据,使用ARP和RARP协议进行相互转换.在正常的情况下,一个网络接口应该只响应两种数据帧:与自己硬件地址相匹配的数据帧和发向所有机器的广播数据帧.在一个实际的系统中,数据的收发由网卡来完成.每个以太网卡拥有一个全球难一的

iOS开发之监听网络连接,改变,断开

做iOS开发时,我们需要监控/监听网络状况,苹果提供了Reachability.h, Reachability.m. 导入Reachability.h 我们可以在 MainViewController的viewDidLoad方法内部写上: [self checkReachability]; 之后,具体方法如下 #pragma mark #pragma mark Reachability Methods #pragma mark - (void)checkReachability { [[NSNo

iOS 键盘的监听 调整view的位置

iOS在处理键盘的出现和消失时需要监听UIKeyboardWillChangeFrameNotifications/UIKeyboardDidHideNotifications - (void)viewDidLoad { [super viewDidLoad]; //添加监听 键盘消失 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDown) name:UIKeyboardDid