Reachability: что это, библиотека проверки доступности сети

Автор: IT Sectr Опубликовано: 2026-03-11 Время чтения: 10 мин

Reachability — библиотека для iOS и macOS, построенная на фреймворке SystemConfiguration, которая позволяет проверять доступность интернет-соединения и отслеживать его изменения. Согласно Apple Developer Documentation (2025), Reachability использует SCNetworkReachability для асинхронного мониторинга сети. Библиотека Reachability долгое время оставалась стандартом для iOS-проектов до появления нативного NWPathMonitor.

Главное

  • Reachability — обёртка над C-фреймворком SystemConfiguration для мониторинга доступности сети в iOS и macOS.
  • SCNetworkReachability — низкоуровневый C-API, который проверяет достижимость удалённого хоста или адреса.
  • Типы соединения — Reachability различает Wi-Fi и сотовые данные (WWAN) для адаптации поведения приложения.
  • Уведомления — через SCNetworkReachabilitySetCallback библиотека подписывается на изменения сети с помощью RunLoop.
  • NWPathMonitor — современная альтернатива Reachability, доступная начиная с iOS 12 и рекомендуемая Apple.

Что такое Reachability?

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 под капотом

Основной механизм Reachability — функция SCNetworkReachabilityCreateWithName, которая создаёт объект отслеживания для указанного хоста. Затем вызывается SCNetworkReachabilityGetFlags — синхронная проверка, возвращающая битовую маску SCNetworkReachabilityFlags с текущим состоянием сети.

Для асинхронного мониторинга используется SCNetworkReachabilitySetCallback, регистрирующая C-функцию обратного вызова. Callback выполняется на текущем RunLoop, когда состояние достижимости хоста меняется. Reachability оборачивает этот C-callback в Objective-C метод и отправляет Notification через 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
    }
}

Флаги сетевой достижимости

SCNetworkReachabilityFlags — битовая маска, которая кодирует состояние сети. Флаг kSCNetworkReachabilityFlagsReachable указывает, что хост достижим. kSCNetworkReachabilityFlagsConnectionRequired — для соединения требуется установка связи. Комбинация флагов определяет, может ли приложение отправлять данные.

Дополнительные флаги: kSCNetworkReachabilityFlagsIsWWAN — соединение через сотовую сеть (iOS), kSCNetworkReachabilityFlagsInterventionRequired — требуется вмешательство пользователя (например, для VPN). Reachability учитывает эти флаги для определения типа интерфейса.

Примеры использования Reachability

Стандартный паттерн использования Reachability в iOS-приложении включает создание экземпляра, подписку на уведомления и реакцию на изменение статуса. В примере ниже показана интеграция с NotificationCenter для обновления UI при изменении сети.

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("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

Reachability различает три основных состояния соединения: Wi-Fi, сотовые данные (WWAN) и недоступность. WWAN включает все типы сотовой связи — 2G, 3G, 4G/LTE, 5G. Библиотека не предоставляет детализации внутри WWAN, поэтому для различения 4G и 5G требуется CoreTelephony.

СостояниеФлаг SCNetworkОписание
ReachableViaWiFiReachable + !IsWWANПодключение через Wi-Fi сеть с доступом к хосту
ReachableViaWWANReachable + IsWWANПодключение через сотовую сеть (2G-5G)
NotReachable!ReachableХост недоступен через любой интерфейс
ConnectionRequiredReachable + ConnectionRequiredТребуется установка соединения (VPN, PPPoE)

Ограничения Reachability по типам сетей

Reachability не различает Ethernet, VPN-туннели или multipath-соединения — все не-WWAN интерфейсы классифицируются как Wi-Fi. Это ограничение связано с архитектурой SystemConfiguration, которая не предоставляет детальную информацию о сетевых интерфейсах за пределами базовой классификации.

Для определения конкретного типа сотовой связи (4G vs 5G) требуется CTTelephonyNetworkInfo из CoreTelephony. Комбинирование Reachability с CoreTelephony позволяет приложению выбирать качество контента: при 5G — стриминг в 4K, при 4G/LTE — HD, при 3G — SD или аудио только.

Миграция с Reachability на NWPathMonitor

Apple рекомендует заменять Reachability на NWPathMonitor во всех новых проектах, начиная с iOS 12. Основная причина — NWPathMonitor является частью современного фреймворка Network, написан на Swift, поддерживает Combine и предоставляет детальную информацию о сетевом пути без использования C-совместимости.

Процесс миграции включает замену SCNetworkReachability на NWPathMonitor, переход с NotificationCenter на pathUpdateHandler closure или Combine publisher. Алгоритм и логика обработки статуса сети остаются теми же — меняется только API мониторинга.

swift
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. Это даёт разработчику больше данных для адаптации поведения приложения под текущие сетевые условия.

Часто задаваемые вопросы

Какая минимальная версия iOS поддерживает Reachability?

Reachability на SCNetworkReachability доступна начиная с iPhone OS 2 (iOS 2). Библиотека работает на всех версиях iOS, включая актуальные. Ограничения касаются не версии ОС, а детализации информации — на старых версиях нет различения 4G и 5G.

Чем Reachability отличается от простой проверки ping?

Reachability использует SCNetworkReachability — системный сервис, который оценивает достижимость хоста на уровне сетевого стека, не отправляя пакеты. Ping отправляет ICMP-пакеты и потребляет трафик, а также может блокироваться брандмауэром. Reachability быстрее и безопаснее для частой проверки.

Можно ли использовать Reachability в SwiftUI проектах?

Да, Reachability работает в SwiftUI через ObservableObject или Combine. Оберните её в класс, подписанный на NotificationCenter, и опубликуйте статус через @Published. Для новых SwiftUI-проектов рекомендуем NWPathMonitor с Combine publisher для реактивного обновления View.

Как Reachability определяет Wi-Fi vs сотовые данные?

Reachability проверяет флаг kSCNetworkReachabilityFlagsIsWWAN в битовой маске SCNetworkReachabilityFlags. Если флаг установлен — соединение через сотовую сеть (WWAN), если нет и хост Reachable — через Wi-Fi. Это единственный способ различить типы без CoreTelephony.

Почему Reachability показывает доступность, а запросы не работают?

SCNetworkReachability проверяет достижимость хоста на сетевом уровне, но не гарантирует работу вышележащих протоколов. Возможные причины: каптивный портал, блокировка по DNS, прокси-сервер или файрвол. Reachability — первый фильтр, но не замена реальному HTTP-запросу.

Итоги

  • Reachability — библиотека на SystemConfiguration для мониторинга сети iOS, работающая через SCNetworkReachability C-API.
  • Три состояния — Wi-Fi, сотовые данные (WWAN) и недоступность — определяются через битовые флаги SCNetworkReachabilityFlags.
  • Асинхронные уведомления реализуются через SCNetworkReachabilitySetCallback с RunLoop и NotificationCenter.
  • Ограничения — Reachability не различает 4G/5G, VPN, Ethernet и не даёт информацию о расходах трафика.
  • NWPathMonitor — современная замена Reachability для iOS 12+, предоставляющая детальный NWPath с типом, расходами и мультипутём.
  • Миграция включает замену SCNetworkReachability на NWPathMonitor с сохранением логики через протокол NetworkMonitorProtocol.
  • Reachability остаётся востребованной для проектов с поддержкой iOS 11 и ниже или для быстрой синхронной проверки.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также