app启动监听网络类型
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启动监听网络类型相关推荐
- Android 第十九课 大喇叭--广播机制----动态注册监听网络变化与静态注册实现开机启动
为了便于进行 系统级别的消息通知,Android引入了一套广播消息机制. 1.广播机制简介: 因为Android中的每个应用程序都可以对自己感兴趣的广播尽心注册,这样程序只会接收自己所关心的广播内容, ...
- 使用Service和BroadcastReceiver实时监听网络状态
很多时候我们都需要实时监听网络状态,当网络状态发生变化后通知程序实行不同的策略. 这里,我采用Service+BroadcastReceiver的形式实时监听网络变化. 原理是程序在背后启一个Ser ...
- Android实时监听网络状态
Android开发实时监听网络状态变化一般有两种方法: 1. 新建一个基类BasicActivity.class,在基类中注册网络监听广播NetworkChangeReceiver.class,所有页 ...
- 初识广播机制(监听网络状态的改变,监听网络是否可以使用)
Android系统中的广播机制比较灵活,因为Android中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容,这些广播可能是来自于系统的,也可能是来自于其他应 ...
- 10.22 tcpdump:监听网络流量
[功能说明] tcpdump命令是一个截获网络数据包的包分析工具.tcpdump可以将网络中传送的数据包的"头"完全截获下来以提供分析.它支持针对网络层.协议.主机.端口等的过滤, ...
- Windows Phone 8 获取与监听网络连接状态
现在的只能手机对网络的依赖程度都很高,尤其是新闻.微博.音乐.视频.VOIP通话.游戏等 事实性高的信息类应用,但是目前国内的信息费仍然高居不下,更多的用户只有在 WIFI 的环境下才愿意进行大数据量 ...
- 深入分析Android监听网络变化的坑
Android开发的同学都知道,在很多场景下我们需要监听网络变化,从而做一些业务逻辑比如刷新数据.于是我们会找到这样一个广播:ConnectivityManager.CONNECTIVITY_ACTI ...
- 微信小程序 - 全局监听globalData的某个属性变化,例如监听网络状态切换
前言 近日公司小程序项目中有个需求,商品列表页及商品详情页配置视频,视频在WiFi环境下自动播放,非WiFi环境下暂停播放. 一.小程序有获取网络类型的API wx.getNetworkType(Ob ...
- lsnrctl start启动监听很慢(AIX平台)
今天登陆了一下公司AIX平台的ORACLE测试服务器,没有配置监听,由于手动配置监听后,启动监听,发现启动的时候很慢,日志如下: 欢迎大家加入ORACLE超级群:17115662 免费解决各种ORAC ...
最新文章
- iOS下JS与OC互相调用(八)--Cordova详解+实战
- 今天微软的office 2010终于发布了!
- ASP 投票系统所用技术小结
- @requestparam map 接收前端的值_前端面试总结篇(初级)
- 将本地镜像发布到阿里云
- proftpd的配置
- (18)VHDL实现译码器
- 学会查找问题的源头:《全屏游戏中自动切出到桌面的问题解决(二)》
- vscode使用vuex数据持久化插件(vuex-persistedstate)
- 一文读懂C++程序的结构、执行与编译
- 什么是pytorch(3神经网络)(翻译)
- HUSTOJ教程(1)——安装部署
- 使用博图V15和S7-PLCSIM Advanced V2.0以S7-1500PLC仿真Modbus TCP
- 点进来看看,这篇文章告诉你什么软件可以识别PDF中的文字!
- 2020.10-2021.01前端开发部分总结
- 嵩天老师python爬虫笔记整理week3
- 页面自动获取导入excel内容
- 【美团 技术篇】美团推荐算法实践
- 曹云金回应公式相声_疑砸挂曹云金?阎鹤祥封箱大典开玩笑要退社,郭德纲回复亮了!...
- Nginx 之实现原理
热门文章
- 漫步数学分析番外五(上)
- 制作U盘启动盘之Ubuntu
- 【C#】C#实现鼠标滚轮的图像居中缩放
- LeetCode —— 146. LRU缓存机制(Python)
- leetcode —— 面试题54. 二叉搜索树的第k大节点
- leetcode —— 面试题68 - II. 二叉树的最近公共祖先
- MATLAB三维散点图的绘制(scatter3、plot3),同时标明序号
- Hibernate通用Dao实现
- virtualbox禁用硬件虚拟化_Mac版Virtualbox6.1开启嵌套虚拟化
- java web 生命周期_JavaWeb的生命周期