Existen ocasiones en las que quieres detectar cuándo tu aplicación tiene conexión y cuándo la ha perdido. En otras ocasiones también querrás prevenir a tu usuario de descargar un archivo muy grande y pesado cuando éste no está conectado a una red WiFi.
Para ello, puedes hacer uso del nuevo framework Network
disponible desde iOS 12 en adelante. Una de las clases de este framework es NWPathMonitor
, que nos ayudará a monitorear la conectividad del dispositivo.
Detectar cambios de conectividad
Lo primero que tenemos que hacer es importar el framework y crear una instancia de NWPathMonitor
. Esta instancia la tienes que guardar en una propiedad, por ejemplo en tu ViewController
.
import UIKit
import Network
class ViewController: UIViewController {
let networkMonitor = NWPathMonitor()
}
Ahora le asignarás el closure que se va a ejecutar cada vez que el estado de la conectividad cambie. Este closure tiene un parámetro de entrada de tipo NWPath
que describe si el acceso a la red es posible a través de su propiedad status
. Podemos hacer todo esto en el viewDidLoad
, por ejemplo:
override func viewDidLoad() {
super.viewDidLoad()
networkMonitor.pathUpdateHandler = { path in
if path.status == .satisfied {
print("Estás conectado a la red")
} else {
print("No estás conectado a la red")
}
}
}
Este closure se ejecutará cada vez que haya un cambio en el estado de la conectividad a la red.
Si en lugar de guardar el
NWPathMonitor
en una propiedad la instanciases en este método, tan pronto se termine la ejecución del métodoviewDidLoad
el objeto sería liberado de memoria y con él, el closure que te informa de los cambios en el estado de la conectividad.
Ahora tenemos que llamar al método start()
del networkMonitor
, que acepta un queue
como parámetro.
override func viewDidLoad() {
super.viewDidLoad()
networkMonitor.pathUpdateHandler = { path in
if path.status == .satisfied {
print("Estás conectado a la red")
} else {
print("No estás conectado a la red")
}
}
let queue = DispatchQueue(label: "Network connectivity")
networkMonitor.start(queue: queue)
}
Ya está.
Ahora ejecuta el proyecto, y verás que en la consola de Xcode te aparece el mensaje “Estás conectado a la red”. Si desconectas el WiFi o el cable, un nuevo mensaje aparecerá en la consola: “No estás conectado a la red”. ¡Funciona!
Únete a la newsletter para no perderte ningún nuevo tutorial: recibe un email cuando se publiquen nuevos artículos o vídeos y no pierdas la oportunidad de seguir aprendiendo.
Detectar si la conectividad es a través de WiFi o de datos móviles
La clase NWPath
tiene otra propiedad muy interesante: isExpensive
.
Esta propiedad será true
siempre y cuando el usuario esté utilizando sus datos móviles o si está conectado a un Personal Hotspot. Puedes utilizar esta propiedad para prevenir al usuario de descargarse un gran volumen de datos utilizando sus datos móviles y evitarle un susto en la factura. Añade esto dentro del closure:
override func viewDidLoad() {
super.viewDidLoad()
networkMonitor.pathUpdateHandler = { path in
if path.status == .satisfied {
print("Estás conectado a la red")
} else {
print("No estás conectado a la red")
}
if path.isExpensive {
print("¿Estás seguro? Esto te puede costar dinero")
} else {
print("Estás usando una red WiFi. Descarga todo lo que quieras")
}
}
let queue = DispatchQueue(label: "Network connectivity")
networkMonitor.start(queue: queue)
}
Casos límite (edge cases)
@RafaelBartolome me contó que existen dos casos límite donde podrás tener un falso positivo. Es decir, esta clase dice que sí estás conectado pero en realidad no tienes acceso a internet:
- Cuando el usuario está conectado a una red WiFi, pero ésta no está conectada a internet.
- Cuando el usuario está conectado a su red de datos móviles, pero ya ha consumido toda su tarifa.
Muchas gracias Rafa.
Conclusión
Detectar cambios en la conectividad nunca fue tan fácil. Se acabó el tener que importar los ficheros relacionados con Reachability
en tu aplicación. Ahora, con el framework Network
y la clase NWPathMonitor
puedes estar siempre alerta y reaccionar si, de pronto, tu usuario se queda sin conexión.
Si te ha gustado el artículo, ¿me harías un favor? No te lo guardes para ti y compártelo en tus redes sociales favoritas. Si tienes alguna duda o si quieres proponerme temas para futuros artículos, puedes escribirme en Twitter (@xandrefreire) o en mi canal de YouTube.