iOS下的實際網路連接狀態檢測:RealReachability

來源:互聯網
上載者:User

iOS下的實際網路連接狀態檢測:RealReachability
序言

網路連接狀態檢測對於我們的iOS app開發來說是一個非常通用的需求。為了更好的使用者體驗,我們會在無網路時展現本地或者緩衝的內容,並對使用者進行合適的提示。對絕大部分iOS開發人員來說,從蘋果範例程式碼改變而來的各種Reachablity架構是實現這個需求的普遍選擇,比如這個庫。但事實上,基於此方案的所有實現,都無法協助我們檢測真正的網路連接狀態,它們能檢測的只是本地串連狀態;這種情況包括但不限於如下情境:
1.現在很流行的公用wifi,需要網頁鑒權,鑒權之前無法上網,但本地串連已經建立;
2.存在了本網串連,但訊號很差,實際無法串連到伺服器;
3.iOS串連的路由裝置本身沒有串連外網。
cocoachina上已有很多網友對此進行提問和吐槽,比如:
如何判斷裝置是否真正連上互連網?而不是只有網路連接
[Reachability reachabilityWithHostName:]完全沒用!

蘋果的Reachability樣本中有如下說明,告訴我們其能力受限於此:
“Reachability cannot tell your application if you can connect to a particular host, only that an interface is available that might allow a connection, and whether that interface is the WWAN.”
蘋果的SCNetworkReachability API則告訴了我們更多:
“Reachability does not guarantee that the data packet will actually be received by the host. ”
而Reachability相關的所有架構在底層實現都是通過SCNetworkReachability進行檢測,所以無法檢測實際網路連接情況。
有鑒於此,筆者希望打造一個通用、簡單、可靠的實際網路連接狀態檢測架構,於是RealReachability誕生了。

RealReachability簡單介紹

RealReachability是筆者2個月之前發布到github的開源庫,目前有1000多個star,200多個fork,幾經修改完善後,當前pod版本為1.1.2。
項目地址如下:
https://github.com/dustturtle/RealReachability。
此架構開發的初衷來源於項目實際需求,離線模式對網路連接狀態的要求比較苛刻,且實際情境經常會遇到“偽串連”的情況,Reachability面對此情境力不從心。多方研究後引入了ping能力(此方案流量開銷最小,也最簡單),實現了簡單的實際網路連接監測;後面經過提煉和最佳化,就有了這個架構。可以告訴大家的是,這個架構在appstore上架應用中已經經受了考驗,目前也不斷完善中,追求穩定的朋友可以使用最新的pod版本(修複了已知的絕大部分問題,參考demo的使用方式即可)。

整合和使用介紹整合最簡便的整合方法當屬pod: pod ‘RealReachability’。 手動整合:將RealReachability檔案夾加入到工程即可。 依賴:Xcode5.0+,支援ARC, iOS6+.項目需要引入SystemConfiguration.framework.使用介紹

其介面的設計和調用方法和Reachability非常相似,大家可以無縫上手,非常方便。
開啟網路監聽(建議在didFinishLaunchingWithOptions中進行監聽):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    [GLobalRealReachability startNotifier];    return YES;}
監聽網路變化通知:
[[NSNotificationCenter defaultCenter] addObserver:self                                             selector:@selector(networkChanged:)                                                 name:kRealReachabilityChangedNotification                                               object:nil];
通知回調程式碼範例:
- (void)networkChanged:(NSNotification *)notification{    RealReachability *reachability = (RealReachability *)notification.object;    ReachabilityStatus status = [reachability currentReachabilityStatus];    NSLog(@"currentStatus:%@",@(status));}
觸發即時網路狀態查詢程式碼範例:
[GLobalRealReachability reachabilityWithBlock:^(ReachabilityStatus status) {        switch (status)        {            case NotReachable:            {            //  case NotReachable handler                break;            }            case ReachableViaWiFi:            {            //  case ReachableViaWiFi handler                break;            }            case ReachableViaWWAN:            {            //  case ReachableViaWWAN handler                break;            }            default:                break;        }    }];
查詢當前實際網路連接狀態:
ReachabilityStatus status = [reachability currentReachabilityStatus];
設定ping檢測用的host伺服器位址(可選):

注意:這裡你需要確保該伺服器支援ping操作。不設定的情況下我們預設使用baidu.com作為ping伺服器。
可以使用自己的伺服器,或者使用穩定、可靠的網路地址(比如百度、qq等)。設定樣本如下:

GLobalRealReachability.hostForPing = @"www.baidu.com";
擷取當前的資料網路連接類型(進階功能):
 WWANAccessType accessType = [GLobalRealReachability currentWWANtype];

該類型可以被用來最佳化應用程式的體驗,比如不同的網路類型下設定不同的網路逾時時間等,關於此方面的最佳化方案,可以參考攜程給出的分享:http://www.infoq.com/cn/articles/how-ctrip-improves-app-networking-performance

Demo:

我們在github的repository中已經包含了簡單的Demo工程,直接下載運行即可。相關的Api調用也可以參考demo中的實現。
demo:

RealReachability的實現原理RealReachability架構圖:

vcfrss6/vFJlYWxSZWFjaGFiaWxpdHm/qtS0tPrC66OpoaM8L3A+DQo8aDIgaWQ9"結束語">結束語

希望這個架構能夠協助到大家的iOS開發! 遇到任何疑問或者使用上的問題,都可以聯絡我,期待與您交流iOS開發技術(可以直接在我的部落格提問或者email給我).

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.