亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS實現實時檢測網絡狀態的示例代碼

2020-07-26 02:45:27
字體:
來源:轉載
供稿:網友

前言

在網絡應用中,需要對用戶設備的網絡狀態進行實時監控,有兩個目的:

(1)讓用戶了解自己的網絡狀態,防止一些誤會(比如怪應用無能)

(2)根據用戶的網絡狀態進行智能處理,節省用戶流量,提高用戶體驗

  WIFI/3G網絡:自動下載高清圖片

  低速網絡:只下載縮略圖

  沒有網絡:只顯示離線的緩存數據

最近在工作中遇到一個功能就是根據用戶當前的網絡狀,用戶未聯網需要提示一下,如果是Wifi可以推薦一些圖片新聞,如果是3G模式設置為無圖的模式,獲取網絡狀態比較簡單,畢竟中國現在的流量還是一個比較貴的狀態,哪天用戶發現App消耗流量過多說不定就干掉了App 。 不過蘋果的 Reachability 都解決了以上問題,使用起來也比較方便,所以就總結以下,具體的稍微簡單分析下,下面話不多說,來一起看看詳細的介紹:

示例代碼

Reachability.h頭文件代碼:

#import <Foundation/Foundation.h> #import <SystemConfiguration/SystemConfiguration.h> #import <netinet/in.h>  //http://www.cnblogs.com/xiaofeixiang 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 1 static void PrintReachabilityFlags(SCNetworkReachabilityFlags flags, const char* comment) { #if kShouldPrintReachabilityFlags  NSLog(@"Reachability Flag Status: %c%c %c%c%c%c%c%c%c %s/n",   //當前網絡2G/3G/4G蜂窩網絡   (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");  //http://www.cnblogs.com/xiaofeixiang  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; } //通過域名進行實例化 博客園-Fly_Elephant + (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; } //通過ip地址實例化Reachability + (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]; } //檢測當前網絡是否能夠聯上wifi + (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 voidvoid *)(self), NULL, NULL, NULL};  //SCNetworkReachabilitySetCallback函數為指定一個target  //當設備對于這個target鏈接狀態發生改變時(比如斷開鏈接,或者重新連上),則回調reachabilityCallback函數,  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

AppDelegate中的實現:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  //添加一個系統通知  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];  //初始化  self.internetReachability=[Reachability reachabilityForInternetConnection];  //通知添加到Run Loop  [self.internetReachability startNotifier];  [self updateInterfaceWithReachability:_internetReachability];  return YES; } 

回調函數:

