Reachability: qué es, biblioteca de verificación de disponibilidad de red

Autor: IT Sectr Publicado: 2026-03-11 Tiempo de lectura: 10 min

Reachability es una biblioteca para iOS y macOS construida sobre el framework SystemConfiguration que permite verificar la disponibilidad de la conexión a Internet y rastrear sus cambios. Según la Documentación de Apple Developer (2025), Reachability utiliza SCNetworkReachability para la monitorización asíncrona de la red. La biblioteca Reachability siguió siendo el estándar para proyectos iOS durante mucho tiempo hasta que apareció el NWPathMonitor nativo.

Puntos clave

  • Reachability — un envoltorio sobre el framework C SystemConfiguration para monitorizar la disponibilidad de red en iOS y macOS.
  • SCNetworkReachability — una API C de bajo nivel que verifica el alcance de un host o dirección remota.
  • Tipos de conexión — Reachability distingue entre Wi-Fi y datos móviles (WWAN) para adaptar el comportamiento de la aplicación.
  • Notificaciones — a través de SCNetworkReachabilitySetCallback la biblioteca se suscribe a cambios de red mediante RunLoop.
  • NWPathMonitor — una alternativa moderna a Reachability, disponible desde iOS 12 y recomendada por Apple.

¿Qué es Reachability?

Reachability es una biblioteca de ejemplo de Apple que demuestra el uso del framework SystemConfiguration para la monitorización de red. El código fuente se publicó en la Documentación de Apple Developer como ejemplo, pero la comunidad lo adoptó como la herramienta estándar para verificar la conectividad en proyectos iOS.

La biblioteca se basa en SCNetworkReachability — una función C de SystemConfiguration que evalúa el alcance de un host o dirección IP remota. Al crear Reachability, se especifica un nombre de host (por ejemplo, google.com) o una dirección IP, y la biblioteca verifica asíncronamente si este host es accesible a través de las interfaces de red actuales del dispositivo.

La popularidad de Reachability se debe a su simplicidad: basta con crear una instancia, suscribirse a notificaciones mediante NotificationCenter y escuchar kReachabilityChangedNotification. En respuesta, la aplicación recibe un estado: NotReachable, ReachableViaWiFi o ReachableViaWWAN (datos móviles).

Historia y estado de la biblioteca

Reachability apareció por primera vez en iPhone OS 2 (2008) junto con el framework SystemConfiguration. Durante una década fue la única forma nativa de monitorizar el estado de la red en iOS. Con el lanzamiento de iOS 12 y el framework Network, Apple recomienda NWPathMonitor como reemplazo, pero Reachability aún es compatible.

Muchos envoltorios de terceros — AFNetworking, Alamofire, AshleyDodd/Reachability.swift — utilizan el mecanismo interno de SCNetworkReachability. Estas bibliotecas añaden una interfaz conveniente en Swift/Objective-C, memoización de estado y callbacks thread-safe, manteniendo la misma base de SystemConfiguration.

Cómo funciona Reachability internamente

El mecanismo principal de Reachability es la función SCNetworkReachabilityCreateWithName, que crea un objeto de seguimiento para el host especificado. Luego se llama a SCNetworkReachabilityGetFlags — una verificación síncrona que devuelve una máscara de bits SCNetworkReachabilityFlags con el estado actual de la red.

Para la monitorización asíncrona se utiliza SCNetworkReachabilitySetCallback, que registra una función de callback en C. El callback se ejecuta en el RunLoop actual cuando cambia el estado de alcance del host. Reachability envuelve este callback C en un método Objective-C y envía una notificación a través de NotificationCenter.

swift
import SystemConfiguration

class Reachability {
    private var reachabilityRef: SCNetworkReachability?

    init?(hostname: String) {
        reachabilityRef = SCNetworkReachabilityCreateWithName(
            nil, hostname
        )
    }

    func checkReachability() -> Bool {
        var flags = SCNetworkReachabilityFlags()
        SCNetworkReachabilityGetFlags(
            reachabilityRef!, &flags
        )
        return isReachable(with: flags)
    }

    private func isReachable(with flags: SCNetworkReachabilityFlags) -> Bool {
        let reachable = flags.contains(.reachable)
        let connectionRequired = flags.contains(.connectionRequired)
        return reachable && !connectionRequired
    }
}

Indicadores de alcance de red

SCNetworkReachabilityFlags es una máscara de bits que codifica el estado de la red. El indicador kSCNetworkReachabilityFlagsReachable señala que el host es accesible. kSCNetworkReachabilityFlagsConnectionRequired — se requiere establecer una conexión. La combinación de indicadores determina si la aplicación puede enviar datos.

Indicadores adicionales: kSCNetworkReachabilityFlagsIsWWAN — conexión a través de red móvil (iOS), kSCNetworkReachabilityFlagsInterventionRequired — se requiere intervención del usuario (por ejemplo, para VPN). Reachability considera estos indicadores para determinar el tipo de interfaz.

Ejemplos de uso de Reachability

El patrón estándar de uso de Reachability en una aplicación iOS incluye crear una instancia, suscribirse a notificaciones y reaccionar ante cambios de estado. El siguiente ejemplo muestra la integración con NotificationCenter para actualizar la interfaz cuando cambia la red.

swift
import Reachability
import UIKit

class ViewController: UIViewController {
    var reachability: Reachability?

    override func viewDidLoad() {
        super.viewDidLoad()
        reachability = Reachability(hostname: "google.com")
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(reachabilityChanged),
            name: .reachabilityChanged,
            object: nil
        )
        reachability?.startNotifier()
    }

    @objc func reachabilityChanged(notification: Notification) {
        if let reachability = notification.object as? Reachability {
            switch reachability.connection {
            case .wifi:
                print("Conectado mediante Wi-Fi")
            case .cellular:
                print("Conectado mediante datos móviles")
            case .unavailable:
                print("Sin conexión")
            }
        }
    }
}

Verificación de red antes de una solicitud

Antes de realizar una solicitud HTTP, se puede verificar la disponibilidad de la red de forma síncrona: reachability.connection != .unavailable. Esto no garantiza el éxito de la solicitud (el servidor puede no estar disponible), pero evita solicitudes que claramente fallarán y mejora la experiencia de usuario — la aplicación no muestra un spinner en modo offline.

Para una verificación más precisa, combine Reachability con tiempos de espera de URLSession. Si Reachability indica que es accesible pero la solicitud falla dentro del tiempo de espera — probablemente hay un problema del lado del servidor o un portal cautivo. En tal caso, se puede mostrar al usuario un mensaje de servidor no disponible.

Tipos de conexión en Reachability

Reachability distingue tres estados principales de conexión: Wi-Fi, datos móviles (WWAN) y no disponible. WWAN incluye todos los tipos de conexión móvil — 2G, 3G, 4G/LTE, 5G. La biblioteca no proporciona granularidad dentro de WWAN, por lo que para distinguir 4G de 5G se requiere CoreTelephony.

EstadoIndicador SCNetworkDescripción
ReachableViaWiFiReachable + !IsWWANConexión a través de red Wi-Fi con acceso al host
ReachableViaWWANReachable + IsWWANConexión a través de red móvil (2G-5G)
NotReachable!ReachableEl host no es accesible a través de ninguna interfaz
ConnectionRequiredReachable + ConnectionRequiredSe requiere establecer conexión (VPN, PPPoE)

Limitaciones de Reachability por tipo de red

Reachability no distingue Ethernet, túneles VPN ni conexiones multipath — todas las interfaces no WWAN se clasifican como Wi-Fi. Esta limitación se debe a la arquitectura de SystemConfiguration, que no proporciona información detallada sobre las interfaces de red más allá de la clasificación básica.

Para determinar el tipo específico de conexión móvil (4G vs 5G) se requiere CTTelephonyNetworkInfo de CoreTelephony. La combinación de Reachability con CoreTelephony permite a la aplicación seleccionar la calidad del contenido: en 5G — transmisión en 4K, en 4G/LTE — HD, en 3G — SD o solo audio.

Migración de Reachability a NWPathMonitor

Apple recomienda reemplazar Reachability por NWPathMonitor en todos los proyectos nuevos a partir de iOS 12. La razón principal es que NWPathMonitor forma parte del framework moderno Network, está escrito en Swift, es compatible con Combine y proporciona información detallada sobre la ruta de red sin necesidad de compatibilidad con C.

El proceso de migración incluye reemplazar SCNetworkReachability por NWPathMonitor, pasar de NotificationCenter a un closure pathUpdateHandler o publisher de Combine. El algoritmo y la lógica de manejo del estado de la red siguen siendo los mismos — solo cambia la API de monitorización.

