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 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).
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.
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.
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
}
}
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.
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.
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")
}
}
}
}
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.
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.
| Estado | Indicador SCNetwork | Descripción |
|---|---|---|
| ReachableViaWiFi | Reachable + !IsWWAN | Conexión a través de red Wi-Fi con acceso al host |
| ReachableViaWWAN | Reachable + IsWWAN | Conexión a través de red móvil (2G-5G) |
| NotReachable | !Reachable | El host no es accesible a través de ninguna interfaz |
| ConnectionRequired | Reachable + ConnectionRequired | Se requiere establecer conexión (VPN, PPPoE) |
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.
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.
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()
}
}
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
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.
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.
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.
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.
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
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