2014年3月23日

在iOS應用程式中偵測網路環境的異動 - 使用Reachability範例


在iOS應用程式中偵測網路環境的異動 - 使用Reachability範例

隨著行動裝置與網路的普及,在主從式架構(Client–server model)的設計中,行動裝置理所當然地扮演了客戶端(Client)的角色。而客戶端是否能隨時了解與伺服器端(Server)的連線狀況,並針對連線異動時在第一時間內做出最佳的處理,將大大地影響著使用者體驗及評價。
Reachability範例是Apple官方網站所提供,展示如何使用SystemConfiguration這個 framework來偵測網路環境的變化。
Reachability可以偵測:
  1. 是否可以連上某個Host
  2. 是否有連上網際網路
  3. 是否有連上Local Wi-Fi

使用Reachability

使用Reachability非常簡單,只要在下載Apple官方網站中的Reachability範例,將其中的Reachability.h與Reachability.m放入你的專案中即可。
此外,在使用Reachability類別的程式碼中,不要忘了import Reachability.h檔。

建立Reachability物件

建立Reachability時,要決定此Reachability物件負責偵測的項目:(1)是否可以連上某個Host, (2)是否有連上網際網路, (3)或是否有連上Local Wi-Fi:
偵測是否有連上網際網路
Reachability *hostReachability = [Reachability reachabilityWithHostName:@"www.maxkit.com.tw"];
偵測是否可以連上某個Host
Reachability *hostReachability = [Reachability reachabilityForInternetConnection];
偵測是否有連上Local Wi-Fi
Reachability *hostReachability = [Reachability reachabilityForLocalWiFi];

註冊網路環境異動時的Callback函式

當網路環境異動時,Reachability使用了NSNotificationCenter來通知,通知名稱為kReachabilityChangedNotification,此字串定義在Reachability.h。
因此,在開始偵測之前,我們需要註冊Callback函式來處理當前的異動。 假設我們的Callback函式名稱為reachabilityChanged,範例如下:
//在某處註冊(如:某個view的viewDidLoad)
[[NSNotificationCenter defaultCenter] addObserver:self 
    selector:@selector(reachabilityChanged:)
     name:kReachabilityChangedNotification object:nil];

//實作reachabilityChanged
- (void) reachabilityChanged:(NSNotification *)note
{
    Reachability* reachability = [note object];
    // do something...
}

由Reachability物件取得網路狀態

欲取得當前網路狀態,要使用Reachability物件的currentReachabilityStatus方法,來取得NetworkStatus物件:
NetworkStatus netStatus = [reachability currentReachabilityStatus];
NetworkStatus是一個enum形態的變數,定義於Reachability.h:
typedef enum : NSInteger {
    NotReachable = 0,
    ReachableViaWiFi,
    ReachableViaWWAN
} NetworkStatus;

結語

Reachability範例相當易於使用,卻也非常實用。若欲了解Apple官方如何使用SystemConfiguration framework來實作這些功能,也可直接研讀Reachability的程式碼。故在此推薦給各位這個易用又實用的範例程式。