1. 程式人生 > >iOS實際網路檢測框架RealReachability

iOS實際網路檢測框架RealReachability

背景

網路連線狀態檢測對於我們的iOS app開發來說是一個非常通用的需求。為了更好的使用者體驗,我們會在無網路時展現本地或者快取的內容,並對使用者進行合適的提示。但事實上,當前iOS開發者們普遍使用的網路檢測框架,實際上都無法幫助我們檢測真正的網路連線狀態;它們所能檢測的只是本地連線狀態。 本地連線狀態和實際網路連線狀態不一致的“偽連線”情況包括但不限於如下場景:

  1. 現在很流行的公用wifi,需要網頁鑑權,鑑權之前無法上網,但本地連線已經建立;
  2. 存在了本地網路連線,但訊號很差,實際無法連線到伺服器;
  3. iOS連線的路由裝置本身沒有連線外網。

很多國內外的網友關於此問題早有提問和吐槽,比如:

為了著手解決此類問題,筆者希望就此打造一個通用、簡單、可靠並且能檢測實際網路連線狀態的框架,從而幫助提升app在上述場景下的使用者體驗;這就是

RealReachability的由來。

iOS下的網路檢測方案

  1. 蘋果示例程式碼衍生而來的各類變種,是被開發者們使用最多的;即各類reachability命名相關的框架。其中最負盛名的當屬tonymillion的Reachability。其基礎程式碼來源於蘋果,開發者們對其進行了擴充套件和語法上的支援(比如block回撥等),使其更易於使用。
  2. AFNetworking框架中也提供了AFNetworkReachabilityManager,很多使用AFNetworking的小夥伴們會順帶使用該元件來進行網路檢測。其程式碼基於蘋果的SCNetworkReachability API,封裝結構清晰,易於使用,且包含在AFNetworking中,也受到大家的喜愛。
  3. 一些app本身包含了例如xmpp之類的功能,此類實現通常會向連線的伺服器定時傳送心跳包,主要用於長連線的保活和斷線處理;如果客戶端沒有收到server端回傳的包,那麼我們可以認為實際網路連線已經失效。sip協議也有類似的保活實現,定時間隔都是可配置的。基於server端連線穩定的前提,我們也可以利用這類心跳保活的機制間接達到實際網路狀態檢測的效果。
  4. 各種網路請求的超時。在上述偽連線的場景下,使用者觸發的http請求的通常結果就是超時,該時間一般不短於30秒。理論上說我們可以根據網路請求的結果來標識實際的網路狀態,但這樣做帶來了實現上的耦合性(網路檢測本應該是獨立的功能模組),同時超時時間的等待也不利於打造一個很好的使用者體驗。

RealReachability簡單介紹

RealReachability是筆者1個月之前釋出到github的開源庫,專案地址如下:https://github.com/dustturtle/RealReachability。
短短1個月時間收穫了幾百個star,最近還上了github的oc板塊趨勢排行榜,開發者們對此框架的熱情完全出乎了筆者的意料;這也正說明此框架抓住了開發者們的痛點。

此框架開發的初衷來源於專案實際需求,離線模式對網路連線狀態的要求比較苛刻,且實際場景經常會遇到“偽連線”的情況,專案中所使用的Reachability面對此場景力不從心。多方研究後引入了ping能力(此方案流量開銷最小,也最簡單),實現了簡單的實際網路連線監測;後面將ping的能力和本地網路檢測有機的結合,並且在實時性和開銷上達成了一個平衡,不斷提煉和優化,於是有了這個框架。

可以告訴大家的是,這個框架在appstore上架應用中已經經受了考驗,且經過了長時間的測試,可以放心使用;目前也已經有很多開發者朋友們在其app中使用了我們的框架(讓筆者略感自豪的是,他們來自世界各地!)。

RealReachability的實現原理

RealReachability的架構

realReachability架構概要圖

RealReachability主要包含3大模組:connection、ping、FSM;

其中Ping模組通過對同樣是蘋果提供的ping樣例程式碼進行了封裝,connection模組實現了基於SCNetworkReachability的本地狀態檢測,FSM模組是有限狀態機。

<iframe id="iframeu2513605_1" src="http://pos.baidu.com/acom?rdid=2513605&amp;dc=2&amp;di=u2513605&amp;dri=1&amp;dis=0&amp;dai=2&amp;ps=1666x440&amp;dcb=BAIDU_UNION_define&amp;dtm=BAIDU_DUP_SETJSONADSLOT&amp;dvi=0.0&amp;dci=-1&amp;dpt=none&amp;tsr=0&amp;tpr=1456712385390&amp;ti=RealReachability%20%7C%20%E6%A0%87%E5%93%A5%E7%9A%84%E6%8A%80%E6%9C%AF%E5%8D%9A%E5%AE%A2&amp;ari=1&amp;dbv=2&amp;drs=1&amp;pcs=1905x930&amp;pss=1905x1714&amp;cfv=0&amp;cpl=5&amp;chi=1&amp;cce=true&amp;cec=UTF-8&amp;tlm=1456712386&amp;ltu=http%3A%2F%2Fwww.henishuo.com%2Fios-realreachability%2F&amp;ecd=1&amp;psr=1920x1080&amp;par=1920x1002&amp;pis=-1x-1&amp;ccd=24&amp;cja=false&amp;cmi=7&amp;col=zh-CN&amp;cdo=-1&amp;tcn=1456712386&amp;qn=b80f64a3b1373c30&amp;tt=1456712385364.660.691.692" width="760" height="90" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="-webkit-tap-highlight-color: rgba(255, 0, 0, 0); border-width: 0px; border-style: initial; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: bottom; max-width: 100%;"></iframe>

通過FSM的狀態管理控制connection模組和Ping模組協同工作,剔除了重複的狀態變化,並通過可配置的定時策略等業務邏輯優化,權衡了實時性和開銷,最終得到了我們的實現。
PS:其中connection模組和ping模組也可獨立使用,分別提供本地網路檢測和ping的能力。

感興趣的讀者也可以嘗試(呼叫方式請參考RealReachability開原始碼)。

RealReachability的應用範圍和場景

我們致力於打造一個打造一個通用、簡單、可靠並且能檢測實際網路連線狀態的框架,從而幫助app開發者們在各種偽連線的場景下,也能夠檢測出網路真實的可達性,從而優化app的體驗;現代架構的移動app大部分是胖客戶端,即使離開了網路,也能提供很大一部分功能。RealReachability的能力也限於此。比如網速檢測、個人熱點資訊檢查等功能,不是此框架的設計目標,也超出了其能力範圍。

RealReachability的開銷

localconnection是基於本地的檢測,因此其帶來的開銷可以忽略;ping模組的單次ICMP探測包大小僅為64位元組(包含包頭部),探測的頻率預設為2分鐘1次,對於客戶端來說1小時的應用前臺執行僅額外消耗2kb的流量,完全忽略不計;對於server端來說,如此低頻率、低流量的分散式ICMP包,也不會帶來壓力:對比正常動輒幾十kb甚至更多大小的請求,可以說是九牛一毛。

RealReachability基礎使用

RealReachability整合和依賴

  • 最簡便的整合方法當屬pod: pod ‘RealReachability’;當前的pod穩定版本版本號為1.1.1。
  • 手動整合:將RealReachability資料夾加入到工程即可。
  • 依賴:Xcode5.0+,支援ARC, iOS6+.專案需要引入SystemConfiguration.framework.

使用介紹

其介面的設計和呼叫方法和Reachability非常相似,大家可以無縫上手,非常方便。 開啟網路監聽:

1 2 3 4 5 6 7 [GLobalRealReachabilitystartNotifier]; [[NSNotificationCenterdefaultCenter] addObserver:self                                          selector:@selector(networkChanged:)                                              name:kRealReachabilityChangedNotification                                            object:nil];

關閉網路監聽:

1 2 3 [GLobalRealReachabilitystopNotifier];

回撥程式碼示例:

1 2 3 4 5 6 7 -(void)networkChanged:(NSNotification*)notification{ RealReachability*reachability=(RealReachability*)notification.object; ReachabilityStatusstatus=[reachability currentReachabilityStatus]; NSLog(@"currentStatus:%@",@(status)); }

