NWPathMonitor เป็นคลาสในเฟรามว์ค Network ใน iOS และ macOS สำหรับตรวจสอบสถานะของเส้นทางเครือข่ายของอุปกรณ์ ตาม Apple Developer Documentation (2025) NWPathMonitor ช่วยให้แอปพลิเคชันสามารถติดตามความพร้อมของเครือข่าย ระบุชนิดอินเทอร์เฟส และตอบสนองต่อการเปลี่ยนแปลงการเชื่อมต่อ NWPathMonitor ให้ข้อมูลเกี่ยวกับชนิดการเชื่อมต่อ ค่าใช้จ่ายข้อมูล และความพร้อมของอินเทอร์เน็ตผ่าน callback ที่สะดวกกับ NWPath
หัวข้อสำคัญ
NWPathMonitor เป็นคลาสของเฟรามว์ค Network ที่ Apple แนะนำใน iOS 12 และ macOS 10.14 Mojave เพื่อติดตามการเปลี่ยนแปลงในเส้นทางเครือข่ายของอุปกรณ์ — การรวมกันของอินเทอร์เฟสเครือข่ายที่ทราฟิคของแอปพลิเคชันไหลผ่าน
ก่อน iOS 12 ไลบรารี Reachability ที่สร้างบนเฟรามว์ค SystemConfiguration แบบ C ถูกใช้สำหรับการตรวจสอบเครือข่าย NWPathMonitor เป็นทางเลือกแบบ Swift ดั้งเดิมที่มี API ที่หลากหลายกว่า รองรับ ชนิดการเชื่อมต่อที่ทันสมัย (VPN, multipath, LTE, 5G) และการผนวกาน GCD ในตัว
ความแตกต่างหลักระหว่าง NWPathMonitor และ Reachability — ออบเจกต์ NWPath ไม่ได้ให้เฉพาะสถานะแบบไบนารี “พร้อม/ไม่พร้อม” แต่ให้ภาพที่สมบูรณ์ของเส้นทาง: อินเทอร์เฟสที่ใช้งาน ลำดับความสำคัญ ค่าใช้จ่าย สถานะการโรมมิ่ง และความสามารถของ proxy และ VPN นักพัฒนาได้รับข้อมูลที่ครอบคลุมสำหรับการตัดสินใจเกี่ยวกับคำขอเครือข่าย
เฟรามว์ค Network เกิดขึ้นเป็นตัวแทนที่ทันสมัยสำหรับ API ระดับต่ำของ C — CFStream และ BSD Sockets เพื่อให้การเชื่อมต่อเครือข่ายแบบเดียวกันบนทุกแพลตฟอร์ม Apple รวมถึง watchOS และ tvOS NWPathMonitor เป็นส่วนหนึ่งของเฟรามว์คนี้พร้อมกับ NWConnection, NWListener และ NWBrowser
เฟรามว์ค Network เขียนด้วย Swift และใช้ GCD สำหรับการประมวลผลแบบไม่ซังโครนัส ซึ่งหมายความว่า callback ของ NWPathMonitor ทำงานบน dispatch queue ที่ระบุ โดยผสานกับสถาปัตยกรรมมัลติเธอร์เดิ้งของแอปพลิเคชันโดยไม่ต้อง จัดการเธรดด้วยตนเอง
การใช้ NWPathMonitor เริ่มด้วยการสร้างอินสแตนซ์ของคลาสและการกำหนดค่า callback pathUpdateHandler จากนั้นเมธอด start จะถูกเรียกด้วย dispatch queue ที่คลอเจอร์จะทำงาน การตรวจสอบจะหยุดโดยเมธอด cancel ซึ่งยังปล่อยทรัพยากร
import Network
class NetworkMonitor {
private let monitor = NWPathMonitor()
private let queue = DispatchQueue("monitor")
func startMonitoring() {
monitor.pathUpdateHandler = { path in
if path.status == .satisfied {
print("เครือข่ายพร้อม")
} else {
print("เครือข่ายไม่พร้อม")
}
}
monitor.start(on: queue)
}
func stopMonitoring() {
monitor.cancel()
}
}
NWPathMonitor สามารถกำหนดค่าให้ตรวจสอบเฉพาะชนิดอินเทอร์เฟสที่ต้องการ ใช้ตัวเริ่มต้น NWPathMonitor(requiredInterfaceType:) กับพารามิเตอร์ NWInterface.InterfaceType — .wifi, .cellular, .wiredEthernet หรือ .loopback หากไม่ระบุชนิด การตรวจสอบจะครอบคลุมทุกอินเทอร์เฟส
ตัวอย่างที่ใช้ได้จริง: แอปพลิเคชันสตรีมิ่งสามารถตรวจสอบเฉพาะ Wi-Fi และเตือนผู้ใช้เมื่อสลับไปใช้ข้อมูลมือถือ การตรวจสอบ isConstrained และ isExpensive ใน NWPath ช่วยระบุว่าการเชื่อมต่อปัจจุบันมีค่าใช้จ่ายหรือจำกัดความเร็ว
การตรวจสอบควรเริ่มเมื่อเปิดแอปพลิเคชันหรือเมื่อเข้าสู่เฟอร์กราวน์ และหยุดเมื่อเข้าสู่แบ็กกราวน์ แนะนำให้สร้าง อินสแตนซ์ NWPathMonitor เดียว สำหรับทั้งแอปพลิเคชัน (singleton) และใช้งานจากโมดูลต่าง ๆ ผ่านโปรโตคอลหรือชั้นบริการ
NWPath เป็นออบเจกต์ที่ส่งไปยัง pathUpdateHandler ซึ่งอธิบายสถานะปัจจุบันของเส้นทางเครือข่าย ประกอบด้วยคุณสมบัติห้าข้อที่ครอบคลุมสิ่งที่สนารีโอการตรวจสอบเครือข่ายส่วนใหญ่ NWPath.Status — การแจงเนติมด้วยสามสถานะ: satisfied (พร้อม), unsatisfied (ไม่พร้อม) และ requiresConnection (ต้องการเชื่อมต่อ)
| คุณสมบัติ | ชนิด | คำอธิบาย |
|---|---|---|
| status | NWPath.Status | สถานะเส้นทางปัจจุบัน: satisfied, unsatisfied, requiresConnection |
| availableInterfaces | [NWInterface] | รายการอินเทอร์เฟสเครือข่ายทั้งหมดที่พร้อม |
| gateways | [NWEndpoint] | รายการเกตแวย์ที่ใช้สำหรับการเลือกเส้นทาง |
| isExpensive | Bool | True หากการเชื่อมต่อมีค่าใช้จ่าย (ข้อมูลมือถือ, ฮอตส์ปต์ส่วนบุคคล) |
| isConstrained | Bool | True หากการเชื่อมต่อถูกจำกัดความเร็ว (โหมดข้อมูลต่ำ) |
คุณสมบัติ isExpensive เป็นโดยสารสำคัญสำหรับแอปพลิเคชันที่ทำงานกับข้อมูลจำนวนมาก หาก isExpensive = true แอปพลิเคชันควรลดคุณภาพสตรีมิ่ง เลือนการดาวน์โหลดอัพเดต หรือเตือนผู้ใช้ isConstrained บ่งบอกว่าโหมดข้อมูลต่ำเปิดใช้งาน
หากต้องการตรวจสอบความพร้อมของอินเทอร์เน็ต (ไม่ใช่แค่เครือข่าย) ให้ใช้เมธอด usesInterfaceType หากอุปกรณ์เชื่อมต่อ Wi-Fi โดยไม่มีอินเทอร์เน็ต — NWPath อาจแสดง satisfied แต่ไม่สามารถเข้าถึงได้จริง ในกรณีเช่นนี้ จำเป็นต้องมีการตรวจสอบเพิ่มเติมผ่าน NWConnection
มาดูการนำไปใช้ NWPathMonitor ขั้นสูงด้วยการจัดการค่าใช้จ่าย ชนิดอินเทอร์เฟส และการแจ้ง ViewModel ผ่าน publisher ตัวอย่างใช้ Combine framework สำหรับการอัพเดต UI แบบไร้เสียงเมื่อสถานะเครือข่ายเปลี่ยนแปลง
import Network
import Combine
final class NetworkManager: ObservableObject {
static let shared = NetworkManager()
@Published private(set) var isConnected = true
@Published private(set) var isExpensive = false
private let monitor = NWPathMonitor()
private let queue = DispatchQueue("NetworkMonitor")
private init() {
monitor.pathUpdateHandler = { [weak self] path in
DispatchQueue.main.async {
self?.isConnected = path.status == .satisfied
self?.isExpensive = path.isExpensive
}
}
monitor.start(on: queue)
}
func checkInterface() -> NWInterface.InterfaceType {
let path = monitor.currentPath
if path.usesInterfaceType(.wifi) { return .wifi }
if path.usesInterfaceType(.cellular) { return .cellular }
return .other
}
}
เมื่อการเชื่อมต่อหาย คุณอาจต้องไม่เพียงแจ้ง UI แต่ยังต้องดำเนินการที่เลือนไว้ — ตัวอย่างเช่น บันทึกคำขอร่างสำหรับส่งทีหลัง นำไปใช้ คิวของคำขอที่เลือนไว้ ซึ่งสะสมการดำเนินการในระหว่างสถานะ unsatisfied และส่งมันเมื่อ satisfied ถูกกลับคืนมา
รูปแบบ ReachabilityManager กับ delegate เหมาะสมสำหรับงานนี้: NWPathMonitor แจ้งตัวจัดการ ตัวจัดการอัพเดตคิวและ UI เมื่อสถานะเปลี่ยนเป็น satisfied คิวจะถูกล้างโดยอัตโนมัติ และ UI จะได้รับการแจ้งการเชื่อมต่อใหม่
ก่อน NWPathMonitor โซลูชันมาตรฐานสำหรับการตรวจสอบเครือข่ายใน iOS คือไลบรารี Reachability ของ Apple (ตัวอย่างจากเอกสาร) ที่สร้างบน SystemConfiguration ความแตกต่างหลัก: Reachability ทำงานผ่าน SCNetworkReachability ด้วย C ไม่รองรับชนิดเครือข่ายที่ทันสมัย และให้เฉพาะคำตอบแบบไบนารีเกี่ยวกับความพร้อม
NWPathMonitor แก้ไขข้อจำกัดเหล่านี้: เขียนด้วย Swift รองรับ VPN, multipath, 5G และ LTE ให้ข้อมูลในรายละเอียดเกี่ยวกับแต่ละอินเทอร์เฟส และทำงานแบบไม่ซังโครนัสผ่าน GCD Reachability ยังคงใช้ในโครงการที่รองรับ iOS 11 และต่ำกว่า
| ลักษณะ | NWPathMonitor | Reachability |
|---|---|---|
| รุ่นต่ำสุด | iOS 12 | iOS 2 |
| ภาษา | Swift (Network) | C (SystemConfiguration) |
| ชนิดอินเทอร์เฟส | Wi-Fi, Cellular, Ethernet, VPN | Wi-Fi, WWAN (ทั่วไป) |
| isExpensive | มี | ไม่มี |
| ไม่ซังโครนัส | GCD (dispatch queue) | RunLoop |
| หลายอินเทอร์เฟส | มี (multipath) | ไม่มี |
หากแอปพลิเคชันของคุณรองรับ iOS 11 และต่ำกว่า Reachability ยังเป็นตัวเลือกเดียว สำหรับ โครงการ iOS 12+ แนะนำให้ใช้ NWPathMonitor โดยตรง — มันผสานกับโค้ด Swift สมัยใหม่ Combine และ SwiftUI ได้ดีกว่า
การย้ายจาก Reachability ไปยัง NWPathMonitor ทำได้ง่าย: เพียงแทนที่การเรียก SCNetworkReachability ด้วย NWPathMonitor โดยรักษาตรรกะการจัดการเดิมแบบเดิม ชั้นการที่เป็นนามธรรม (NetworkMonitorProtocol) จะช่วยให้สามารถสลับระหว่างการนำไปใช้โดยไม่ต้องเปลี่ยนตรรกะธุรกิจของแอปพลิเคชัน
คำถามที่พบบ่อย
NWPathMonitor ใช้งานได้ตั้งแต่ iOS 12.0, macOS 10.14, watchOS 5.0 และ tvOS 12.0 สำหรับโครงการที่รองรับรุ่นเก่ากว่า ให้ใช้ Reachability จาก SystemConfiguration หรือไลบรารีห่อหุ้มที่มีการคอมไพล์แบบมีเงื่อนไขผ่าน #available
Satisfied หมายความว่าทราฟิคสามารถผ่านอย่างน้อยหนึ่งอินเทอร์เฟสได้ Unsatisfied — ไม่มีอินเทอร์เฟสใด เสรียมอยู่ สถานะ requiresConnection — เส้นทางต้องการสร้างการเชื่อมต่อ (ตัวอย่าง VPN ไม่ได้เชื่อมต่อ) และทราฟิคไม่สามารถผ่านได้ชั่วคราว
ใช้เมธอด usesInterfaceType บน NWPath: path.usesInterfaceType(.wifi) สำหรับ Wi-Fi, path.usesInterfaceType(.cellular) สำหรับข้อมูลมือถือ เมธอดจะคืนค่า true หากทราฟิคปัจจุบันผ่านชนิดอินเทอร์เฟสที่ระบุ
แนะนำให้หยุดการตรวจสอบในแบ็กกราวน์เพื่อประหยัดแบตเตอรี่ การเรียก monitor.cancel() ใน applicationDidEnterBackground และเริ่ม start ใหม่ใน applicationWillEnterForeground จะลดการใช้พลังงาน ใช้ Background Task สำหรับการดำเนินการที่สำคัญ
NWPathMonitor อาจแสดง satisfied แม้จะมี captive portal เพื่อระบุการเข้าถึงอินเทอร์เน็ตจริง ให้ดำเนินการ คำขอ HTTP ไปยังจุดสิ้นสุดที่เชื่อถือได้ ผ่าน NWConnection หากมีการเลียนเส้นทางเกิดขึ้น — พอร์แทลทำงานอยู่ และต้องการการรับรองอนุญาตใน WebView
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม