1. 程式人生 > >IOS網路——檢測網路狀態:Reachability

IOS網路——檢測網路狀態:Reachability

轉自:http://www.bubuko.com/infodetail-650914.html

1.iOS平臺是按照一直有網路連線的思路來設計的,開發者利用這一特點創造了很多優秀的第三方應用。大多數的iOS應用都需要聯網,甚至有些應用嚴重依賴網路,沒有網路就無法正常工作。

2.在你的應用嘗試通過網路獲取資料之前,你需要知道當前裝置是否知道連線上了網路,甚至有時候你可能還需要知道當前網路是由wifi還是由移動蜂窩網路提供的。

3.“在網路訪問失敗的時候,應用沒有做出適當的提示”是蘋果的iOS稽核團隊拒絕一個應用的常見理由。蘋果要求你必須先檢測網路連線狀態,當網路不可用的時候以某種方式告知使用者,或者用其他優雅的方式進行處理。

***********************

Reachability類:

1.這個類用於檢測當前網路狀態,它不是SDK的一部分,可以在iOS Developer Library裡找到這份程式碼。

從蘋果網站上下載Reachability.zip檔案,解壓之。

2.重用Reachability類

    (1)把Reachability.h和Reachability.m檔案拖到專案中。

    (2)新增框架:SystemConfiguration.framework。

3.同步的Reachability

    (1)使用同步的方式是比較簡單,匯入Reachability.h標頭檔案,然後通過程式碼檢查網路:

        #import “Reachability.h”

        。。。some code omitted…

        Reachability *reach = [Reachability reachabilityForInternetConnection];

        NetworkStatus status = [reach currentReachabilityStatus];

     (2)通過檢查某個主機能否訪問來判斷當前網路是否可用:

        Reachability *reach = [Reachability reachabilityWithHostName:@“www.apple.com”];

        NetworkStatus status = [reach currentReachabilityStatus];

     (3)案例:

        建立一個工程,並新增Reachability.h和Reachability.m到工程中,並連結SystemConfiguration.framework.

        在AppDelegate.h標頭檔案中匯入Reachability.h,並新增一個例項方法。如圖:

    技術分享            

        在AppDelegate.m中這樣實現:如圖:

            技術分享

4.非同步的Reachability

    (1)非同步的方式稍微複雜,不過通過這種方式可以來訂閱實時的網路狀態變化通知。匯入Reachability.h標頭檔案,然後註冊一個物件來訂閱網路狀態變化的資訊,網路狀態變化的資訊名稱為kReachabilityChanged-Notification.如下:

    [[NSNotificationCenter defaultCenter] addObserver:self

        selector:@selector(reachabilityChanged:)

        name:kReachabilityChangedNotification

        object:nil];

    (2)你需要建立一個Reachability物件例項並開始向外釋出網路狀態變化的訊息://注意要建立一個屬性

    @property (nonatomic) Reachability *internetReachability;

self.internetReachability = [ReachabilityreachabilityForInternetConnection];

    [self.internetReachabilitystartNotifier];

    [selfreachability:self.internetReachability];


    (3)當網路狀態發生變化的時候,Reachability物件將呼叫reachabilityChanged:方法,可以在這個方法裡面獲取當前的網路狀態,然後做相應的處理。

#pragma mark - reachabilityChanged

/*!

 * Called by Reachability whenever status changes.

 */

- (void) reachabilityChanged:(NSNotification *)note

{

    Reachability* curReach = [note object];

    NSParameterAssert([curReach isKindOfClass:[Reachability class]]);

    [self reachability:curReach];

}

- (void)reachability:(Reachability *)reachability

{

    NetworkStatus netStatus = [reachability currentReachabilityStatus];

    BOOL connectionRequired = [reachability connectionRequired];

    NSString* statusString = @"";

    switch (netStatus)

    {

        case NotReachable:        {

            statusString = NSLocalizedString(@"Access Not Available", @"Text field text for access is not available");

            /*

             Minor interface detail- connectionRequired may return YES even when the host is unreachable. We cover that up here...

             */

            connectionRequired = NO;

            break;

        }

        case ReachableViaWWAN:        {

            statusString = NSLocalizedString(@"Reachable WWAN", @"");

            break;

        }

        case ReachableViaWiFi:        {

            statusString= NSLocalizedString(@"Reachable WiFi", @"");

            break;

        }

    }

    if (connectionRequired)

    {

NSString *connectionRequiredFormatString = NSLocalizedString(@"%@, Connection Required", @"Concatenation of status string with connection requirement");

        statusString= [NSString stringWithFormat:connectionRequiredFormatString, statusString];

    }

NSLog(@"connection status = [%@]",statusString);

}

5.原生 Reachability API

前面將的Reachability類實際上是蘋果公司對SCNetworkReachability API的封裝,這個API定義在SystemConfigure.framework庫中。如果有其他特別的需求,也可以直接使用這個原生的SCNetworkReachability類。