1、首先导入一个公共类Reachability.h文件:

#import <Foundation/Foundation.h>
#import <SystemConfiguration/SystemConfiguration.h>
#import <netinet/in.h>typedef enum : NSInteger {NotReachable = 0,ReachableViaWiFi,ReachableViaWWAN
} NetworkStatus;extern NSString *kReachabilityChangedNotification;@interface Reachability : NSObject/*!* Use to check the reachability of a given host name.*/
+ (instancetype)reachabilityWithHostName:(NSString *)hostName;/*!* Use to check the reachability of a given IP address.*/
+ (instancetype)reachabilityWithAddress:(const struct sockaddr_in *)hostAddress;/*!* Checks whether the default route is available. Should be used by applications that do not connect to a particular host.*/
+ (instancetype)reachabilityForInternetConnection;/*!* Checks whether a local WiFi connection is available.*/
+ (instancetype)reachabilityForLocalWiFi;/*!* Start listening for reachability notifications on the current run loop.*/
- (BOOL)startNotifier;
- (void)stopNotifier;- (NetworkStatus)currentReachabilityStatus;/*!* WWAN may be available, but not active until a connection has been established. WiFi may require a connection for VPN on Demand.*/
- (BOOL)connectionRequired;@end

Reachability.m 文件:

#import <arpa/inet.h>
#import <ifaddrs.h>
#import <netdb.h>
#import <sys/socket.h>#import <CoreFoundation/CoreFoundation.h>#import "Reachability.h"NSString *kReachabilityChangedNotification = @"kNetworkReachabilityChangedNotification";#pragma mark - Supporting functions#define kShouldPrintReachabilityFlags 1static void PrintReachabilityFlags(SCNetworkReachabilityFlags flags, const char* comment)
{
#if kShouldPrintReachabilityFlagsNSLog(@"Reachability Flag Status: %c%c %c%c%c%c%c%c%c %s\n",(flags & kSCNetworkReachabilityFlagsIsWWAN)                ? 'W' : '-',(flags & kSCNetworkReachabilityFlagsReachable)            ? 'R' : '-',(flags & kSCNetworkReachabilityFlagsTransientConnection)  ? 't' : '-',(flags & kSCNetworkReachabilityFlagsConnectionRequired)   ? 'c' : '-',(flags & kSCNetworkReachabilityFlagsConnectionOnTraffic)  ? 'C' : '-',(flags & kSCNetworkReachabilityFlagsInterventionRequired) ? 'i' : '-',(flags & kSCNetworkReachabilityFlagsConnectionOnDemand)   ? 'D' : '-',(flags & kSCNetworkReachabilityFlagsIsLocalAddress)       ? 'l' : '-',(flags & kSCNetworkReachabilityFlagsIsDirect)             ? 'd' : '-',comment);
#endif
}static void ReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void* info)
{
#pragma unused (target, flags)NSCAssert(info != NULL, @"info was NULL in ReachabilityCallback");NSCAssert([(__bridge NSObject*) info isKindOfClass: [Reachability class]], @"info was wrong class in ReachabilityCallback");Reachability* noteObject = (__bridge Reachability *)info;// Post a notification to notify the client that the network reachability changed.[[NSNotificationCenter defaultCenter] postNotificationName: kReachabilityChangedNotification object: noteObject];
}#pragma mark - Reachability implementation@implementation Reachability
{BOOL _alwaysReturnLocalWiFiStatus; //default is NO
    SCNetworkReachabilityRef _reachabilityRef;
}+ (instancetype)reachabilityWithHostName:(NSString *)hostName
{Reachability* returnValue = NULL;SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, [hostName UTF8String]);if (reachability != NULL){returnValue= [[self alloc] init];if (returnValue != NULL){returnValue->_reachabilityRef = reachability;returnValue->_alwaysReturnLocalWiFiStatus = NO;}}return returnValue;
}+ (instancetype)reachabilityWithAddress:(const struct sockaddr_in *)hostAddress
{SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *)hostAddress);Reachability* returnValue = NULL;if (reachability != NULL){returnValue = [[self alloc] init];if (returnValue != NULL){returnValue->_reachabilityRef = reachability;returnValue->_alwaysReturnLocalWiFiStatus = NO;}}return returnValue;
}+ (instancetype)reachabilityForInternetConnection
{struct sockaddr_in zeroAddress;bzero(&zeroAddress, sizeof(zeroAddress));zeroAddress.sin_len = sizeof(zeroAddress);zeroAddress.sin_family = AF_INET;return [self reachabilityWithAddress:&zeroAddress];
}+ (instancetype)reachabilityForLocalWiFi
{struct sockaddr_in localWifiAddress;bzero(&localWifiAddress, sizeof(localWifiAddress));localWifiAddress.sin_len = sizeof(localWifiAddress);localWifiAddress.sin_family = AF_INET;// IN_LINKLOCALNETNUM is defined in <netinet/in.h> as 169.254.0.0.localWifiAddress.sin_addr.s_addr = htonl(IN_LINKLOCALNETNUM);Reachability* returnValue = [self reachabilityWithAddress: &localWifiAddress];if (returnValue != NULL){returnValue->_alwaysReturnLocalWiFiStatus = YES;}return returnValue;
}#pragma mark - Start and stop notifier- (BOOL)startNotifier
{BOOL returnValue = NO;SCNetworkReachabilityContext context = {0, (__bridge void *)(self), NULL, NULL, NULL};if (SCNetworkReachabilitySetCallback(_reachabilityRef, ReachabilityCallback, &context)){if (SCNetworkReachabilityScheduleWithRunLoop(_reachabilityRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode)){returnValue = YES;}}return returnValue;
}- (void)stopNotifier
{if (_reachabilityRef != NULL){SCNetworkReachabilityUnscheduleFromRunLoop(_reachabilityRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);}
}- (void)dealloc
{[self stopNotifier];if (_reachabilityRef != NULL){CFRelease(_reachabilityRef);}
}#pragma mark - Network Flag Handling- (NetworkStatus)localWiFiStatusForFlags:(SCNetworkReachabilityFlags)flags
{PrintReachabilityFlags(flags, "localWiFiStatusForFlags");NetworkStatus returnValue = NotReachable;if ((flags & kSCNetworkReachabilityFlagsReachable) && (flags & kSCNetworkReachabilityFlagsIsDirect)){returnValue = ReachableViaWiFi;}return returnValue;
}- (NetworkStatus)networkStatusForFlags:(SCNetworkReachabilityFlags)flags
{PrintReachabilityFlags(flags, "networkStatusForFlags");if ((flags & kSCNetworkReachabilityFlagsReachable) == 0){// The target host is not reachable.return NotReachable;}NetworkStatus returnValue = NotReachable;if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0){/*If the target host is reachable and no connection is required then we'll assume (for now) that you're on Wi-Fi...*/returnValue = ReachableViaWiFi;}if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||(flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0)){/*... and the connection is on-demand (or on-traffic) if the calling application is using the CFSocketStream or higher APIs...*/if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0){/*... and no [user] intervention is needed...*/returnValue = ReachableViaWiFi;}}if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN){/*... but WWAN connections are OK if the calling application is using the CFNetwork APIs.*/returnValue = ReachableViaWWAN;}return returnValue;
}- (BOOL)connectionRequired
{NSAssert(_reachabilityRef != NULL, @"connectionRequired called with NULL reachabilityRef");SCNetworkReachabilityFlags flags;if (SCNetworkReachabilityGetFlags(_reachabilityRef, &flags)){return (flags & kSCNetworkReachabilityFlagsConnectionRequired);}return NO;
}- (NetworkStatus)currentReachabilityStatus
{NSAssert(_reachabilityRef != NULL, @"currentNetworkStatus called with NULL SCNetworkReachabilityRef");NetworkStatus returnValue = NotReachable;SCNetworkReachabilityFlags flags;if (SCNetworkReachabilityGetFlags(_reachabilityRef, &flags)){if (_alwaysReturnLocalWiFiStatus){returnValue = [self localWiFiStatusForFlags:flags];}else{returnValue = [self networkStatusForFlags:flags];}}return returnValue;
}@end

2、开启网络监听,注册通知

// 开启网络状况的监听
    [[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(reachabilityChanged:)name:kReachabilityChangedNotificationobject:nil];self.reachability = [Reachability reachabilityWithHostName:@"www.baidu.com"];[self.reachability startNotifier];

3、监听到通知,作相应的操作

- (void)reachabilityChanged:(NSNotification* )note
{Reachability *curReach  = [note object];NetworkStatus status    = [curReach currentReachabilityStatus];NSLog(@"网络状态值: %ld", (long)status);// 根据网络状态值,在这里做你想做的事// ...
}

转载于:https://www.cnblogs.com/angongIT/p/5333085.html

app启动监听网络类型相关推荐

  1. Android 第十九课 大喇叭--广播机制----动态注册监听网络变化与静态注册实现开机启动

    为了便于进行 系统级别的消息通知,Android引入了一套广播消息机制. 1.广播机制简介: 因为Android中的每个应用程序都可以对自己感兴趣的广播尽心注册,这样程序只会接收自己所关心的广播内容, ...

  2. 使用Service和BroadcastReceiver实时监听网络状态

    很多时候我们都需要实时监听网络状态,当网络状态发生变化后通知程序实行不同的策略.  这里,我采用Service+BroadcastReceiver的形式实时监听网络变化. 原理是程序在背后启一个Ser ...

  3. Android实时监听网络状态

    Android开发实时监听网络状态变化一般有两种方法: 1. 新建一个基类BasicActivity.class,在基类中注册网络监听广播NetworkChangeReceiver.class,所有页 ...

  4. 初识广播机制(监听网络状态的改变,监听网络是否可以使用)

    Android系统中的广播机制比较灵活,因为Android中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容,这些广播可能是来自于系统的,也可能是来自于其他应 ...

  5. 10.22 tcpdump:监听网络流量

    [功能说明] tcpdump命令是一个截获网络数据包的包分析工具.tcpdump可以将网络中传送的数据包的"头"完全截获下来以提供分析.它支持针对网络层.协议.主机.端口等的过滤, ...

  6. Windows Phone 8 获取与监听网络连接状态

    现在的只能手机对网络的依赖程度都很高,尤其是新闻.微博.音乐.视频.VOIP通话.游戏等 事实性高的信息类应用,但是目前国内的信息费仍然高居不下,更多的用户只有在 WIFI 的环境下才愿意进行大数据量 ...

  7. 深入分析Android监听网络变化的坑

    Android开发的同学都知道,在很多场景下我们需要监听网络变化,从而做一些业务逻辑比如刷新数据.于是我们会找到这样一个广播:ConnectivityManager.CONNECTIVITY_ACTI ...

  8. 微信小程序 - 全局监听globalData的某个属性变化,例如监听网络状态切换

    前言 近日公司小程序项目中有个需求,商品列表页及商品详情页配置视频,视频在WiFi环境下自动播放,非WiFi环境下暂停播放. 一.小程序有获取网络类型的API wx.getNetworkType(Ob ...

  9. lsnrctl start启动监听很慢(AIX平台)

    今天登陆了一下公司AIX平台的ORACLE测试服务器,没有配置监听,由于手动配置监听后,启动监听,发现启动的时候很慢,日志如下: 欢迎大家加入ORACLE超级群:17115662 免费解决各种ORAC ...

最新文章

  1. iOS下JS与OC互相调用(八)--Cordova详解+实战
  2. 今天微软的office 2010终于发布了!
  3. ASP 投票系统所用技术小结
  4. @requestparam map 接收前端的值_前端面试总结篇(初级)
  5. 将本地镜像发布到阿里云
  6. proftpd的配置
  7. (18)VHDL实现译码器
  8. 学会查找问题的源头:《全屏游戏中自动切出到桌面的问题解决(二)》
  9. vscode使用vuex数据持久化插件(vuex-persistedstate)
  10. 一文读懂C++程序的结构、执行与编译
  11. 什么是pytorch(3神经网络)(翻译)
  12. HUSTOJ教程(1)——安装部署
  13. 使用博图V15和S7-PLCSIM Advanced V2.0以S7-1500PLC仿真Modbus TCP
  14. 点进来看看,这篇文章告诉你什么软件可以识别PDF中的文字!
  15. 2020.10-2021.01前端开发部分总结
  16. 嵩天老师python爬虫笔记整理week3
  17. 页面自动获取导入excel内容
  18. 【美团 技术篇】美团推荐算法实践
  19. 曹云金回应公式相声_疑砸挂曹云金?阎鹤祥封箱大典开玩笑要退社,郭德纲回复亮了!...
  20. Nginx 之实现原理

热门文章

  1. 漫步数学分析番外五(上)
  2. 制作U盘启动盘之Ubuntu
  3. 【C#】C#实现鼠标滚轮的图像居中缩放
  4. LeetCode —— 146. LRU缓存机制(Python)
  5. leetcode —— 面试题54. 二叉搜索树的第k大节点
  6. leetcode —— 面试题68 - II. 二叉树的最近公共祖先
  7. MATLAB三维散点图的绘制(scatter3、plot3),同时标明序号
  8. Hibernate通用Dao实现
  9. virtualbox禁用硬件虚拟化_Mac版Virtualbox6.1开启嵌套虚拟化
  10. java web 生命周期_JavaWeb的生命周期