swift
protocol NetworkMonitorProtocol {
    var isReachable: Bool { get }
    var connectionType: ConnectionType { get }
    func startMonitoring()
    func stopMonitoring()
}

enum ConnectionType {
    case wifi, cellular, ethernet, unavailable
}

// Implementación moderna usando NWPathMonitor
class ModernNetworkMonitor: NetworkMonitorProtocol {
    private let monitor = NWPathMonitor()
    private let queue = DispatchQueue("Network")
    private var currentPath: NWPath?

    var isReachable: Bool {
        currentPath?.status == .satisfied
    }

    func startMonitoring() {
        monitor.pathUpdateHandler = { [weak self] path in
            self?.currentPath = path
        }
        monitor.start(on: queue)
    }

    func stopMonitoring() {
        monitor.cancel()
    }
}

Recomendaciones de migración

Para proyectos con soporte básico de iOS 12+, reemplace Reachability por NWPathMonitor por completo. Para proyectos que soportan iOS 11, utilice compilación condicional #available(iOS 12, *) con NWPathMonitor y Reachability como fallback. Esto permite una migración gradual sin perder soporte para dispositivos antiguos.

La principal ventaja de la migración es la granularidad de la ruta de red. NWPathMonitor informa no solo “alcanzable/no alcanzable” sino también el tipo de cada interfaz, sus costos, prioridad, soporte de proxy y VPN. Esto proporciona al desarrollador más datos para adaptar el comportamiento de la aplicación a las condiciones actuales de la red.

Preguntas frecuentes

¿Cuál es la versión mínima de iOS compatible con Reachability?

Reachability basada en SCNetworkReachability está disponible desde iPhone OS 2 (iOS 2). La biblioteca funciona en todas las versiones de iOS, incluidas las actuales. Las limitaciones no se refieren a la versión del sistema operativo sino a la granularidad de la información — las versiones antiguas no distinguen entre 4G y 5G.

¿En qué se diferencia Reachability de una simple verificación de ping?

Reachability utiliza SCNetworkReachability — un servicio del sistema que evalúa el alcance del host a nivel de pila de red sin enviar paquetes. Ping envía paquetes ICMP y consume tráfico, además puede ser bloqueado por un firewall. Reachability es más rápido y seguro para verificaciones frecuentes.

¿Se puede usar Reachability en proyectos SwiftUI?

Sí, Reachability funciona en SwiftUI a través de ObservableObject o Combine. Envuélvala en una clase suscrita a NotificationCenter y publique el estado mediante @Published. Para nuevos proyectos SwiftUI, recomendamos NWPathMonitor con un publisher de Combine para actualizaciones reactivas de la Vista.

¿Cómo determina Reachability si es Wi-Fi o datos móviles?

Reachability verifica el indicador kSCNetworkReachabilityFlagsIsWWAN en la máscara de bits SCNetworkReachabilityFlags. Si el indicador está establecido — la conexión es a través de red móvil (WWAN), si no y el host es Reachable — a través de Wi-Fi. Esta es la única forma de distinguir tipos sin CoreTelephony.

¿Por qué Reachability muestra conectividad pero las solicitudes fallan?

SCNetworkReachability verifica el alcance del host a nivel de red pero no garantiza el funcionamiento de protocolos superiores. Posibles causas: portal cautivo, bloqueo de DNS, servidor proxy o firewall. Reachability es el primer filtro pero no reemplaza una solicitud HTTP real.

Resumen

  • Reachability — una biblioteca basada en SystemConfiguration para monitorización de red iOS, que funciona a través de la API C SCNetworkReachability.
  • Tres estados — Wi-Fi, datos móviles (WWAN) y no disponible — determinados mediante indicadores de bits SCNetworkReachabilityFlags.
  • Notificaciones asíncronas se implementan mediante SCNetworkReachabilitySetCallback con RunLoop y NotificationCenter.
  • Limitaciones — Reachability no distingue 4G/5G, VPN, Ethernet y no proporciona información sobre costos de tráfico.
  • NWPathMonitor — reemplazo moderno de Reachability para iOS 12+, que proporciona NWPath detallado con tipo, costos y multipath.
  • Migración implica reemplazar SCNetworkReachability por NWPathMonitor manteniendo la lógica mediante NetworkMonitorProtocol.
  • Reachability sigue siendo relevante para proyectos que soportan iOS 11 y versiones anteriores o para verificaciones síncronas rápidas.

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.

Discutir el proyecto

Lea también