Reachability — библиотека для iOS и macOS, построенная на фреймворке SystemConfiguration, которая позволяет проверять доступность интернет-соединения и отслеживать его изменения. Согласно Apple Developer Documentation (2025), Reachability использует SCNetworkReachability для асинхронного мониторинга сети. Библиотека Reachability долгое время оставалась стандартом для iOS-проектов до появления нативного NWPathMonitor.
Главное
Reachability — это библиотека-пример от Apple, демонстрирующая использование фреймворка SystemConfiguration для мониторинга сети. Исходный код опубликован в Apple Developer Documentation как образец, но сообщество приняло его как стандартный инструмент проверки соединения в iOS-проектах.
Библиотека работает на основе SCNetworkReachability — C-функции из SystemConfiguration, которая оценивает достижимость удалённого хоста или IP-адреса. При создании Reachability указывается either hostname (например, google.com) либо IP-адрес, и библиотека асинхронно проверяет, доступен ли этот хост через текущие сетевые интерфейсы устройства.
Популярность Reachability объясняется её простотой: достаточно создать экземпляр, подписаться на уведомления через NotificationCenter и слушать kReachabilityChangedNotification. В ответ приложение получает статус: NotReachable, ReachableViaWiFi или ReachableViaWWAN (сотовые данные).
Reachability впервые появилась в iPhone OS 2 (2008) вместе с фреймворком SystemConfiguration. На протяжении десяти лет она была единственным нативным способом мониторинга сети в iOS. С выходом iOS 12 и фреймворка Network Apple рекомендует NWPathMonitor как замену, но Reachability всё ещё поддерживается.
Множество сторонних обёрток — AFNetworking, Alamofire, AshleyDodd/Reachability.swift — используют внутренний механизм SCNetworkReachability. Эти библиотеки добавляют удобный Swift/Objective-C интерфейс, мемоизацию статуса и thread-safe колбэки, сохраняя ту же основу SystemConfiguration.
Основной механизм Reachability — функция SCNetworkReachabilityCreateWithName, которая создаёт объект отслеживания для указанного хоста. Затем вызывается SCNetworkReachabilityGetFlags — синхронная проверка, возвращающая битовую маску SCNetworkReachabilityFlags с текущим состоянием сети.
Для асинхронного мониторинга используется SCNetworkReachabilitySetCallback, регистрирующая C-функцию обратного вызова. Callback выполняется на текущем RunLoop, когда состояние достижимости хоста меняется. Reachability оборачивает этот C-callback в Objective-C метод и отправляет Notification через 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 — битовая маска, которая кодирует состояние сети. Флаг kSCNetworkReachabilityFlagsReachable указывает, что хост достижим. kSCNetworkReachabilityFlagsConnectionRequired — для соединения требуется установка связи. Комбинация флагов определяет, может ли приложение отправлять данные.
Дополнительные флаги: kSCNetworkReachabilityFlagsIsWWAN — соединение через сотовую сеть (iOS), kSCNetworkReachabilityFlagsInterventionRequired — требуется вмешательство пользователя (например, для VPN). Reachability учитывает эти флаги для определения типа интерфейса.
Стандартный паттерн использования Reachability в iOS-приложении включает создание экземпляра, подписку на уведомления и реакцию на изменение статуса. В примере ниже показана интеграция с NotificationCenter для обновления UI при изменении сети.
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("Connected via Wi-Fi")
case .cellular:
print("Connected via cellular")
case .unavailable:
print("No connection")
}
}
}
}
Перед выполнением HTTP-запроса можно проверить доступность сети синхронно: reachability.connection != .unavailable. Это не гарантирует успех запроса (сервер может быть недоступен), но предотвращает заведомо провальные запросы и улучшает UX — приложение не показывает spinner в офлайн-режиме.
Для более точной проверки комбинируйте Reachability с таймаутами URLSession. Если Reachability показывает reachable, но запрос не выполняется за таймаут — вероятна проблема на стороне сервера или каптивный портал. В таком случае можно показать пользователю сообщение о недоступности сервера.
Reachability различает три основных состояния соединения: Wi-Fi, сотовые данные (WWAN) и недоступность. WWAN включает все типы сотовой связи — 2G, 3G, 4G/LTE, 5G. Библиотека не предоставляет детализации внутри WWAN, поэтому для различения 4G и 5G требуется CoreTelephony.
| Состояние | Флаг SCNetwork | Описание |
|---|---|---|
| ReachableViaWiFi | Reachable + !IsWWAN | Подключение через Wi-Fi сеть с доступом к хосту |
| ReachableViaWWAN | Reachable + IsWWAN | Подключение через сотовую сеть (2G-5G) |
| NotReachable | !Reachable | Хост недоступен через любой интерфейс |
| ConnectionRequired | Reachable + ConnectionRequired | Требуется установка соединения (VPN, PPPoE) |
Reachability не различает Ethernet, VPN-туннели или multipath-соединения — все не-WWAN интерфейсы классифицируются как Wi-Fi. Это ограничение связано с архитектурой SystemConfiguration, которая не предоставляет детальную информацию о сетевых интерфейсах за пределами базовой классификации.
Для определения конкретного типа сотовой связи (4G vs 5G) требуется CTTelephonyNetworkInfo из CoreTelephony. Комбинирование Reachability с CoreTelephony позволяет приложению выбирать качество контента: при 5G — стриминг в 4K, при 4G/LTE — HD, при 3G — SD или аудио только.
Apple рекомендует заменять Reachability на NWPathMonitor во всех новых проектах, начиная с iOS 12. Основная причина — NWPathMonitor является частью современного фреймворка Network, написан на Swift, поддерживает Combine и предоставляет детальную информацию о сетевом пути без использования C-совместимости.
Процесс миграции включает замену SCNetworkReachability на NWPathMonitor, переход с NotificationCenter на pathUpdateHandler closure или Combine publisher. Алгоритм и логика обработки статуса сети остаются теми же — меняется только API мониторинга.
protocol NetworkMonitorProtocol {
var isReachable: Bool { get }
var connectionType: ConnectionType { get }
func startMonitoring()
func stopMonitoring()
}
enum ConnectionType {
case wifi, cellular, ethernet, unavailable
}
// Modern implementation using 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()
}
}
Для проектов с базовой поддержкой iOS 12+ заменяйте Reachability на NWPathMonitor полностью. Для проектов, поддерживающих iOS 11, используйте условную компиляцию #available(iOS 12, *) с NWPathMonitor и Reachability как fallback. Это позволяет постепенно мигрировать без потери поддержки старых устройств.
Основное преимущество миграции — детализация сетевого пути. NWPathMonitor сообщает не просто «доступно/недоступно», но и тип каждого интерфейса, их расходы, приоритет, поддержку прокси и VPN. Это даёт разработчику больше данных для адаптации поведения приложения под текущие сетевые условия.
Часто задаваемые вопросы
Reachability на SCNetworkReachability доступна начиная с iPhone OS 2 (iOS 2). Библиотека работает на всех версиях iOS, включая актуальные. Ограничения касаются не версии ОС, а детализации информации — на старых версиях нет различения 4G и 5G.
Reachability использует SCNetworkReachability — системный сервис, который оценивает достижимость хоста на уровне сетевого стека, не отправляя пакеты. Ping отправляет ICMP-пакеты и потребляет трафик, а также может блокироваться брандмауэром. Reachability быстрее и безопаснее для частой проверки.
Да, Reachability работает в SwiftUI через ObservableObject или Combine. Оберните её в класс, подписанный на NotificationCenter, и опубликуйте статус через @Published. Для новых SwiftUI-проектов рекомендуем NWPathMonitor с Combine publisher для реактивного обновления View.
Reachability проверяет флаг kSCNetworkReachabilityFlagsIsWWAN в битовой маске SCNetworkReachabilityFlags. Если флаг установлен — соединение через сотовую сеть (WWAN), если нет и хост Reachable — через Wi-Fi. Это единственный способ различить типы без CoreTelephony.
SCNetworkReachability проверяет достижимость хоста на сетевом уровне, но не гарантирует работу вышележащих протоколов. Возможные причины: каптивный портал, блокировка по DNS, прокси-сервер или файрвол. Reachability — первый фильтр, но не замена реальному HTTP-запросу.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также