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-а наводи се или име хоста (нпр. 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 функцију повратног позива. Повратни позив се извршава на текућем RunLoop-у када се стање доступности хоста промени. Reachability омотава овај C-позив у Objective-C методу и шаље обавештење путем 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("Повезан путем Wi-Fi-ја")
case .cellular:
print("Повезан путем мобилне мреже")
case .unavailable:
print("Нема везе")
}
}
}
}
Пре извршавања 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
}
// Савремена имплементација која користи 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. Ово пружа развојачу више података за прилагођавање понашаља апликације тренутним условима мреже.
Често постављана питања
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 блокада, proxy сервер или фајервол. Reachability је први филтар, али не замењује прави HTTP захтев.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође