NWPathMonitor là một lớp trong framework Network trên iOS và macOS để giám sát trạng thái đường dẫn mạng của thiết bị. Theo Apple Developer Documentation (2025), NWPathMonitor cho phép ứng dụng theo dõi khả năng sử dụng mạng, xác định loại giao diện và phản ứng với các thay đổi kết nối. NWPathMonitor cung cấp thông tin về loại kết nối, chi phí dữ liệu và khả năng sử dụng Internet thông qua một callback tiện lợi với NWPath.
Các điểm chính
NWPathMonitor là một lớp trong framework Network được Apple giới thiệu trong iOS 12 và macOS 10.14 Mojave. Nó cung cấp một API hiện đại để theo dõi các thay đổi trong đường dẫn mạng của thiết bị — sự kết hợp của các giao diện mạng mà lưu lượng ứng dụng đi qua.
Trước iOS 12, thư viện Reachability được xây dựng trên framework SystemConfiguration bằng C được sử dụng để giám sát mạng. NWPathMonitor là một thay thế Swift gốc với API phong phú hơn, hỗ trợ các loại kết nối hiện đại (VPN, multipath, LTE, 5G) và tích hợp GCD sẵn có.
Sự khác biệt chính giữa NWPathMonitor và Reachability — đối tượng NWPath cung cấp không chỉ trạng thái nhị phân “có sẵn/không có sẵn”, mà là một bức tranh toàn cảnh về đường dẫn: các giao diện được sử dụng, ưu tiên của chúng, chi phí, trạng thái chuyển vùng và khả năng proxy và VPN. Nhà phát triển nhận được thông tin toàn diện để đưa ra quyết định về các yêu cầu mạng.
Framework Network xuất hiện như một sự thay thế hiện đại cho các API C cấp thấp — CFStream và BSD Sockets. Nó cung cấp một giao diện thống nhất cho giao tiếp mạng trên tất cả các nền tảng Apple, bao gồm watchOS và tvOS. NWPathMonitor là một phần của framework này cùng với NWConnection, NWListener và NWBrowser.
Framework Network được viết bằng Swift và sử dụng GCD để xử lý không đồng bộ. Điều này có nghĩa là các callback của NWPathMonitor thực thi trên hàng đợi dispatch queue được chỉ định, tích hợp với kiến trúc đa luồng hiện có của ứng dụng mà không cần quản lý luồng thủ công.
Việc sử dụng NWPathMonitor bắt đầu bằng cách tạo một thể hiện của lớp và cấu hình callback pathUpdateHandler. Sau đó, phương thức start được gọi với một hàng đợi dispatch queue nơi closure sẽ thực thi. Việc giám sát được dừng bởi phương thức cancel, phương thức này cũng giải phóng tài nguyên.
import Network
class NetworkMonitor {
private let monitor = NWPathMonitor()
private let queue = DispatchQueue("monitor")
func startMonitoring() {
monitor.pathUpdateHandler = { path in
if path.status == .satisfied {
print("Mạng khả dụng")
} else {
print("Mạng không khả dụng")
}
}
monitor.start(on: queue)
}
func stopMonitoring() {
monitor.cancel()
}
}
NWPathMonitor có thể được cấu hình để chỉ giám sát một loại giao diện cụ thể. Sử dụng bộ khởi tạo NWPathMonitor(requiredInterfaceType:) với tham số NWInterface.InterfaceType — .wifi, .cellular, .wiredEthernet hoặc .loopback. Nếu không có loại nào được chỉ định, việc giám sát bao gồm tất cả các giao diện.
Ví dụ thực tế: một ứng dụng phát trực tuyến có thể chỉ giám sát Wi-Fi và cảnh báo người dùng về việc chuyển sang dữ liệu di động. Kiểm tra isConstrained và isExpensive trong NWPath cho phép xác định liệu kết nối hiện tại có bị tính phí hay giới hạn tốc độ hay không.
Việc giám sát nên bắt đầu khi khởi chạy ứng dụng hoặc khi vào nền trước và dừng khi vào nền sau. Nên tạo một thể hiện NWPathMonitor cho toàn bộ ứng dụng (singleton) và sử dụng nó từ các mô-đun khác nhau thông qua một giao thức hoặc lớp dịch vụ.
NWPath là một đối tượng được truyền đến pathUpdateHandler mô tả trạng thái hiện tại của đường dẫn mạng. Nó chứa năm thuộc tính chính bao phủ hầu hết các kịch bản giám sát mạng. NWPath.Status — một liệt kê với ba trạng thái: satisfied (có sẵn), unsatisfied (không có sẵn) và requiresConnection (cần kết nối).
| Thuộc tính | Loại | Mô tả |
|---|---|---|
| status | NWPath.Status | Trạng thái đường dẫn hiện tại: satisfied, unsatisfied, requiresConnection |
| availableInterfaces | [NWInterface] | Danh sách tất cả các giao diện mạng có sẵn |
| gateways | [NWEndpoint] | Danh sách các cổng được sử dụng để định tuyến |
| isExpensive | Bool | True nếu kết nối bị tính phí (dữ liệu di động, điểm phát sóng cá nhân) |
| isConstrained | Bool | True nếu kết nối bị giới hạn tốc độ (Chế độ Dữ liệu Thấp) |
Thuộc tính isExpensive là một cờ quan trọng cho các ứng dụng làm việc với khối lượng dữ liệu lớn. Nếu isExpensive = true, ứng dụng nên giảm chất lượng phát trực tuyến, hoãn tải xuống bản cập nhật hoặc cảnh báo người dùng. isConstrained cho biết Chế độ Dữ liệu Thấp đang được bật.
Để kiểm tra khả năng sử dụng Internet (không chỉ mạng), sử dụng phương thức usesInterfaceType. Nếu thiết bị được kết nối với Wi-Fi mà không có Internet — NWPath có thể hiển thị satisfied, nhưng quyền truy cập thực tế không có. Trong những trường hợp này, cần xác thực bổ sung thông qua NWConnection.
Hãy xem một triển khai NWPathMonitor nâng cao với xử lý chi phí, loại giao diện và thông báo ViewModel thông qua một publisher. Ví dụ sử dụng framework Combine để cập nhật UI phản ứng khi trạng thái mạng thay đổi.
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
}
}
Khi kết nối bị mất, bạn có thể cần không chỉ thông báo cho UI mà còn thực hiện các hành động hoãn lại — ví dụ, lưu một bản nháp yêu cầu để gửi sau. Triển khai một hàng đợi yêu cầu hoãn lại tích lũy các hoạt động trong trạng thái unsatisfied và gửi chúng khi satisfied được khôi phục.
Mô hình ReachabilityManager với ủy quyền là lý tưởng cho nhiệm vụ này: NWPathMonitor thông báo cho trình quản lý, trình quản lý cập nhật hàng đợi và UI. Khi trạng thái chuyển thành satisfied, hàng đợi tự động xóa và UI nhận được chỉ báo khôi phục kết nối.
Trước NWPathMonitor, giải pháp tiêu chuẩn cho việc giám sát mạng trong iOS là thư viện Reachability của Apple (ví dụ từ tài liệu), được xây dựng trên SystemConfiguration. Các khác biệt chính: Reachability hoạt động thông qua SCNetworkReachability bằng C, không hỗ trợ các loại mạng hiện đại và chỉ cung cấp phản hồi nhị phân về khả năng sử dụng.
NWPathMonitor giải quyết những hạn chế này: nó được viết bằng Swift, hỗ trợ VPN, multipath, 5G và LTE, cung cấp thông tin chi tiết về từng giao diện và hoạt động không đồng bộ thông qua GCD. Reachability vẫn được sử dụng trong các dự án hỗ trợ tối thiểu iOS 11 trở xuống.
| Đặc điểm | NWPathMonitor | Reachability |
|---|---|---|
| Phiên bản tối thiểu | iOS 12 | iOS 2 |
| Ngôn ngữ | Swift (Network) | C (SystemConfiguration) |
| Loại giao diện | Wi-Fi, Cellular, Ethernet, VPN | Wi-Fi, WWAN (chung) |
| isExpensive | Có | Không |
| Không đồng bộ | GCD (dispatch queue) | RunLoop |
| Nhiều giao diện | Có (multipath) | Không |
Nếu ứng dụng của bạn hỗ trợ iOS 11 trở xuống, Reachability vẫn là lựa chọn duy nhất. Đối với các dự án iOS 12+, nên sử dụng trực tiếp NWPathMonitor — nó tích hợp tốt hơn với mã Swift hiện đại, Combine và SwiftUI.
Việc di chuyển từ Reachability sang NWPathMonitor rất đơn giản: chỉ cần thay thế các lời gọi SCNetworkReachability bằng NWPathMonitor, giữ nguyên logic xử lý. Một lớp trừu tượng (NetworkMonitorProtocol) sẽ cho phép chuyển đổi giữa các triển khai mà không thay đổi logic kinh doanh của ứng dụng.
Câu hỏi thường gặp
NWPathMonitor có sẵn từ iOS 12.0, macOS 10.14, watchOS 5.0 và tvOS 12.0. Đối với các dự án hỗ trợ phiên bản cũ hơn, sử dụng Reachability từ SystemConfiguration hoặc thư viện bao bọc với biên dịch có điều kiện thông qua #available.
Satisfied có nghĩa là lưu lượng có thể đi qua ít nhất một giao diện. Unsatisfied — không có giao diện nào khả dụng. Trạng thái requiresConnection — đường dẫn cần thiết lập kết nối (ví dụ VPN chưa kết nối) và lưu lượng tạm thời không thể đi qua.
Sử dụng phương thức usesInterfaceType trên NWPath: path.usesInterfaceType(.wifi) cho Wi-Fi, path.usesInterfaceType(.cellular) cho dữ liệu di động. Phương thức trả về true nếu lưu lượng hiện tại đi qua loại giao diện được chỉ định.
Nên tạm dừng giám sát trong nền sau để tiết kiệm pin. Gọi monitor.cancel() trong applicationDidEnterBackground và khởi động lại start trong applicationWillEnterForeground giúp giảm mức tiêu thụ điện. Sử dụng Background Task cho các hoạt động quan trọng.
NWPathMonitor có thể hiển thị satisfied ngay cả với cổng thương lượng. Để xác định quyền truy cập Internet thực tế, thực hiện yêu cầu HTTP đến một điểm cuối đáng tin cậy thông qua NWConnection. Nếu xảy ra chuyển hướng — cổng đang hoạt động và yêu cầu xác thực trong WebView.
Tóm tắt
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm