Reachability判斷網路連線

2021-09-08 00:02:49 字數 1387 閱讀 1438

reachability是蘋果官方給的檢查網路狀態的庫,想必每個基於網路的應用都會用它來檢查網路狀態吧,當然筆者也不例外.可是正當自信滿滿的我,用這個庫用的不亦樂乎的時候,突然發現我寫的基於網路的程式工作的不是那麼流暢了,尤其是仔細檢查以後確定是因為用了reachability的時候,一下子覺得的不可理喻,這瞬間的落差讓前一分鐘還在美滋滋的認為"寫程式是藝術,用程式是享受"的我情何以堪?

這種情況就是:連線到了wifi,但是並不能上網.這時候用reachability檢查會認為裝置處在wifi情況下(沒錯,好像就是wifi環境下),如果這時候你相當然的認為可以正常上網而去獲取網路資料的話你就等待網路請求超時吧,而預設的超時時間似乎有15秒之久,程式卡住這麼久在使用者體驗上不可接受的.以前的時候一直覺得reachability挺神奇的,可以檢查出來是wifi還是3g網路,還暗自想它是不是偷偷的連線到了哪台伺服器判斷網路情況,這次仔細看了下,覺得挺失敗的,它區分網路連線的時候只是簡單的檢視有沒有ip位址,哎.這就難怪出現以為是wifi但是上不了網的情況了.解決辦法呢?如果是用asi進行http請求的話,可以簡單設定一下超時時間可以在一定程度上避開這個問題:[request settimeoutseconds:5];如果是用的nsurlrequest的話,可以用忽略本地快取並增加超時的方法:nsurlrequest *request = [nsurlrequest requestwithurl:url1 cachepolicy:nsurlrequestreloadignoringlocalandremotecachedata timeoutinterval:10];研究到這裡,筆者突然覺得發現了乙個判斷網路連線的辦法:

簡單來說就是進行乙個網路請示並設定一下超時時間,然後根據返回結果判斷網路連線.當然了你的網路請求最好是返回很簡單的資料,請求位址最好也是你將要請求的網路位址(你想想:你要請求baidu的東西,判斷google的網路連線性有用麼?).友情提示一下,上面一段**擱在主線程裡用依然會卡住介面的喲.

仔細想來reachability並沒有錯.錯就錯在我把用來判斷網路連線型別的東西用來判斷網路連通性.所以合理的利用工具,做正確的事:)

ios 通過Reachability監聽網路狀態

reachability實際上是蘋果公司對scnetworkreachability api做的封裝,這個api被定義在systemconfigure.framework庫中,網上可以去下reachability框架,在afn中其實監聽網路的狀態就是對這個框架做了乙個封裝,在afn中應該有這麼乙個類...

Reachability判斷的不準確 檢測網路

nsstring strnetworktype 建立零位址,0.0.0.0的位址表示查詢本機的網路連線狀態 struct sockaddr storage zeroaddress bzero zeroaddress,sizeof zeroaddress zeroaddress.ss len size...

官方Reachability說明

1.示例說明 此示例用於演示關於如何使用systemconfiguratio reachalility程式介面來判定相關的網路連線狀態及狀態變化,所以在使用此示例中的reachability.h m 檔案於自有的專案中的前提是必須引入systemconfiguration.framework。2.首...