91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS12+中檢測網絡訪問的方法是什么

發布時間:2021-11-05 10:11:54 來源:億速云 閱讀:266 作者:iii 欄目:編程語言

本篇內容主要講解“iOS12+中檢測網絡訪問的方法是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“iOS12+中檢測網絡訪問的方法是什么”吧!

多年來,Apple 的 Reachability 示例程序一直被用作 App 中檢測網絡訪問的基礎代碼。搜索 Cocoapods.org 將會看到一個很長的第三方庫列表,這些庫基本上都是基于 Reachability,并考慮了 ARC 的支持或 Swift 的兼容等問題。在 WWDC 2018 上,Apple 介紹了 iOS 12 中的一個新的框架:Network.framework,該框架包含了一個 NWPathMonitor 類。這個類為我們提供了一種監視網絡狀態變化的方法,而無需包含第三方庫或 Apple 示例代碼。

使用

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

let monitor = NWPathMonitor()

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

let monitor = NWPathMonitor(requiredInterfaceType: .wifi)

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

可監控的網絡類型包括:

cellularloopbackother (對于虛擬或未確定的網絡類型)wifiwiredEthernet

要獲取狀態更改的通知,需要為 pathUpdateHandler 屬性指定一個回調,該回調將在網絡接口發生狀態更改時調用。例如,你的手機網絡從蜂窩網絡切換到 Wi-Fi 網絡。然后,每當發生狀態更改時,將返回一個 NWPath 實例,可以使用該實例以確定后續的操作,如下代碼:

monitor.pathUpdateHandler = { path in  if path.status == .satisfied {    print("Connected")  }}

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

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

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

let isCellular: Bool = path.usesInterfaceType(.cellular)

使用 NWPathMonitor 有點類似于使用其他 iOS API,例如 CLLocationManager,我們需要調用 start 方法以便開始接收更新,然后在完成后調用對應的 stop 方法。NWPathMonitor 的 start 方法要求我們為對象提供一個隊列來執行其工作:

let queue = DispatchQueue.global(qos: .background)monitor.start(queue: queue)

當我們完成監聽狀態的變化時,我們只需在調用 cancel() 方法。請注意,目前在 NWPathMonitor 上調用 cancel 后,我們無法再次啟動監聽,而是需要實例化一個新的 NWPathMonitor 實例。請注意,如果在調用 start() 之前訪問 NWPathMonitor 的 currentPath 屬性,將返回 nil。實際上,如果你打印返回到更新回調的 path,如下所示:

monitor.pathUpdateHandler = { path in  print(path)}

則會打印以下內容:

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

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

Captive Portals

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

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

The path is not currently satisfied, but may become satisfied upon a connection attempt. This can be due to a service, such as a VPN or a cellular data connection not being activated.

requiresConnection 枚舉值似乎類似于 NWPathStatus 對象的 satisfiable 值。好消息是 NWPathMonitor 通常只在 captive portal 協商之后通知 path 被設置為 satisfiable 狀態,即在彈出 web view 且用戶登錄后。而在沒有彈出 captive portal 的情況下,將向用戶顯示一個 Action Sheet,提供了 Use Without Internet 和 Use Other Network 選項。如果用戶選擇了 Use Without Internet,則 NWPathMonitor 返回的 path 的狀態是 satisfied,即便實際上并沒有連網。

通過使用 Charles 做的一些實驗,我發現除非選擇 Use Without Internet,否則在初始化 Wi-Fi 網絡連接的同時中斷連接的情況下,NWPathMonitor 沒有報告 NWPath 的 Status 被置為 statisfied。但是,如果網絡連接已恢復,但隨后被刪除,則并不能檢測到這種變更,并且 path 的狀態未依然是 satisfied。如果用戶僅在火車或酒店上支付一小時的互聯網訪問費用,這種情況是可能發生的。

Connectivity

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

Connectivity 已經提供了對 NWPathMonitor 的支持,可用于 iOS 12+ 系統。如果 framework 屬性設置為 network,則會使用 Network 框架來替代 SystemConfiguration 框架(Reachability),以監聽網絡適配器的狀態變更。

let connectivity = Connectivity()connectivity.framework = .network

在網絡適配器中的狀態更改后,Connectivity 會執行大量檢查以確定 Internet 訪問是否可用。另外還有一個輪詢選項,可以用來輪詢網絡是否可用,即使狀態并未發生改變。可以通過設置 isPollingEnabled = true 并將 pollingInterval 設置為適當的時間值來實現這一點。

到此,相信大家對“iOS12+中檢測網絡訪問的方法是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

ios
AI

淳化县| 启东市| 浪卡子县| 武山县| 莱西市| 吴忠市| 宁晋县| 加查县| 名山县| 绥化市| 馆陶县| 梓潼县| 旌德县| 高雄市| 界首市| 清涧县| 赤峰市| 江北区| 博湖县| 乌拉特前旗| 措美县| 民勤县| 无极县| 广灵县| 南陵县| 潜山县| 灌南县| 乌拉特中旗| 万年县| 三门县| 定陶县| 渝中区| 江川县| 光山县| 平湖市| 乡宁县| 凤翔县| 平远县| 北宁市| 鹿泉市| 宜都市|