iOS開發網絡篇—Reachability檢測網絡狀態

前言:當應用程序需要訪問網絡的時候,它首先應該檢查設備的網絡狀態,確認設備的網絡環境及連接情況,并針對這些情況提醒用戶做出相應的處理。最好能監聽設備的網絡狀態的改變,當設備網絡狀態連接、斷開時,程序也應該有相應的處理。

開發工具:xcode6.3.2 操作系統:OS X Yosemite10.10.4 學習來源:《瘋狂IOS講義(下)》中的ios網絡應用編程

1、下載,添加Reachability類。

官網下載網址:

https://developer.apple.com/library/prerelease/ios/samplecode/Reachability/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007324-Intro-DontLinkElementID_2

獲取下載的zip文件包找到里面的:reachability.m和reachability.h然后放進工程下:

2、

添加SystemConfiguration.framework框架

然后打開Main.storyborad界面設計文件,添加1個UILabel、1個UITextField和3個UIButton,并將它們擺放整齊,如圖:

為了在程序鐘訪問界面上的文本框,可以將文本框綁定到siteField IBOulet屬性;為了讓程序能響應界面上3個按鈕的點擊事件,還需要為“測試”按鈕的“Touch Up Inside”事件綁定testNetStatus事件處理方法,為“測試wifi”按鈕的“Touch Up Inside”事件綁定testWifi事件處理方法,為了“測試3G/4G”按鈕的“Touch Up Inside”事件綁定testInternet事件處理方法。

3、實現網絡監聽以及按鈕測試的代碼:

要點:

<1>如果是要自動監聽手機聯網的狀態,就需要使用默認的通知中心對象[NSNotificationCenter defaultCenter]來通過監聽

kReachabilityChangedNotification通知,并且當通知中心收到通知,就觸發另一個自定義的成員方法的reachabilityChanged:方法。

源代碼寫法:

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(netChanged:) name:kReachabilityChangedNotification

object:nil];

<2>然后是不管是在上面創建通信中心之后,還是在為按鈕組件的觸發點擊事件綁定的代碼中,都要創建一個網絡可達型對象(有兩種):

-1-Reachability *reach = [Reachability reachabilityWithHostName:”www….”]

-2-Reachability *reach =[Reachability reachabilityForInternetConnection]

<3>然后通過Reachability對象獲取當前網絡狀態:

[reach currentReachabilityStatus]

這個方法返回的就是Reachability聲明中聲明了的枚舉三個枚舉值:

typedef enum : NSInteger {

NotReachable = 0,

ReachableViaWiFi,

ReachableViaWWAN

} NetworkStatus;

也就是說這三個值代表著網絡連接三種狀態。

另外補充:

很奇怪的是:和《瘋狂IOS講義下》(8.1檢測網絡狀態)提供的源代碼不一樣的地方是以上網絡狀態除了綁定組件監聽事件,也就是自動監聽網絡狀態的代碼可以僅僅寫在托管類AppDelegate.m中就可以運行,ViewController.m可以不寫任何代碼就可以運行。

但是自己新建的oc程序,然后按照同樣的步驟壓迫實現同樣效果卻需要額外的條件:

必須在ViewController.h聲明一個私有的成員變量:

@property (nonatomic,strong) Reachability *conn;

然后在ViewController.m中用conn創建一個Reachability對象,并且

[conn startNotifier]。

然后才能在ViewController.m中或者AppDelegate.m中設置自動監聽網絡狀態的代碼。

----------------------------------------------------------------------------------------------------------------------------------------------------------

以上是本人半年前的學習積累,其中關于最后的"另外補充"其實就是很基本的原因,就是沒有使用property的全局作用使得Reachability只能作用于某個方法內部,從而會在程序運行過程中就會出現無效的結果。

下面是本人在2016年2月25日更新的網絡監聽代碼使用快速一覽

----------------------------------------------------------------------------------------------------------------------------------------------------------


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458696.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458696.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458696.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網絡七層協議 五層模型 TCP連接 HTTP連接 socket套接字

socket&#xff08;套接字&#xff09;是通信的基石&#xff0c;是支持TCP/IP協議的網絡通信的基本操作單元&#xff0c;包含進行網絡通信必須的五種信息&#xff1a;連接使用的協議&#xff0c;本地主機的IP地址&#xff0c;本地進程的協議端口&#xff0c;遠地主機的IP地址&a…

[vs2010 project] CppUnit快速入門

簡介 測試是軟件開發過程中極其重要的一環&#xff0c;詳盡周密的測試能夠減少軟件BUG&#xff0c;提高軟件品質。測試包括單元測試、系統測試等。其中單元測試是指針對軟件功能單元所作的測試&#xff0c;這里的功能單元可以是一個類的屬性或者方法&#xff0c;測試的目的是看…

[javascript|基本概念|Number]學習筆記

Number類型的值&#xff1a;整數/浮點數值 整數 十進制 e.g.: var intNum 50; 八進制 (嚴格模式下無效,解析錯誤)字面值首位必須是0,之后的數字序列為0&#xff5e;7 e.g.: var intNum 070; //解析為十進制56 (如果字面值數值超出了范圍&#xff0c;前導0將被忽略&#xf…

[轉]深入理解linux內核list_head

http://blog.chinaunix.net/uid-27122224-id-3277511.html 深入理解linux內核list_head的實現 2012-07-17 17:37:01 分類&#xff1a; LINUX 前言&#xff1a;在linux源代碼中有個頭文件為list.h。很多linux下的源代碼都會使用這個頭文件&#xff0c;它里面定義 了一個結構,以及…

xcode左側不顯示工程文件目錄,提示NO Filter Results

解決辦法&#xff1a; What solved was to go to Navigate > Reveal in Project Navigator . After this, the structure appeared again.

【VC++技術雜談005】如何與程控儀器通過GPIB接口進行通信

在工控測試系統中&#xff0c;經常需要使用到各類程控儀器&#xff0c;這些程控儀器通常具有GPIB、LAN、USB等硬件接口&#xff0c;計算機通過這些接口能夠與其通信&#xff0c;從而實現自動測量、數據采集、數據分析和數據處理等操作。本文主要介紹如何與程控儀器通過GPIB接口…

標題在上邊框中的html(fieldset標簽)

<fieldset> <legend>標題</legend> 內容 </fieldset> 轉載于:https://www.cnblogs.com/lswbk/p/4952820.html

移除項目中的CocoaPods

在項目中移除CocoaPods cocoaPods雖然很方便&#xff0c;但是我是真心的不喜歡用它&#xff0c;總是出錯如果你覺得CocoaPods讓你的項目出現了問題&#xff0c;不好用甚至是惡心&#xff0c;想將其從項目中徹底移除&#xff0c;也有方法&#xff1a; 1.刪除工程文件夾下的Podf…

ShellExecute使用詳解

有三個API函數可以運行可執行文件WinExec、ShellExecute和CreateProcess。 1.CreateProcess因為使用復雜&#xff0c;比較少用。 2.WinExec主要運行EXE文件。如&#xff1a;WinExec(Notepad.exe Readme.txt, SW_SHOW); 3.ShellExecute不僅可以運行EXE文件&#xff0c;也可以運行…

javascript筆記整理(對象基礎)

一、名詞解釋 1.基于對象&#xff08;一切皆對象&#xff0c;以對象的概念來編程&#xff09; 2.面向對象編程(Object Oriented Programming&#xff0c;OOP) A.對象(JavaScript 中的所有事物都是對象) B.對象的屬性和行為 屬性:用數據值來描述他的狀態 行為:用來改變對象行為的…

java的安裝和配置

JRE (JAVA Runtime Enviroment java運行環境),包括JVM(java虛擬機)和java程序所需的核心功能類庫&#xff0c;如果只是運行java程序&#xff0c;只需安裝JRE。 JDK &#xff08;Java Development Kit 開發工具包&#xff09;包括開發JAVA程序時所需的工具&#xff0c;包括JRE…

#if, #ifdef, #ifndef, #else, #elif, #endif的用法

#ifdef的用法 靈活使用#ifdef指示符&#xff0c;我們可以區隔一些與特定頭文件、程序庫和其他文件版本有關的代碼。 代碼舉例&#xff1a;新建define.cpp文件 &#xff03;include "iostream.h" int main() { #ifdef DEBUG cout<< "Beginning ex…

redhat 6.6 安裝 (LVM)

http://www.cnblogs.com/kerrycode/p/4341960.html轉載于:https://www.cnblogs.com/zengkefu/p/4954955.html

MFC對話框最小化到托盤

1、在資源中的Icon中導入一個自己喜歡的圖標&#xff0c;ID命名為IDR_MAINFRAME&#xff0c;將先前的IDR_MAINFRAME的圖標刪除掉&#xff1b; 2、在自己的Dialog頭文件中定義一個變量 NOTIFYICONDATA m_nid&#xff0c;關于該結構體的具體信息可以查閱MSDN&#xff1b; 3、添加…

Android acache讀后感

今天了解到了一個android輕量級的開源緩存框架,(github&#xff1a;https://github.com/yangfuhai/ASimpleCache),花了一點時間研究了一下源代碼&#xff0c;大概的思路就是每個緩存目錄對應一個Acache類&#xff0c;通過mInstanceMap關聯&#xff08;個人覺得這個主要是減少對…

continue break

塊作用域 一個塊或復合語句是用一對花括號&#xff08;"{}"&#xff09;括起來的任意數量的簡單的java語句。塊定義了變量的作用范圍。 1、嵌套塊是方法內的嵌套&#xff0c;不包括類的花括號。在嵌套塊內的 變量是不可以重復定義的。 2、不允許重復定義的是局部變…

GetVersionEx 獲取系統版本信息

轉自&#xff1a;http://blog.csdn.net/yyingwei/article/details/8286658 最近在windows 8上獲取系統版本信息需要調用系統API&#xff0c;于是用到了GetVersionEx。 首先看一看函數原型&#xff1a; [cpp] view plaincopy BOOL GetVersionEx(POSVERSIONINFO pVersionInformat…

popoverController(iPad)

一、設置尺寸 提示&#xff1a;不建議&#xff0c;像下面這樣吧popover的寬度和高度寫死。 1 //1.新建一個內容控制器2 YYMenuViewController *menuVc[[YYMenuViewController alloc]init];3 4 //2.新建一個popoverController&#xff0c;并設置其內容控制器5 s…

靜態成員變量和非靜態成員變量的對比

靜態成員變量和非靜態成員變量的對比 1、存儲的數據 靜態成員變量存儲的是所有對象共享的數據 非靜態成員變量存儲的是每個對象特有的數據 2、存儲位置 靜態成員變量是隨著類的加載在方法區的靜態區開辟內存了 非靜態成員變量是隨著對象的創建再堆中開辟內存 3、調用方式 靜態成…

c++的thread類(c++線程簡單用法)

最近看了一個Thread類&#xff08;忘記在哪里看的了&#xff09;&#xff0c;感覺不錯。 創建線程時線程對應的函數必須是類的靜態成員&#xff0c;由于靜態成員無法訪問類的非靜態成員&#xff0c;我從前都是把對象的指針作為參數傳遞給線程函數來避免這個問題&#xff0c;但是…