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-а наводи се или име хоста (нпр. 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 функцију повратног позива. Повратни позив се извршава на текућем RunLoop-у када се стање доступности хоста промени. Reachability омотава овај C-позив у Objective-C методу и шаље обавештење путем 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("Повезан путем Wi-Fi-ја")
            case .cellular:
                print("Повезан путем мобилне мреже")
            case .unavailable:
                print("Нема везе")
            }
        }
    }
}

Провера мреже пре захтева

Пре извршавања 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
}

// Савремена имплементација која користи 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 не само извештава „доступан/недоступан”, већ и тип сваког интерфејса, њихове трошкове, приоритет, подршку за proxy и 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 наспрам мобилних података?

Reachability проверава заставицу kSCNetworkReachabilityFlagsIsWWAN у битовској масци SCNetworkReachabilityFlags. Ако је заставица постављена — веза је путем мобилне мреже (WWAN), ако није и хост је Reachable — путем Wi-Fi-ја. Ово је једини начин разликовања типова без CoreTelephony-ја.

Зашто Reachability приказује доступност, али захтеви не раде?

SCNetworkReachability проверава доступност хоста на мрежном нивоу, али не гарантује рад протокола вишег нивоа. Могући узроци: каптивни портал, DNS блокада, proxy сервер или фајервол. 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 са типом, трошковима и multipath-ом.
  • Миграција укључује замену SCNetworkReachability на NWPathMonitor са очувањем логике кроз протокол NetworkMonitorProtocol.
  • Reachability остаје потребна за пројекте са подршком за iOS 11 и ниже или за брзу синхрону проверу.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође