NWPathMonitor es una clase del framework Network en iOS y macOS para monitorear el estado de la ruta de red del dispositivo. Según Apple Developer Documentation (2025), NWPathMonitor permite a la aplicación rastrear la disponibilidad de la red, determinar el tipo de interfaz y reaccionar a los cambios de conexión. NWPathMonitor proporciona información sobre el tipo de conexión, costos de datos y disponibilidad de internet a través de un callback conveniente con NWPath.
Puntos clave
NWPathMonitor es una clase del framework Network introducida por Apple en iOS 12 y macOS 10.14 Mojave. Proporciona una API moderna para rastrear cambios en la ruta de red del dispositivo — la combinación de interfaces de red a través de las cuales pasa el tráfico de la aplicación.
Antes de iOS 12, se usaba la biblioteca Reachability construida sobre el framework SystemConfiguration en C para el monitoreo de red. NWPathMonitor es una alternativa nativa en Swift con una API más rica, soporte para tipos de conexión modernos (VPN, multipath, LTE, 5G) e integración integrada con GCD.
La diferencia clave entre NWPathMonitor y Reachability — el objeto NWPath proporciona no solo un estado binario “disponible/no disponible”, sino una imagen completa de la ruta: interfaces utilizadas, su prioridad, costos, estado de roaming y capacidades de proxy y VPN. El desarrollador obtiene información completa para tomar decisiones sobre solicitudes de red.
El framework Network surgió como un reemplazo moderno para las API de bajo nivel en C — CFStream y BSD Sockets. Proporciona una interfaz unificada para la comunicación de red en todas las plataformas Apple, incluyendo watchOS y tvOS. NWPathMonitor es parte de este framework junto con NWConnection, NWListener y NWBrowser.
El framework Network está escrito en Swift y usa GCD para procesamiento asincrónico. Esto significa que los callbacks de NWPathMonitor se ejecutan en la dispatch queue especificada, integrándose con la arquitectura de subprocesos múltiples existente de la aplicación sin gestión manual de hilos.
El uso de NWPathMonitor comienza con la creación de una instancia de la clase y la configuración del callback pathUpdateHandler. Luego se llama al método start con una dispatch queue donde se ejecutará el closure. El monitoreo se detiene con el método cancel, que también libera recursos.
import Network
class NetworkMonitor {
private let monitor = NWPathMonitor()
private let queue = DispatchQueue("monitor")
func startMonitoring() {
monitor.pathUpdateHandler = { path in
if path.status == .satisfied {
print("Red disponible")
} else {
print("Red no disponible")
}
}
monitor.start(on: queue)
}
func stopMonitoring() {
monitor.cancel()
}
}
NWPathMonitor se puede configurar para monitorear solo un tipo de interfaz específico. Use el inicializador NWPathMonitor(requiredInterfaceType:) con el parámetro NWInterface.InterfaceType — .wifi, .cellular, .wiredEthernet o .loopback. Si no se especifica tipo, el monitoreo cubre todas las interfaces.
Ejemplo práctico: una aplicación de streaming puede monitorear solo Wi-Fi y advertir al usuario sobre el cambio a datos móviles. Verificar isConstrained e isExpensive en NWPath permite determinar si la conexión actual es tarificada o limitada en velocidad.
El monitoreo debe iniciarse al lanzar la aplicación o al entrar en primer plano, y detenerse al entrar en segundo plano. Se recomienda crear una instancia de NWPathMonitor para toda la aplicación (singleton) y usarla desde diferentes módulos a través de un protocolo o capa de servicio.
NWPath es un objeto pasado a pathUpdateHandler que describe el estado actual de la ruta de red. Contiene cinco propiedades clave que cubren la mayoría de los escenarios de monitoreo de red. NWPath.Status — una enumeración con tres estados: satisfied (disponible), unsatisfied (no disponible) y requiresConnection (necesita conexión).
| Propiedad | Tipo | Descripción |
|---|---|---|
| status | NWPath.Status | Estado actual de la ruta: satisfied, unsatisfied, requiresConnection |
| availableInterfaces | [NWInterface] | Lista de todas las interfaces de red disponibles |
| gateways | [NWEndpoint] | Lista de gateways utilizados para el enrutamiento |
| isExpensive | Bool | True si la conexión es tarificada (datos móviles, hotspot personal) |
| isConstrained | Bool | True si la conexión tiene límite de velocidad (Low Data Mode) |
La propiedad isExpensive es una bandera crítica para aplicaciones que trabajan con grandes volúmenes de datos. Si isExpensive = true, la aplicación debe reducir la calidad de streaming, posponer descargas de actualizaciones o advertir al usuario. isConstrained indica que el Low Data Mode está activado.
Para verificar la disponibilidad de internet (no solo de red), use el método usesInterfaceType. Si el dispositivo está conectado a Wi-Fi sin internet — NWPath puede mostrar satisfied, pero el acceso real está ausente. En estos casos, se requiere validación adicional mediante NWConnection.
Veamos una implementación avanzada de NWPathMonitor con manejo de costos, tipos de interfaz y notificación a ViewModel a través de un publisher. El ejemplo usa el framework Combine para actualizaciones reactivas de la UI cuando cambia el estado de la red.
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
}
}
Cuando se pierde la conexión, puede ser necesario no solo notificar a la UI sino también realizar acciones diferidas — por ejemplo, guardar un borrador de solicitud para enviarlo después. Implemente una cola de solicitudes diferidas que acumula operaciones durante el estado unsatisfied y las envía cuando se restaura satisfied.
El patrón ReachabilityManager con delegado es ideal para esta tarea: NWPathMonitor notifica al manager, el manager actualiza la cola y la UI. Cuando el estado cambia a satisfied, la cola se vacía automáticamente y la UI recibe una indicación de restauración de conexión.
Antes de NWPathMonitor, la solución estándar para monitoreo de red en iOS era la biblioteca Reachability de Apple (ejemplo de la documentación), construida sobre SystemConfiguration. Las principales diferencias: Reachability funciona a través de SCNetworkReachability en C, no admite tipos de red modernos y solo proporciona una respuesta binaria de disponibilidad.
NWPathMonitor soluciona estas limitaciones: está escrito en Swift, soporta VPN, multipath, 5G y LTE, proporciona información detallada sobre cada interfaz y funciona de forma asincrónica a través de GCD. Reachability todavía se usa en proyectos con soporte mínimo de iOS 11 e inferior.
| Característica | NWPathMonitor | Reachability |
|---|---|---|
| Versión mínima | iOS 12 | iOS 2 |
| Idioma | Swift (Network) | C (SystemConfiguration) |
| Tipos de interfaz | Wi-Fi, Cellular, Ethernet, VPN | Wi-Fi, WWAN (genérico) |
| isExpensive | Sí | No |
| Asincronía | GCD (dispatch queue) | RunLoop |
| Múltiples interfaces | Sí (multipath) | No |
Si tu aplicación soporta iOS 11 e inferior, Reachability sigue siendo la única opción. Para proyectos iOS 12+, se recomienda usar NWPathMonitor directamente — se integra mejor con el código Swift moderno, Combine y SwiftUI.
La migración de Reachability a NWPathMonitor es sencilla: simplemente reemplace las llamadas SCNetworkReachability con NWPathMonitor, conservando la misma lógica de manejo. Una capa de abstracción (NetworkMonitorProtocol) permitirá cambiar entre implementaciones sin modificar la lógica de negocio de la aplicación.
Preguntas frecuentes
NWPathMonitor está disponible desde iOS 12.0, macOS 10.14, watchOS 5.0 y tvOS 12.0. Para proyectos que soporten versiones anteriores, use Reachability de SystemConfiguration o bibliotecas envolventes con compilación condicional mediante #available.
Satisfied significa que el tráfico puede pasar a través de al menos una interfaz. Unsatisfied — ninguna interfaz está disponible. El estado requiresConnection — la ruta requiere establecer una conexión (por ejemplo, VPN no conectada) y el tráfico no puede pasar temporalmente.
Use el método usesInterfaceType en NWPath: path.usesInterfaceType(.wifi) para Wi-Fi, path.usesInterfaceType(.cellular) para datos móviles. El método devuelve true si el tráfico actual pasa a través del tipo de interfaz especificado.
Se recomienda pausar el monitoreo en segundo plano para ahorrar batería. Llamar a monitor.cancel() en applicationDidEnterBackground y reiniciar start en applicationWillEnterForeground reducen el consumo de energía. Use Background Task para operaciones críticas.
NWPathMonitor puede mostrar satisfied incluso con un portal cautivo. Para determinar el acceso real a internet, realice una solicitud HTTP a un endpoint de confianza a través de NWConnection. Si ocurre una redirección — el portal está activo y requiere autorización en un WebView.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también