1. 程式人生 > >iOS開發實踐之網絡檢測Reachability

iOS開發實踐之網絡檢測Reachability

bsp eight 友好 4.3 port span 官方 ren ref

在網絡應用開發中。有時須要對用戶設備的網絡狀態進行實時監控。以至於對用戶進行友好提示 或者依據不同網絡狀態處理不一樣的邏輯(如視頻播放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