iOS下的實際網路連接狀態檢測,ios網路連接

來源:互聯網
上載者:User

iOS下的實際網路連接狀態檢測,ios網路連接

序言

網路連接狀態檢測對於我們的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是筆者1個月之前發布到github的開源庫,項目地址如下: https://github.com/dustturtle/RealReachability。 短短1個月時間收穫了100多個star,其中主要來自於外國友人,最近還上了github的OC板塊趨勢熱門排行榜,著實令筆者相當驚喜。 此架構開發的初衷來源於項目實際需求,離線模式對網路連接狀態的要求比較苛刻,且實際情境經常會遇到“偽串連”的情況,Reachability面對此情境力不從心。多方研究後引入了ping能力(此方案流量開銷最小,也最簡單),實現了簡單的實際網路連接監測;後面經過提煉和最佳化,就有了這個架構。可以告訴大家的是,這個架構在appstore上架應用中已經經受了考驗,且經過了長時間的測試,可以放心使用。

整合和使用介紹

  • 整合

最簡便的整合方法當屬pod: pod 'RealReachability'。

手動整合:將RealReachability檔案夾加入到工程即可。

依賴:Xcode5.0+,支援ARC, iOS6+.項目需要引入SystemConfiguration.framework. 

  • 使用介紹

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

12345    [GLobalRealReachability startNotifier];    [[NSNotificationCenter defaultCenter] addObserver:self                                             selector:@selector(networkChanged:)                                                 name:kRealReachabilityChangedNotification                                               object:nil];

回調程式碼範例:

123456 - (void)networkChanged:(NSNotification *)notification{    RealReachability *reachability = (RealReachability *)notification.object;    ReachabilityStatus status = [reachability currentReachabilityStatus];    NSLog(@"currentStatus:%@",@(status));}

觸發即時網路狀態查詢程式碼範例:

123456789101112131415161718192021222324 [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;        }    }];

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

1 ReachabilityStatus status = [reachability currentReachabilityStatus];

Demo:

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

RealReachability的實現原理

RealReachability架構圖:

realReachability架構概要圖RealReachability主要包含3大模組:connection、ping、FSM; 其中Ping模組通過對同樣是蘋果提供的ping範例代碼進行了封裝,connection模組實現了基於SCNetworkReachability的本地狀態檢測,FSM模組是有限狀態機器。通過FSM的狀態管理控制connection模組和Ping模組協同工作,並通過可配置的定時策略等商務邏輯最佳化,最終得到了我們的實現。

PS:其中connection模組和ping模組也可獨立使用,分別提供本網檢測和ping的能力,感興趣的讀者也可以嘗試(調用方式請參考RealReachability開原始碼)。

結束語

希望這個架構能夠協助到大家的iOS開發! 遇到任何疑問或者使用上的問題,都可以聯絡我。

對此架構我也會持續進行維護和最佳化,更希望感興趣的朋友可以到github上pull request! 開源有你更精彩!https://github.com/dustturtle/RealReachability 覺得有用就點個star喔!

問啊-一鍵呼叫程式員答題神器,牛人一對一服務,開發人員編程必備官方網站:www.wenaaa.com

QQ群290551701 聚集很多互連網精英,技術總監,架構師,專案經理!開源技術研究,歡迎業內人士,大牛及新手有志於從事IT行業人員進入!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.