在網絡應用開發中,有時需要對用戶設備的網絡狀態進行實時監控,以至于對用戶進行友好提示 或者根據不同網絡狀態處理不一樣的邏輯(如視頻播放app,根據當前的網絡情況自動切換視頻清晰度等等)。用Reachability實現網絡的檢測。
蘋果官方提供了Reachability的示例程序,便于開發者檢測網絡狀態
[https://developer.apple.com/library/ios/samplecode/Reachability/Reachability.zip](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開發實踐之SQLite3
- iOS開發實踐之FMDB
- Obj-C與javascript交互之WebViewJavascriptBridge
- iOS開發實踐之UIWebView
- iOS開發實踐之多線程(基本概念)
- iOS開發實踐之多線程(NSThread)
- iOS開發實踐之多線程(GCD)
- iOS開發實踐之多線程(單例模式)
- iOS開發實踐之xib加載注意問題
- iOS開發實踐之多線程(NSOperation)
- iOS開發實踐之cell下載圖片(NSOperation)
- iOS開發實踐之cell下載圖片(自定義NSOperation)
- iOS開發實踐之cell下載圖片(SDWebImage)
- iOS開發實踐之JSON
- iOS開發實踐之XML
- iOS開發實踐之GET和POST請求
- iOS開發實踐之網絡檢測Reachability
- iOS開發實踐之MD5加密