(void) reachabilityChanged:(NSNotification *)note {  Reachability* curReach = [note object];  NSParameterAssert([curReach isKindOfClass:[Reachability class]]);  [self updateInterfaceWithReachability:curReach]; } - (void)updateInterfaceWithReachability:(Reachability *)reachability {  NetworkStatus netStatus = [reachability currentReachabilityStatus];  switch (netStatus) {  case NotReachable:   NSLog(@"====當前網絡狀態不可達=======http://www.cnblogs.com/xiaofeixiang");   break;  case ReachableViaWiFi:   NSLog(@"====當前網絡狀態為Wifi=======博客園-Fly_Elephant");   break;  case ReachableViaWWAN:   NSLog(@"====當前網絡狀態為3G=======keso");   break;  } } 

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精视频免费在线久久完整在线看| 色久欧美在线视频观看| 一区二区成人精品| 欧美精品一本久久男人的天堂| 欧洲s码亚洲m码精品一区| 国产精品羞羞答答| 国产成人精品视| 欧洲日韩成人av| 中国china体内裑精亚洲片| 成人做爰www免费看视频网站| 欧美性高跟鞋xxxxhd| 日韩精品视频免费在线观看| 国产欧美在线看| 亚洲精品狠狠操| 午夜精品三级视频福利| 国产欧美一区二区三区视频| 久久久免费观看视频| 日韩精品福利在线| 国产精品91视频| 国产偷国产偷亚洲清高网站| 国产精品一区二区久久国产| 海角国产乱辈乱精品视频| 日韩在线免费高清视频| 国产男人精品视频| 日韩高清中文字幕| 欧美激情精品久久久久久| 91av在线免费观看| 日韩视频一区在线| 美女av一区二区| 国产97人人超碰caoprom| 色琪琪综合男人的天堂aⅴ视频| 欧美激情2020午夜免费观看| 亚洲第一福利网| 久久精品视频免费播放| 日韩久久免费视频| 国产91精品网站| 亚洲第一综合天堂另类专| 国产精品一区二区久久国产| 黑人精品xxx一区一二区| 欧美激情欧美激情| 欧美麻豆久久久久久中文| 国产剧情久久久久久| 亚洲一区二区中文| 欧美自拍视频在线| 伊人久久免费视频| 亚洲欧美日韩国产中文专区| 亚洲男人天堂网| 亚洲性生活视频在线观看| 中文综合在线观看| 亚洲人成网7777777国产| 成人一区二区电影| 亚洲欧美日韩精品久久亚洲区| 国产精品第100页| 精品亚洲永久免费精品| 久久免费精品视频| 久久久久中文字幕| 久久久久久久久国产精品| 久久精品免费电影| 正在播放欧美一区| 欧美贵妇videos办公室| 亚洲第一男人av| 精品国内自产拍在线观看| 2019国产精品自在线拍国产不卡| 国产精品专区一| 国产97色在线|日韩| 久久这里只有精品99| 欧美激情视频给我| 欧美最猛黑人xxxx黑人猛叫黄| 国产精品女人久久久久久| 久久人人爽人人爽人人片av高清| 欧美孕妇孕交黑巨大网站| 国产欧美精品一区二区三区介绍| 性亚洲最疯狂xxxx高清| 久久国产精品影片| 午夜精品久久久久久久99热| 国产精品7m视频| 国产精品极品尤物在线观看| 欧美激情三级免费| 在线观看日韩视频| 久久亚洲精品中文字幕冲田杏梨| 啊v视频在线一区二区三区| 日韩av电影手机在线观看| 日韩极品精品视频免费观看| 亚洲精品电影网| 国产精品国产三级国产专播精品人| 日韩电影免费在线观看| 九九热视频这里只有精品| 国产亚洲精品久久久久久| 亚洲国产成人精品一区二区| 日韩在线视频免费观看高清中文| 国内精品400部情侣激情| 欧美一区二区三区……| 韩国三级日本三级少妇99| 国产香蕉一区二区三区在线视频| 日韩欧美视频一区二区三区| 亚洲欧美国产一本综合首页| 亚洲精品之草原avav久久| 欧美性视频网站| 日本亚洲精品在线观看| 国产偷亚洲偷欧美偷精品| 日韩在线免费视频观看| 91精品国产91久久久久福利| 国产一区二区在线免费| 97色在线观看| 91精品国产777在线观看| 亚洲精品98久久久久久中文字幕| 亚洲国产成人久久综合一区| 欧美视频在线观看 亚洲欧| 欧日韩不卡在线视频| 日韩中文字幕视频| 欧美激情欧美狂野欧美精品| 久久综合免费视频影院| 一级做a爰片久久毛片美女图片| 久久精品视频一| 欧美性猛交xxxx乱大交极品| 91精品综合视频| 亚洲成色www8888| 欧美影院成年免费版| 亚洲有声小说3d| 国产91精品久久久久久| 国产亚洲激情视频在线| 国产精品毛片a∨一区二区三区|国| 最近2019年日本中文免费字幕| www国产精品com| 亚洲男人天堂2019| 91日本视频在线| 国产日韩欧美一二三区| 国产成人拍精品视频午夜网站| 国产婷婷97碰碰久久人人蜜臀| 亚洲精品aⅴ中文字幕乱码| 狠狠色狠狠色综合日日五| 久久久久国产精品免费网站| 亚洲欧美一区二区三区久久| 欧美精品久久久久久久久久| 国产91精品久久久| 亚洲精品av在线播放| 久久久免费高清电视剧观看| 欧美日韩人人澡狠狠躁视频| 国产精品www网站| 亚洲japanese制服美女| 亚洲国产精品中文| 欧美乱妇高清无乱码| 深夜福利国产精品| 精品日韩美女的视频高清| 欧美夜福利tv在线| 26uuu另类亚洲欧美日本一| 国产91精品最新在线播放| 欧美日韩激情网| 成人写真视频福利网| 日韩欧美亚洲综合| 欧美中文在线视频| 热久久免费视频精品| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲高清一二三区| 国产精品6699| 在线激情影院一区| 欧美激情视频一区二区| 国产精品极品美女在线观看免费| 亚洲高清免费观看高清完整版| 欧美一级淫片aaaaaaa视频| 一本色道久久综合狠狠躁篇的优点| 国内揄拍国内精品| 国产欧美一区二区三区久久| 国产精品自产拍在线观|