Reachability: ano ito, aklatan para sa pagsusuri ng pagkakaroon ng network

May-akda: IT Sectr Nai-publish: 2026-03-11 Oras ng pagbabasa: 10 min

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 — isang wrapper sa ibabaw ng C-framework ng SystemConfiguration para sa pagsubaybay sa pagkakaroon ng network sa iOS at macOS.
  • SCNetworkReachability — mababang antas ng C-API na sumusuri sa abot ng isang malayuang host o address.
  • Mga uri ng koneksyon — Pinag-iiba ng Reachability ang Wi-Fi at mobile data (WWAN) para iakma ang pag-uugali ng app.
  • Mga abiso — sa pamamagitan ng SCNetworkReachabilitySetCallback, ang aklatan ay nag-subscribe sa mga pagbabago sa network gamit ang RunLoop.
  • NWPathMonitor — isang modernong alternatibo sa Reachability, available simula iOS 12 at inirerekomenda ng Apple.

Ano ang Reachability?

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).

Kasaysayan at status ng aklatan

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.

Paano gumagana ang Reachability sa ilalim ng hood

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.

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
    }
}

Mga flag ng abot ng network

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.

Mga halimbawa ng paggamit ng Reachability

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.

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("Nakakonekta sa pamamagitan ng Wi-Fi")
            case .cellular:
                print("Nakakonekta sa pamamagitan ng cellular")
            case .unavailable:
                print("Walang koneksyon")
            }
        }
    }
}

Pagsusuri ng network bago ang kahilingan

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.

Mga uri ng koneksyon sa Reachability

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.

EstadoFlag ng SCNetworkPaglalarawan
ReachableViaWiFiReachable + !IsWWANKoneksyon sa pamamagitan ng Wi-Fi network na may access sa host
ReachableViaWWANReachable + IsWWANKoneksyon sa pamamagitan ng mobile network (2G-5G)
NotReachable!ReachableHindi maaabot ang host sa pamamagitan ng anumang interface
ConnectionRequiredReachable + ConnectionRequiredKinakailangan ang pagtatatag ng koneksyon (VPN, PPPoE)

Mga limitasyon ng Reachability ayon sa uri ng network

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.

Paglipat mula Reachability patungong NWPathMonitor

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.

swift
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()
    }
}

Mga rekomendasyon para sa paglipat

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

Ano ang minimum na bersyon ng iOS na sumusuporta sa Reachability?

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.

Paano naiiba ang Reachability sa simpleng pagsusuri ng ping?

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.

Maaari bang gamitin ang Reachability sa mga proyekto ng SwiftUI?

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.

Paano tinutukoy ng Reachability ang Wi-Fi vs mobile data?

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.

Bakit nagpapakita ang Reachability ng availability, ngunit hindi gumagana ang mga kahilingan?

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

  • Reachability — aklatan sa SystemConfiguration para sa pagsubaybay sa network ng iOS, na gumagana sa pamamagitan ng SCNetworkReachability C-API.
  • Tatlong estado — Wi-Fi, mobile data (WWAN), at hindi available — tinutukoy ng mga bit flag ng SCNetworkReachabilityFlags.
  • Asynchronous na mga abiso na ipinatutupad sa pamamagitan ng SCNetworkReachabilitySetCallback na may RunLoop at NotificationCenter.
  • Mga limitasyon — Hindi pinag-iiba ng Reachability ang 4G/5G, VPN, Ethernet at hindi nagbibigay ng impormasyon tungkol sa mga gastos sa trapiko.
  • NWPathMonitor — modernong kapalit ng Reachability para sa iOS 12+, na nagbibigay ng detalyadong NWPath na may uri, gastos, at multipath.
  • Paglipat ay kinabibilangan ng pagpapalit ng SCNetworkReachability ng NWPathMonitor na may pagpapanatili ng lohika sa pamamagitan ng protocol na NetworkMonitorProtocol.
  • Ang Reachability ay nananatiling kailangan para sa mga proyektong may suporta sa iOS 11 at pababa o para sa mabilis na synchronous na pagsusuri.

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.

Pag-usapan ang proyekto

Basahin din