查詢當前實際網路連線狀態:

1 2 3 ReachabilityStatusstatus=[reachability currentReachabilityStatus];

RealReachability進階使用(可選)

手動觸發實時網路狀態查詢,可以在block回撥中處理自己的業務(特別是網路請求操作),此介面的block會被非同步呼叫。
程式碼示例:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 [GLobalRealReachability reachabilityWithBlock:^(ReachabilityStatusstatus){ switch(status) { case RealStatusNotReachable: { //  case NotReachable handler break; } case RealStatusViaWiFi: { //  case WiFi handler break; } case RealStatusViaWWAN: { //  case WWAN handler break; }             default:                 break; } }];

手動設定目標host地址(ping探測的目標地址):

1 2 3 GLobalRealReachability.hostForPing=@"www.baidu.com";

注意:需要確保該host地址可以被ping探測到。此操作為可選,預設的目標host地址為www.baidu.com。

手動設定自動探測間隔(autoCheckInterval,單位為分鐘):

1 2 3 GLobalRealReachability.autoCheckInterval=3.0f;

注意:此處根據應用的實時性要求來設定自動探測的間隔,實時性要求較高時可適當調低此引數,但不建議設定為1.0以下。

結束語

希望這個框架能夠幫助到大家的iOS開發! 遇到任何疑問或者使用上的問題,都可以聯絡我(管振緯/遊族iOS高階工程師),期待與您交流iOS開發技術:[email protected]
對此框架我也會持續進行維護和優化,更希望感興趣的朋友可以到github上pull request! 開源有你更精彩!

原始碼

作者介紹

本文原作者:管振緯/遊族iOS高階工程師
作者QQ群:494669518
原作者管振緯授權標哥的技術部落格發表本篇博文。

參考連結

 轉載連結:http://www.henishuo.com/ios-realreachability

相關推薦

iOS實際網路檢測框架RealReachability

背景 網路連線狀態檢測對於我們的iOS app開發來說是一個非常通用的需求。為了更好的使用者體驗,我們會在無網路時展現本地或者快取的內容,並對使用者進行合適的提示。但事實上,當前iOS開發者們普遍使用的網路檢測框架,實際上都無法幫助我們檢測真正的網路連線狀態;它們所能檢測的

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

序言 網路連線狀態檢測對於我們的iOS app開發來說是一個非常通用的需求。為了更好的使用者體驗,我們會在無網路時展現本地或者快取的內容,並對使用者進行合適的提示。對絕大部分iOS開發者來說,從蘋果示例程式碼改變而來的各種Reachablity框架是實現這個需

iOS總結-網路框架-AFNetworking原始碼解析(三)

參考https://www.jianshu.com/p/f32bd79233da 有關解析的主要是AFHTTPResponseSerializer: NSObject,其他的都是繼承AFHTTPResponseSerializer AFURLResponseSerialization的協議方

iOS總結-網路框架-AFNetworking原始碼解析(二)

接上一篇,下面是有關生成NSURLSessionDataTask。 這裡是為了適配ios8出現的多次建立session的問題。 這個方法算是af裡面最核心的內容了,通過這個方法建立AFURLSessionManagerTaskDelegate與AFURLSessionDel

iOS總結-網路框架-AFNetworking原始碼解析(一)

AF分為5個功能模組:   網路通訊模組(AFHTTPSessionManager/AFURLSessionManager)   網路狀態監聽模組(AFURLResponseSerialization)   網路通訊安全策略模組(AFSecurityPoli

iOS網路請求框架:MKNetWorkKit的使用

2014-07-11 MKNetWorkKit是由一個印度小夥子寫的,是用於網路請求的庫,支援ARC,程式碼的網址這裡給出。 作者原始碼地址(MugunthKumar):MKNetworkKit 作者類庫介紹中文翻譯地址(翻譯作者,csdn博主kmyhy,楊巨集焱):csdn博

ios網路請求框架,基於AFNetworking封裝,其中快取模組依賴TMCache,JSON解析模組依賴MJExtension,使用更加簡單方便

LazyNetForIOS 由於本人不太會寫文章,有寫得不好得地方請見諒 專案介紹 專案地址 介紹: 非常感謝這三個作品得作者,個人也熱衷與開源,以後有覺得好的東西都會熱於與大家分享

iOS AFNetworking(網路框架)

NSURLConnection ---匯入標頭檔案"AFHTTPRequestOperationManager.h" 1. 傳送GET請求 //傳送get請求 - (void)get { [[AFHTTPRequestOperationManager manager] GE

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

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

iOS 正則 檢測是否為手機號

img 復制 reg num format ring urn bool ret - (BOOL)validateMobile:(NSString *)mobileNum { NSString *regex = @"^1[3|5|7|8][0-9]\\d{8}$";

iOS-網絡檢測的幾種方法

else required 判斷網絡狀態 sha geb all ane mes nsinteger 1.AFN框架中的:AFNetworkReachabilityManager //AFN判斷網絡 -(void)getInternetStatue{ // 1.獲得網絡監控

目標檢測框架py-faster-rcnn修改anchor_box

算法 框架 ams const fas nbsp 這一 res weight 眾所周知,anchor_box控制了回歸框的大小,我們有時候檢測的是大物體或小物體時,需要調整回歸框的大小的時候,得改一下anchor_box。基於rgb公開的py-faster-rcnn修改an

IOS學習8——常用框架學習匯總

masonry layout 最新 快速 href code 過程 介紹 使用 我們在學習和code過程中經常會用到一些框架,本文將會持續更新最新學習和用到的框架 1、布局框架: Masonry介紹與使用實踐:快速上手Autolayout 2、IOS學習8——常用框架學習匯

如何搭建iOS項目基本框架

table param 其他 極光 顯示 cloud 微信 兩種 fec 今天我們來談談如何搭建框架,框架需要做一些什麽。 第一步:找到我們的目標我們的目標是讓其他開發人員拿到手後即可寫頁面,不再需要考慮其他的問題。 第二步:我們需要做哪些東西各位跟著我一步一步來

iOS圖片加載框架-SDWebImage解讀

git -i 都沒有 一定的 get gets src some 進行 在iOS的圖片加載框架中,SDWebImage可謂是占據大半壁江山。它支持從網絡中下載且緩存圖片,並設置圖片到對應的UIImageView控件或者UIButton控件。在項目中使用SDWebImage

iOS自動布局框架-Masonry詳解

asc github上 區分 block line 優先級 關鍵字 二次 con 目前iOS開發中大多數頁面都已經開始使用Interface Builder的方式進行UI開發了,但是在一些變化比較復雜的頁面,還是需要通過代碼來進行UI開發的。而且有很多比較老的項目,本身就還

通過代理模式,對第三方網路請求框架進行封裝,實現任意切換網路框架

 最近在網上學習了一篇課程,講的是通過代理模式對第三方框架進行封裝。 感覺講的很不錯,受益良多,特此記錄。 首先什麼是代理模式? 代理模式就是:為其他物件提供一種代理,以控制對這個物件的訪問。 舉個例子:沒空下去吃飯,找個同事幫忙買飯就是代理模式;平常租房子, 嫌麻

網路管理(四)網路檢測

使用ping命令檢測TCP/IP協議的配置資訊     ping是用於檢測網路連線性、可達到和名稱解析的疑難問題的主要TCP/IP命令。     引數使用說明如下:     -t:指定在中斷前ping可以

IO與Netty瞭解一下!網路通訊框架是這樣構成的!

隨著網際網路應用對高併發、高可用的要求越來越高,傳統的垂直架構由於其自身的侷限性逐漸被分散式、彈性伸縮的微服務架構替代。 微服務將單體應用拆分為多個獨立的微服務應用,每個應用獨立執行,每個服務間通過遠端呼叫(RPC)進行通訊,此時高效能的通訊方式就顯得尤為重要,實現RPC通訊的底層框架Netty

使用Twitter異常檢測框架遇到的坑

  在Github上搜索“Anomaly Detection”,Twitter的異常檢測框架(基於R語言)高居榜首,可見效果應該不錯:    但是活躍度並不高,3-4年沒人維護了:     因此在使用時難免會遇到一些坑,整個使用方式如下(紅色部分,