Reachability — isang aklatan para sa iOS at macOS, na binuo sa framework ng SystemConfiguration, na nagbibigay-daan sa iyo upang suriin ang pagkakaroon ng koneksyon sa internet at subaybayan ang mga pagbabago nito. Ayon sa Apple Developer Documentation (2025), ginagamit ng Reachability ang SCNetworkReachability para sa asynchronous na pagsubaybay sa network. Ang aklatan ng Reachability ay nanatiling pamantayan para sa mga proyekto ng iOS sa mahabang panahon hanggang sa pagdating ng native na NWPathMonitor.
Mga Pangunahing Punto
Reachability — ay isang halimbawang aklatan mula sa Apple na nagpapakita ng paggamit ng framework ng SystemConfiguration para sa pagsubaybay sa network. Ang source code ay nai-publish sa Apple Developer Documentation bilang isang halimbawa, ngunit tinanggap ito ng komunidad bilang isang karaniwang tool para sa pagsusuri ng koneksyon sa mga proyekto ng iOS.
Gumagana ang aklatan batay sa SCNetworkReachability — isang C function mula sa SystemConfiguration na sumusuri sa abot ng isang malayuang host o IP address. Kapag gumagawa ng Reachability, tinutukoy ang alinman sa host name (hal., google.com) o IP address, at ang aklatan ay asynchronous na sumusuri kung ang host na ito ay maaabot sa pamamagitan ng kasalukuyang mga network interface ng device.
Ang kasikatan ng Reachability ay dahil sa pagiging simple nito: sapat na gumawa ng instance, mag-subscribe sa mga abiso sa pamamagitan ng NotificationCenter, at makinig sa kReachabilityChangedNotification. Bilang tugon, natatanggap ng app ang status: NotReachable, ReachableViaWiFi, o ReachableViaWWAN (mobile data).
Unang lumitaw ang Reachability sa iPhone OS 2 (2008) kasama ng framework ng SystemConfiguration. Sa loob ng sampung taon, ito ang tanging native na paraan ng pagsubaybay sa network sa iOS. Sa paglabas ng iOS 12 at framework ng Network, inirerekomenda ng Apple ang NWPathMonitor bilang kapalit, ngunit sinusuportahan pa rin ang Reachability.
Maraming third-party wrapper — AFNetworking, Alamofire, AshleyDodd/Reachability.swift — ang gumagamit ng internal na mekanismo ng SCNetworkReachability. Ang mga aklatan na ito ay nagdaragdag ng maginhawang Swift/Objective-C interface, memoization ng status, at thread-safe na callback, na pinapanatili ang parehong batayan ng SystemConfiguration.
Ang pangunahing mekanismo ng Reachability — function na SCNetworkReachabilityCreateWithName, na gumagawa ng tracking object para sa tinukoy na host. Pagkatapos ay tinatawag ang SCNetworkReachabilityGetFlags — isang synchronous na pagsusuri na nagbabalik ng bitmask na SCNetworkReachabilityFlags na may kasalukuyang estado ng network.
Para sa asynchronous na pagsubaybay, ginagamit ang SCNetworkReachabilitySetCallback, na nagrerehistro ng C callback function. Ang callback ay isinasagawa sa kasalukuyang RunLoop kapag nagbago ang estado ng abot ng host. Binabalot ng Reachability ang C-callback na ito sa isang Objective-C method at nagpapadala ng abiso sa pamamagitan ng 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 — bitmask na nagko-code ng estado ng network. Ang flag na kSCNetworkReachabilityFlagsReachable ay nagpapahiwatig na ang host ay maaabot. kSCNetworkReachabilityFlagsConnectionRequired — para sa koneksyon, kinakailangan ang pagtatatag ng komunikasyon. Tinutukoy ng kumbinasyon ng mga flag kung ang app ay maaaring magpadala ng data.
Karagdagang mga flag: kSCNetworkReachabilityFlagsIsWWAN — koneksyon sa pamamagitan ng mobile network (iOS), kSCNetworkReachabilityFlagsInterventionRequired — nangangailangan ng interbensyon ng user (hal., para sa VPN). Isinasaalang-alang ng Reachability ang mga flag na ito para matukoy ang uri ng interface.
Ang karaniwang pattern ng paggamit ng Reachability sa isang iOS app ay kinabibilangan ng paggawa ng instance, pag-subscribe sa mga abiso, at pagtugon sa pagbabago ng status. Ipinapakita ng halimbawa sa ibaba ang pagsasama sa NotificationCenter para sa pag-update ng UI kapag nagbago ang network.
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("Nakakonekta sa pamamagitan ng Wi-Fi")
case .cellular:
print("Nakakonekta sa pamamagitan ng cellular")
case .unavailable:
print("Walang koneksyon")
}
}
}
}
Bago magsagawa ng HTTP request, maaari mong suriin ang pagkakaroon ng network nang synchronous: reachability.connection != .unavailable. Hindi nito ginagarantiyahan ang tagumpay ng kahilingan (maaaring hindi available ang server), ngunit pinipigilan ang mga tiyak na mabibigong kahilingan at pinapabuti ang UX — hindi nagpapakita ng spinner ang app sa offline mode.
Para sa mas tumpak na pagsusuri, pagsamahin ang Reachability sa mga timeout ng URLSession. Kung ang Reachability ay nagpapakita ng reachable ngunit ang kahilingan ay hindi naisakatuparan sa loob ng timeout — malamang na ang problema ay nasa panig ng server o captive portal. Sa kasong ito, maaari kang magpakita ng mensahe sa user tungkol sa hindi pag-available ng server.
Pinag-iiba ng Reachability ang tatlong pangunahing estado ng koneksyon: Wi-Fi, mobile data (WWAN), at hindi available. Saklaw ng WWAN ang lahat ng uri ng mobile communication — 2G, 3G, 4G/LTE, 5G. Hindi nagbibigay ang aklatan ng mga detalye sa loob ng WWAN, kaya para sa pag-iiba ng 4G at 5G ay kinakailangan ang CoreTelephony.
| Estado | Flag ng SCNetwork | Paglalarawan |
|---|---|---|
| ReachableViaWiFi | Reachable + !IsWWAN | Koneksyon sa pamamagitan ng Wi-Fi network na may access sa host |
| ReachableViaWWAN | Reachable + IsWWAN | Koneksyon sa pamamagitan ng mobile network (2G-5G) |
| NotReachable | !Reachable | Hindi maaabot ang host sa pamamagitan ng anumang interface |
| ConnectionRequired | Reachable + ConnectionRequired | Kinakailangan ang pagtatatag ng koneksyon (VPN, PPPoE) |
Hindi pinag-iiba ng Reachability ang Ethernet, VPN tunnel, o multipath na koneksyon — lahat ng non-WWAN interface ay nauuri bilang Wi-Fi. Ang limitasyong ito ay nauugnay sa arkitektura ng SystemConfiguration, na hindi nagbibigay ng detalyadong impormasyon tungkol sa mga network interface lampas sa pangunahing pag-uuri.
Para sa pagtukoy ng partikular na uri ng mobile communication (4G vs 5G) ay kinakailangan ang CTTelephonyNetworkInfo mula sa CoreTelephony. Ang pagsasama ng Reachability sa CoreTelephony ay nagpapahintulot sa app na pumili ng kalidad ng nilalaman: sa 5G — 4K streaming, sa 4G/LTE — HD, sa 3G — SD o audio lamang.
Inirerekomenda ng Apple na palitan ang Reachability ng NWPathMonitor sa lahat ng bagong proyekto, simula sa iOS 12. Ang pangunahing dahilan ay ang NWPathMonitor ay bahagi ng modernong framework ng Network, nakasulat sa Swift, sumusuporta sa Combine, at nagbibigay ng detalyadong impormasyon tungkol sa network path nang hindi gumagamit ng C compatibility.
Ang proseso ng paglipat ay kinabibilangan ng pagpapalit ng SCNetworkReachability ng NWPathMonitor, paglipat mula sa NotificationCenter patungong pathUpdateHandler closure o Combine publisher. Ang algorithm at lohika ng pagproseso ng status ng network ay nananatiling pareho — tanging ang monitoring API ang nagbabago.
protocol NetworkMonitorProtocol {
var isReachable: Bool { get }
var connectionType: ConnectionType { get }
func startMonitoring()
func stopMonitoring()
}
enum ConnectionType {
case wifi, cellular, ethernet, unavailable
}
// Modernong implementasyon gamit ang 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 sa mga proyektong may pangunahing suporta sa iOS 12+, ganap na palitan ang Reachability ng NWPathMonitor. Para sa mga proyektong sumusuporta sa iOS 11, gamitin ang condition na compilation #available(iOS 12, *) na may NWPathMonitor at Reachability bilang fallback. Ito ay nagbibigay-daan sa unti-unting paglipat nang hindi nawawala ang suporta para sa mga lumang device.
Ang pangunahing bentahe ng paglipat ay ang detalye ng network path. Ang NWPathMonitor ay hindi lamang nag-uulat ng “available/hindi available”, kundi pati na rin ang uri ng bawat interface, mga gastos nito, priyoridad, suporta para sa proxy at VPN. Nagbibigay ito sa developer ng mas maraming data para iakma ang pag-uugali ng app sa kasalukuyang kondisyon ng network.
Mga Madalas Itanong
Ang Reachability sa SCNetworkReachability ay available simula iPhone OS 2 (iOS 2). Gumagana ang aklatan sa lahat ng bersyon ng iOS, kasama ang mga kasalukuyan. Ang mga limitasyon ay hindi nauugnay sa bersyon ng OS, kundi sa detalye ng impormasyon — sa mga lumang bersyon ay walang pagkakaiba sa pagitan ng 4G at 5G.
Gumagamit ang Reachability ng SCNetworkReachability — isang serbisyo ng system na sumusuri sa abot ng host sa antas ng network stack nang hindi nagpapadala ng mga packet. Ang ping ay nagpapadala ng ICMP packet at kumukonsumo ng trapiko, at maaari ring ma-block ng firewall. Ang Reachability ay mas mabilis at mas ligtas para sa madalas na pagsusuri.
Oo, gumagana ang Reachability sa SwiftUI sa pamamagitan ng ObservableObject o Combine. Balutin ito sa isang klase na naka-subscribe sa NotificationCenter at i-publish ang status sa pamamagitan ng @Published. Para sa mga bagong proyekto ng SwiftUI, inirerekomenda namin ang NWPathMonitor na may Combine publisher para sa reaktibong pag-update ng View.
Sinusuri ng Reachability ang flag na kSCNetworkReachabilityFlagsIsWWAN sa bitmask ng SCNetworkReachabilityFlags. Kung nakatakda ang flag — koneksyon sa pamamagitan ng mobile network (WWAN), kung hindi at ang host ay Reachable — sa pamamagitan ng Wi-Fi. Ito ang tanging paraan upang pag-ibahin ang mga uri nang walang CoreTelephony.
Sinusuri ng SCNetworkReachability ang abot ng host sa antas ng network, ngunit hindi ginagarantiyahan ang paggana ng mas mataas na antas ng mga protocol. Mga posibleng dahilan: captive portal, DNS block, proxy server, o firewall. Ang Reachability ay isang unang filter, ngunit hindi kapalit ng isang tunay na HTTP request.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din