iOS下的實(shí)際網(wǎng)絡(luò)連接狀態(tài)檢測(cè):RealReachability

網(wǎng)絡(luò)連接狀態(tài)檢測(cè)對(duì)于我們的iOS app開發(fā)來(lái)說是一個(gè)非常通用的需求。為了更好的用戶體驗(yàn),我們會(huì)在無(wú)網(wǎng)絡(luò)時(shí)展現(xiàn)本地或者緩存的內(nèi)容,并對(duì)用戶進(jìn)行合適的提示。對(duì)絕大部分iOS開發(fā)者來(lái)說,從蘋果示例代碼改變而來(lái)的各種Reachablity框架是實(shí)現(xiàn)這個(gè)需求的普遍選擇,比如這個(gè)庫(kù)。但事實(shí)上,基于此方案的所有實(shí)現(xiàn),都無(wú)法幫助我們檢測(cè)真正的網(wǎng)絡(luò)連接狀態(tài),它們能檢測(cè)的只是本地連接狀態(tài);這種情況包括但不限于如下場(chǎng)景: 1.現(xiàn)在很流行的公用wifi,需要網(wǎng)頁(yè)鑒權(quán),鑒權(quán)之前無(wú)法上網(wǎng),但本地連接已經(jīng)建立; 2.存在了本地網(wǎng)絡(luò)連接,但信號(hào)很差,實(shí)際無(wú)法連接到服務(wù)器; 3.iOS連接的路由設(shè)備本身沒有連接外網(wǎng)。 cocoachina上已有很多網(wǎng)友對(duì)此進(jìn)行提問和吐槽,比如: 如何判斷設(shè)備是否真正連上互聯(lián)網(wǎng)?而不是只有網(wǎng)絡(luò)連接 [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相關(guān)的所有框架在底層實(shí)現(xiàn)都是通過SCNetworkReachability進(jìn)行檢測(cè),所以無(wú)法檢測(cè)實(shí)際網(wǎng)絡(luò)連接情況。 有鑒于此,筆者希望打造一個(gè)通用、簡(jiǎn)單、可靠的實(shí)際網(wǎng)絡(luò)連接狀態(tài)檢測(cè)框架,于是RealReachability誕生了。

RealReachability簡(jiǎn)單介紹

RealReachability是筆者幾個(gè)月前發(fā)布到github的開源庫(kù),目前有1000多個(gè)star,200多個(gè)fork,幾經(jīng)修改完善后,當(dāng)前pod版本為1.1.5。 項(xiàng)目地址如下: https://github.com/dustturtle/RealReachability。 此框架開發(fā)的初衷來(lái)源于項(xiàng)目實(shí)際需求,離線模式對(duì)網(wǎng)絡(luò)連接狀態(tài)的要求比較苛刻,且實(shí)際場(chǎng)景經(jīng)常會(huì)遇到“偽連接”的情況,Reachability面對(duì)此場(chǎng)景力不從心。多方研究后引入了ping能力(此方案流量開銷最小,也最簡(jiǎn)單),實(shí)現(xiàn)了簡(jiǎn)單的實(shí)際網(wǎng)絡(luò)連接監(jiān)測(cè);后面經(jīng)過提煉和優(yōu)化,就有了這個(gè)框架。可以告訴大家的是,這個(gè)框架在appstore上架應(yīng)用中已經(jīng)經(jīng)受了考驗(yàn),目前也不斷完善中,追求穩(wěn)定的朋友可以使用最新的pod版本(修復(fù)了已知的絕大部分問題,參考demo的使用方式即可)。

集成和使用介紹

集成
  • 最簡(jiǎn)便的集成方法當(dāng)屬pod: pod ‘RealReachability’。
  • 手動(dòng)集成:將RealReachability文件夾加入到工程即可。
    • 依賴:Xcode5.0+,支持ARC, iOS6+.項(xiàng)目需要引入SystemConfiguration.framework.
使用介紹

其接口的設(shè)計(jì)和調(diào)用方法和Reachability非常相似,大家可以無(wú)縫上手,非常方便。 開啟網(wǎng)絡(luò)監(jiān)聽(建議在didFinishLaunchingWithOptions中進(jìn)行監(jiān)聽):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

[GLobalRealReachability startNotifier]; 
return YES;
}
  • 監(jiān)聽網(wǎng)絡(luò)變化通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkChanged:) name:kRealReachabilityChangedNotification object:nil];
  • 通知回調(diào)代碼示例:
- (void)networkChanged:(NSNotification *)notification{ 
RealReachability *reachability = (RealReachability *)notification.object; 
ReachabilityStatus status = [reachability currentReachabilityStatus]; 
NSLog(@"currentStatus:%@",@(status));}
  • 觸發(fā)實(shí)時(shí)網(wǎng)絡(luò)狀態(tài)查詢代碼示例:
[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; 
    } 
}];
  • 查詢當(dāng)前實(shí)際網(wǎng)絡(luò)連接狀態(tài):
ReachabilityStatus status = [reachability currentReachabilityStatus];
  • 設(shè)置ping檢測(cè)用的host服務(wù)器地址(可選):
注意:
  • 這里你需要確保該服務(wù)器支持ping操作。不設(shè)置的情況下我們默認(rèn)使用www.apple.com作為ping服務(wù)器。 可以使用自己的服務(wù)器,或者使用穩(wěn)定、可靠的網(wǎng)絡(luò)地址(比如百度、qq等)。設(shè)置示例如下:
GLobalRealReachability.hostForPing = @"www.apple.com";
  • 獲取當(dāng)前的數(shù)據(jù)網(wǎng)絡(luò)連接類型(高級(jí)功能):
WWANAccessType accessType = [GLobalRealReachability currentWWANtype];
Demo:

我們?cè)趃ithub的repository中已經(jīng)包含了簡(jiǎn)單的Demo工程,直接下載運(yùn)行即可。相關(guān)的Api調(diào)用也可以參考demo中的實(shí)現(xiàn)。 demo截圖:
這里寫圖片描述
RealReachability的實(shí)現(xiàn)原理
RealReachability架構(gòu)圖:

</br>


realReachability架構(gòu)概要圖

RealReachability主要包含3大模塊:connection、ping、FSM;
其中Ping模塊通過對(duì)同樣是蘋果提供的ping樣例代碼進(jìn)行了封裝,connection模塊實(shí)現(xiàn)了基于SCNetworkReachability的本地狀態(tài)檢測(cè),F(xiàn)SM模塊是有限狀態(tài)機(jī)。通過FSM的狀態(tài)管理控制connection模塊和Ping模塊協(xié)同工作,并通過可配置的定時(shí)策略等業(yè)務(wù)邏輯優(yōu)化,最終得到了我們的實(shí)現(xiàn)。

PS:其中connection模塊和ping模塊也可獨(dú)立使用,分別提供本地網(wǎng)絡(luò)檢測(cè)和ping的能力,感興趣的讀者也可以嘗試(調(diào)用方式請(qǐng)參考RealReachability開源代碼)。

更新:github上的master版本已經(jīng)支持IPV6,請(qǐng)開發(fā)者盡快升級(jí)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容