iOS開發實踐之網絡檢測Reachability
在網絡應用開發中。有時須要對用戶設備的網絡狀態進行實時監控。以至於對用戶進行友好提示 或者依據不同網絡狀態處理不一樣的邏輯(如視頻播放app,依據當前的網絡情況自己主動切換視頻清晰度等等)。用Reachability實現網絡的檢測。
蘋果官方提供了Reachability的演示樣例程序,便於開發人員檢測網絡狀態
https://developer.apple.com/library/ios/samplecode/Reachability/Reachability.zip
1、 網絡狀態枚舉NetworkStatus:
NotReachable = 0, //沒有網絡
ReachableViaWiFi, //Wi-Fi網絡
ReachableViaWWAN //移動網絡(非Wi-Fi)
2、Reachability經常用法:
/*! * 通過host實例化Reachability */ + (instancetype)reachabilityWithHostName:(NSString *)hostName; /*! * 通過ip地址實例化Reachability */ + (instancetype)reachabilityWithAddress:(const struct sockaddr_in *)hostAddress; /*! * 獲取網絡連接對象 */ + (instancetype)reachabilityForInternetConnection; /*! * 獲取Wi-Fi鏈接對象 */ + (instancetype)reachabilityForLocalWiFi; /*! * 監聽網絡變化方法 */ - (BOOL)startNotifier; //開始監聽 - (void)stopNotifier; //停止監聽 //當前網絡連接狀態 - (NetworkStatus)currentReachabilityStatus;
3、監聽網絡變化:kReachabilityChangedNotification
3.1、註冊網絡狀態通知
[[NSNotificationCenter defaultCenter]addObserver:selfselector:@selector(netWorkStatusChange)name:kReachabilityChangedNotificationobject:nil];
3.2、 獲取Reachability對象
self.reachability = [Reachability
reachabilityForInternetConnection
3.3、開始監聽網絡變化
[self.reachability startNotifier];
3.4、關閉通知並釋放對象
-(void)dealloc{
[self.reachabilitystopNotifier];
[[NSNotificationCenter defaultCenter]removeObserver:self];
}
4、Reachability的使用步驟
4.1、加入框架SystemConfiguration.framework(xocde5之後自己主動加入)
4.2、引入源碼
4.3、導入頭文件
#import "Reachability.h"
4.4、假設Reachability執行報arc錯誤。
則源代碼設置arc編譯環境(眼下最新下載Reachability是arc模式)。
假設你的項目使用的非 ARC 模式。則為 ARC 模式的代碼文件增加 -fobjc-arc 標簽。
假設你的項目使用的是 ARC 模式,則為非 ARC 模式的代碼文件增加 -fno-objc-arc 標簽。
5、栗子:
NetWorkTool.m
#import "NetWorkTool.h" #import "Reachability.h" @implementation NetWorkTool //檢查是否Wi-Fi網絡 +(BOOL)isEnableWIFI{ return [[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable; } //檢查是否移動網絡 +(BOOL)isEnableWWAN{ //return [[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable; return [[Reachability reachabilityForInternetConnection] currentReachabilityStatus] == ReachableViaWWAN; } @end
ViewController.m
#import "ViewController.h" #import "Reachability.h" #import "NetWorkTool.h" @interface ViewController () @property(nonatomic,strong) Reachability *reachability; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //註冊網絡狀態通知 [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(netWorkStatusChange) name:kReachabilityChangedNotification object:nil]; //獲取Reachability對象 self.reachability = [Reachability reachabilityForInternetConnection]; //開始監聽網絡變化 [self.reachability startNotifier]; } //關閉通知並釋放對象 -(void)dealloc{ [self.reachability stopNotifier]; [[NSNotificationCenter defaultCenter] removeObserver:self]; } //網絡變化 -(void)netWorkStatusChange{ NSLog(@"當前網絡發生改變"); [self checkCurNetWork]; } //檢測網絡 -(void) checkCurNetWork{ if ([NetWorkTool isEnableWIFI]) { NSLog(@"當前網絡為Wi-Fi網絡"); }else if ([NetWorkTool isEnableWWAN]){ NSLog(@"當前網絡為移動網絡"); }else{ NSLog(@"沒網絡連接"); } }
iOS開發實踐之網絡檢測Reachability