Alexandre Freire

Blog sobre desarrollo en Swift, iOS y Xcode

¿Cómo detectar si tienes conexión a Internet en Swift?

Feb 19, 2020

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étodo viewDidLoad 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:

  1. Cuando el usuario está conectado a una red WiFi, pero ésta no está conectada a internet.
  2. 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.

¿Me ayudas a compartir en redes sociales?
Share on Facebook
Facebook
Pin on Pinterest
Pinterest
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Buffer this page
Buffer
Share on Reddit
Reddit

0 comentarios

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *