Reachability — μια βιβλιοθήκη για iOS και macOS, χτισμένη πάνω στο framework SystemConfiguration, που σας επιτρέπει να ελέγχετε τη διαθεσιμότητα της σύνδεσης διαδικτύου και να παρακολουθείτε τις αλλαγές της. Σύμφωνα με το Apple Developer Documentation (2025), το Reachability χρησιμοποιεί το SCNetworkReachability για ασύγχρονη παρακολούθηση δικτύου. Η βιβλιοθήκη Reachability παρέμεινε πρότυπο για τα έργα iOS για μεγάλο χρονικό διάστημα μέχρι την εμφάνιση του εγγενούς NWPathMonitor.
Βασικά σημεία
Το Reachability — είναι μια βιβλιοθήκη παράδειγμα από την Apple που επιδεικνύει τη χρήση του framework SystemConfiguration για παρακολούθηση δικτύου. Ο πηγαίος κώδικας δημοσιεύτηκε στο Apple Developer Documentation ως παράδειγμα, αλλά η κοινότητα το υιοθέτησε ως πρότυπο εργαλείο ελέγχου σύνδεσης σε έργα iOS.
Η βιβλιοθήκη λειτουργεί βάσει του SCNetworkReachability — μιας συνάρτησης C από το SystemConfiguration που αξιολογεί την προσεγγισιμότητα ενός απομακρυσμένου κοσμικού υπολογιστή ή διεύθυνσης IP. Κατά τη δημιουργία του Reachability καθορίζετε είτε όνομα κοσμικού υπολογιστή (π.χ. google.com) είτε διεύθυνση IP, και η βιβλιοθήκη ελέχει ασύγχρονα εάν αυτός ο κοσμικός υπολογιστής είναι προσβάσιμος μέσω των τρεχουσών διεπαφών δικτύου της συσκευής.
Η δημοφιλία του Reachability οφείλεται στην απλότητά του: αρκεί να δημιουργήσετε μια περίπτωση, να εγγραφείτε σε ειδοποιήσεις μέσω NotificationCenter και να ακούτε το kReachabilityChangedNotification. Ως απάντηση, η εφαρμογή λαμβάνει κατάσταση: NotReachable, ReachableViaWiFi ή ReachableViaWWAN (κινητά δεδομένα).
Το Reachability εμφανίστηκε για πρώτη φορά στο iPhone OS 2 (2008) μαζί με το framework SystemConfiguration. Για δέκα χρόνια ήταν ο μοναδικός εγγενής τρόπος παρακολούθησης δικτύου στο iOS. Με την κυκλοφορία iOS 12 και του framework Network, η Apple συνιστά το NWPathMonitor ως αντικατάσταση, αλλά το Reachability εξακολουθεί να υποστηρίζεται.
Πολλά περιτυλίγματα τρίτων μερών — AFNetworking, Alamofire, AshleyDodd/Reachability.swift — χρησιμοποιούν τον εσωτερικό μηχανισμό SCNetworkReachability. Αυτές οι βιβλιοθήκες προσθέτουν βολική διεπαφή Swift/Objective-C, μεμοποίηση κατάστασης και thread-safe callbacks, διατηρώντας την ίδια βάση SystemConfiguration.
Ο κύριος μηχανισμός του Reachability — η συνάρτηση SCNetworkReachabilityCreateWithName, η οποία δημιουργεί ένα αντικείμενο παρακολούθησης για τον καθορισμένο κοσμικό υπολογιστή. Στη συνέχεια καλείται η SCNetworkReachabilityGetFlags — ένας σύγχρονος έλεγχος που επιστρέφει μια διαδικαστική μάσκα SCNetworkReachabilityFlags με την τρέχουσα κατάσταση δικτύου.
Για ασύγχρονη παρακολούθηση χρησιμοποιείται η SCNetworkReachabilitySetCallback, η οποία καταχωρίζει μια συνάρτηση callback C. Το callback εκτελείται στο τρέχον RunLoop όταν αλλάξει η κατάσταση προσβασιμότητας του κοσμικού υπολογιστή. Το Reachability τυλίγει αυτό το C-callback σε μα θέτοδο 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 σε λειτουργία offline.
Για ακριβέστερο έλεγχο, συνδυάστε το Reachability με χρονική ανοχή URLSession. Εάν το Reachability εμφανίζει reachable, αλλά το αίτημα δεν εκτελείται μέσα στο χρονικό περιθώριο — το πρόβλημα είναι πιθανώς από την πλευρά του διακομιστή ή πύλη captive. Σε αυτήν την περίπτωση, μπορείτε να εμφανίσετε ένα μήνυμα στον χρήστη σχετικά με την μη διαθεσιμότητα του διακομιστή.
Το 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 tunnels ή multipath συνδέσεις — όλες οι μη-WWAN διεπαφές ταξινομούνται ως Wi-Fi. Αυτός ο περιορισμός σχετίζεται με την αρχιτεκτονική του SystemConfiguration, η οποία δεν παρέχει λεπτομερή πληροφορία για διεπαφές δικτύου πέρα από την βασική ταξινόμηση.
Για τον προσδιορισμό του συγκεκριμένου τύπου κινητής επικοινωνίας (4G vs 5G) απαιτείται CTTelephonyNetworkInfo από το CoreTelephony. Ο συνδυασμός του Reachability με το CoreTelephony επιτρέπει στην εφαρμογή να επιλέξει ποιότητα περιεχομένου: σε 5G — streaming 4K, σε 4G/LTE — HD, σε 3G — SD ή μόνο ήχος.
Η Apple συνιστά την αντικατάσταση του Reachability με NWPathMonitor σε όλα τα νέα έργα, ξεκινώντας από iOS 12. Ο κύριος λόγος είναι ότι το NWPathMonitor αποτελεί μέρος του σύγχρονου framework 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 ελέγχει την προσβασιμότητα του κοσμικού υπολογιστή σε επίπεδο δικτύου, αλλά δεν εγγυάται τη λειτουργία πρωτοκόλλων ανώτερου επιπέδου. Πιθανές αιτίες: captive portal, αποκλεισμός DNS, διακομιστής proxy ή τοιχοπροστασία. Το Reachability είναι ένα πρώτο φίλτρο, αλλά δεν αντικαθιστά το πραγματικό αίτημα HTTP.
Συμπεράσματα
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης