【移動應用開發(fā)技術】iOS 12+ 中檢測網(wǎng)絡訪問的方法_第1頁
【移動應用開發(fā)技術】iOS 12+ 中檢測網(wǎng)絡訪問的方法_第2頁
【移動應用開發(fā)技術】iOS 12+ 中檢測網(wǎng)絡訪問的方法_第3頁
【移動應用開發(fā)技術】iOS 12+ 中檢測網(wǎng)絡訪問的方法_第4頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

【移動應用開發(fā)技術】iOS12+中檢測網(wǎng)絡訪問的方法

我最近寫了一篇文章,來介紹iOS在連接新的Wi-Fi網(wǎng)絡時,如何在彈出一個webview以讓用戶登錄或注冊之前,檢測CaptivePortals(強制網(wǎng)絡門戶)。如果你連接過諸如酒店、酒吧或咖啡店等地的公共Wi-Fi網(wǎng)絡,對這個應該會比較熟悉。如果你不熟悉iOS中CaptivePortals的工作方式,可以查看SolvingtheCaptivePortalProblemoniOS這篇文章,以了解一些背景知識。

多年來,Apple的Reachability示例程序一直被用作App中檢測網(wǎng)絡訪問的基礎代碼。搜索C將會看到一個很長的第三方庫列表,這些庫基本上都是基于Reachability,并考慮了ARC的支持或Swift的兼容等問題。

在WWDC2018上,Apple介紹了iOS12中的一個新的框架:Network.framework,該框架包含了一個NWPathMonitor類。這個類為我們提供了一種監(jiān)視網(wǎng)絡狀態(tài)變化的方法,而無需包含第三方庫或Apple示例代碼。

使用

只需簡單導入Network框架,便可以使用NWPathMonitor類,如下創(chuàng)建一個NWPathMonitor實例:

如果你只對某個特定網(wǎng)絡適配器的狀態(tài)變更感興趣,例如Wi-Fi,則可以使用init(requiredInterfaceType:)初始化方法,并提供NWInterface.InterfaceType值作為參數(shù),來實例化NWPathMonitor對象,以監(jiān)聽指定類型的網(wǎng)絡適配器,例如:

您需要確保在某處保留對NWPathMonitor對象的引用(例如使用strong屬性),否則ARC可能會釋放NWPathMonitor對象,從而導致指定的回調(diào)無法被調(diào)用。

可監(jiān)控的網(wǎng)絡類型包括:要獲取狀態(tài)更改的通知,需要為pathUpdateHandler屬性指定一個回調(diào),該回調(diào)將在網(wǎng)絡接口發(fā)生狀態(tài)更改時調(diào)用。例如,你的手機網(wǎng)絡從蜂窩網(wǎng)絡切換到Wi-Fi網(wǎng)絡。然后,每當發(fā)生狀態(tài)更改時,將返回一個NWPath實例,可以使用該實例以確定后續(xù)的操作,如下代碼:

使用無參初始化方法與使用指定網(wǎng)絡適配器的初始化方法的不同點是:返回的NWPathobject對象的status屬性是否是satisfied。例如,你只想監(jiān)聽蜂窩網(wǎng)絡,而你的手機連接的是Wi-Fi網(wǎng)絡,則當Wi-Fi網(wǎng)絡狀態(tài)發(fā)生變化時,并不會調(diào)用回調(diào)方法,并且path的status也會保持unsatisfied狀態(tài),因為手機沒有使用指定的網(wǎng)絡連接。所以,如果你只想知道是否有網(wǎng)絡連接,無論是Wi-Fi還是蜂窩,則最好使用無參數(shù)的初始化方法。

一個有趣的問題是,NWPath在iOS12中是作為Network框架的一部分,而實際上在iOS9中就有它的身影,不過是在NetworkExtension.framework,兩者之間有一些細微差別。

可以查詢返回的NWPath對象,以查看設備的網(wǎng)絡適配器的狀態(tài)信息。另一個更有趣的屬性是isExpensive,它標識網(wǎng)絡接口返回的數(shù)據(jù)收費是否昂貴,如使用蜂窩數(shù)據(jù)。我們同樣可以查詢是否支持DNS、IPv4或IPv6。我們可以調(diào)用usesInterfaceType方法,來查看哪個接口改變了狀態(tài)并觸發(fā)回調(diào):

使用NWPathMonitor有點類似于使用其他iOSAPI,例如CLLocationManager,我們需要調(diào)用start方法以便開始接收更新,然后在完成后調(diào)用對應的stop方法。NWPathMonitor的start方法要求我們?yōu)閷ο筇峁┮粋€隊列來執(zhí)行其工作:

當我們完成監(jiān)聽狀態(tài)的變化時,我們只需在調(diào)用cancel()方法。請注意,目前在NWPathMonitor上調(diào)用cancel后,我們無法再次啟動監(jiān)聽,而是需要實例化一個新的NWPathMonitor實例。

請注意,如果在調(diào)用start()之前訪問NWPathMonitor的currentPath屬性,將返回nil。實際上,如果你打印返回到更新回調(diào)的path,如下所示:

則會打印以下內(nèi)容:

Optional(satisfied(Pathissatisfied),interface:en0,scoped,ipv4,ipv6,dns)

Optional(satisfied(Pathissatisfied),interface:en0,scoped,ipv4,ipv6,dns)

這表明此處返回的NWPaths和currentPath屬性是可選項,盡管API沒有明確說明(我們可以推斷返回的NWPath引用是橋接到Swift的Objective-C指針)。CaptivePortals

CaptivePortal是在公共Wi-Fi熱點連接時顯示的網(wǎng)頁,通常用于在授權訪問Internet(或訪問其他網(wǎng)絡資源)之前強制登錄、注冊或支付。在之前的一篇博客中,我談到了從App開發(fā)的的角度來看,Reachability看起來好像沒什么問題,但實際上由于有CaptivePortals,它并不能很好完成任務。這可能導致App無法正常工作甚至于崩潰--因為App可能期望從RESTfulAPI中獲取一些JSON數(shù)據(jù),卻從CaptivePortals獲取到了一些HTML。

我之前很好奇NWPathMonitor在檢測網(wǎng)絡連接方面是否比Reachability有所改進。NWPath.Status枚舉確實提供了三種情況--satisfied、unsatisfied和requiresConnection。不幸的是,Network.framework的開發(fā)者文檔并未提供這些枚舉值的使用說明,而如果我們查看NetworkExtension.framework文檔,其中的NWPathStatus對象提供了satisfiable枚舉值,里面有一些相關文檔描述:

Thepathisnotcurrentlysatisfied,butmaybecomesatisfieduponaconnectionattempt.Thiscanbeduetoaservice,suchasaVPNoracellulardataconnectionnotbeingactivated.

Thepathisnotcurrentlysatisfied,butmaybecomesatisfieduponaconnectionattempt.Thiscanbeduetoaservice,suchasaVPNoracellulardataconnectionnotbeingactivated.requiresConnection枚舉值似乎類似于NWPathStatus對象的satisfiable值。

好消息是NWPathMonitor通常只在captiveportal協(xié)商之后通知path被設置為satisfiable狀態(tài),即在彈出webview且用戶登錄后。而在沒有彈出captiveportal的情況下,將向用戶顯示一個ActionSheet,提供了UseWithoutInternet和UseOtherNetwork選項。如果用戶選擇了UseWithoutInternet,則NWPathMonitor返回的path的狀態(tài)是satisfied,即便實際上并沒有連網(wǎng)。通過使用Charles做的一些實驗,我發(fā)現(xiàn)除非選擇UseWithoutInternet,否則在初始化Wi-Fi網(wǎng)絡連接的同時中斷連接的情況下,NWPathMonitor沒有報告NWPath的Status被置為statisfied。但是,如果網(wǎng)絡連接已恢復,但隨后被刪除,則并不能檢測到這種變更,并且path的狀態(tài)未依然是satisfied。如果用戶僅在火車或酒店上支付一小時的互聯(lián)網(wǎng)訪問費用,這種情況是可能發(fā)生的。

Connectivity

Connectivity是一個MIT許可的開源框架,其目的是復用iOS現(xiàn)有的檢測captiveportal的方法。它允許在iOS8+上使用Reachability準確檢測真正的Internet連接,這意味著在無法使用NWPathMonitor時,我們可以使用這個方法。并且在iOS12上,Connectivity使用了NWPathMonitor來提供更高的準確度。

Connectivity已經(jīng)提供了對NWPathMonitor的支持,可用于iOS12+系統(tǒng)。如果framework屬性設置為network,則會使用Network框架來替代SystemConfiguration框架(Reachability),以監(jiān)聽網(wǎng)絡適配器的狀態(tài)變更。

在網(wǎng)絡適配器中的狀態(tài)更改后,Connectivity會執(zhí)行大量檢查以確定Internet訪問是否可用。另外還有一個輪詢選項,可以用來輪詢網(wǎng)絡是否可用,即使狀態(tài)并未發(fā)生改變??梢酝ㄟ^設置isPollingEnabled=true并將pollingInterval設置為適當?shù)臅r間值來

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論