国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

iOS實(shí)現(xiàn)實(shí)時(shí)檢測網(wǎng)絡(luò)狀態(tài)的示例代碼

2020-07-26 02:45:27
字體:
供稿:網(wǎng)友

前言

在網(wǎng)絡(luò)應(yīng)用中,需要對用戶設(shè)備的網(wǎng)絡(luò)狀態(tài)進(jìn)行實(shí)時(shí)監(jiān)控,有兩個(gè)目的:

(1)讓用戶了解自己的網(wǎng)絡(luò)狀態(tài),防止一些誤會(比如怪應(yīng)用無能)

(2)根據(jù)用戶的網(wǎng)絡(luò)狀態(tài)進(jìn)行智能處理,節(jié)省用戶流量,提高用戶體驗(yàn)

  WIFI/3G網(wǎng)絡(luò):自動下載高清圖片

  低速網(wǎng)絡(luò):只下載縮略圖

  沒有網(wǎng)絡(luò):只顯示離線的緩存數(shù)據(jù)

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

示例代碼

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",   //當(dāng)前網(wǎng)絡(luò)2G/3G/4G蜂窩網(wǎng)絡(luò)   (flags & kSCNetworkReachabilityFlagsIsWWAN)    ? 'W' : '-',   //網(wǎng)絡(luò)是否可達(dá)   (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; } //通過域名進(jìn)行實(shí)例化 博客園-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地址實(shí)例化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; } //檢測是否能夠直接連上互聯(lián)網(wǎng) + (instancetype)reachabilityForInternetConnection {  struct sockaddr_in zeroAddress;  bzero(&zeroAddress, sizeof(zeroAddress));  zeroAddress.sin_len = sizeof(zeroAddress);  zeroAddress.sin_family = AF_INET;  return [self reachabilityWithAddress:&zeroAddress]; } //檢測當(dāng)前網(wǎng)絡(luò)是否能夠聯(lián)上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函數(shù)為指定一個(gè)target  //當(dāng)設(shè)備對于這個(gè)target鏈接狀態(tài)發(fā)生改變時(shí)(比如斷開鏈接,或者重新連上),則回調(diào)reachabilityCallback函數(shù),  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; } //獲取當(dāng)前網(wǎng)絡(luò)狀態(tài) - (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中的實(shí)現(xiàn):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  //添加一個(gè)系統(tǒng)通知  [[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; } 

回調(diào)函數(shù):

(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(@"====當(dāng)前網(wǎng)絡(luò)狀態(tài)不可達(dá)=======http://www.cnblogs.com/xiaofeixiang");   break;  case ReachableViaWiFi:   NSLog(@"====當(dāng)前網(wǎng)絡(luò)狀態(tài)為Wifi=======博客園-Fly_Elephant");   break;  case ReachableViaWWAN:   NSLog(@"====當(dāng)前網(wǎng)絡(luò)狀態(tài)為3G=======keso");   break;  } } 

總結(jié)

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 治县。| 黄骅市| 古浪县| 河东区| 济宁市| 台东县| 正定县| 那坡县| 永寿县| 宁化县| 桐梓县| 太仓市| 临颍县| 泸州市| 北碚区| 红河县| 通海县| 阿克陶县| 左云县| 汾西县| 夹江县| 贵港市| 温州市| 肥乡县| 丹巴县| 寿光市| 若羌县| 佛冈县| 瓦房店市| 鹤峰县| 贡觉县| 凌云县| 秭归县| 龙陵县| 益阳市| 抚远县| 壤塘县| 攀枝花市| 商都县| 蚌埠市| 麟游县|