NWPathMonitor — μια κλάση από το πλαίσιο Network σε iOS και macOS για την παρακολούθηση της κατάστασης της διαδρομής δικτύου της συσκευής. Σύμφωνα με το Apple Developer Documentation (2025), το NWPathMonitor επιτρέπει στην εφαρμογή να παρακολουθεί τη διαθεσιμότητα δικτύου, να καθορίζει τον τύπο διεπαφής και να αντιδρά σε αλλαγές σύνδεσης. NWPathMonitor παρέχει πληροφορίες σχετικά με τον τύπο σύνδεσης, το κόστος κίνησης και τη διαθεσιμότητα διαδικτύου μέσω ενός βολικού callback με NWPath.
Κύρια σημεία
NWPathMonitor — είναι μια κλάση από το πλαίσιο Network, που εισήχθη από την Apple στο iOS 12 και macOS 10.14 Mojave. Παρέχει ένα σύγχρονο API για την παρακολούθηση αλλαγών στη διαδρομή δικτύου της συσκευής — του συνδυασμού διεπαφών δικτύου μέσω των οποίων διέρχεται η κίνηση της εφαρμογής.
Πριν από το iOS 12, για την παρακολούθηση δικτύου χρησιμοποιούνταν η βιβλιοθήκη Reachability, χτισμένη στο C-πλαίσιο SystemConfiguration. Το NWPathMonitor είναι μια εγγενής εναλλακτική Swift με πλουσιότερο API, υποστήριξη για σύγχρονους τύπους συνδέσεων (VPN, multipath, LTE, 5G) και ενσωματωμένη εργασία με GCD.
Η βασική διαφορά μεταξύ NWPathMonitor και Reachability — το αντικείμενο NWPath παρέχει όχι μόνο μια δυαδική κατάσταση “διαθέσιμο/μη διαθέσιμο”, αλλά μια πλήρη εικόνα της διαδρομής: τις χρησιμοποιούμενες διεπαφές, την προτεραιότητά τους, το κόστος, την κατάσταση περιαγωγής και τη δυνατότητα proxy και VPN. Ο προγραμματιστής λαμβάνει ολοκληρωμένες πληροφορίες για τη λήψη αποφάσεων σχετικά με αιτήματα δικτύου.
Το πλαίσιο Network εμφανίστηκε ως ένα σύγχρονο υποκατάστατο των χαμηλού επιπέδου C-API — CFStream και BSD Sockets. Παρέχει μια ενοποιημένη διεπαφή για επικοινωνία δικτύου σε όλες τις πλατφόρμες Apple, συμπεριλαμβανομένων των watchOS και tvOS. Το NWPathMonitor είναι μέρος αυτού του πλαισίου μαζί με τα NWConnection, NWListener και NWBrowser.
Το πλαίσιο Network είναι γραμμένο σε Swift και χρησιμοποιεί GCD για ασύγχρονη επεξεργασία. Αυτό σημαίνει ότι τα callback του NWPathMonitor εκτελούνται στην καθορισμένη ουρά dispatch queue, ενσωματώνοντας την υπάρχουσα αρχιτεκτονική πολλαπλών νημάτων της εφαρμογής χωρίς χειροκίνητη διαχείριση νημάτων.
Η χρήση του NWPathMonitor ξεκινά με τη δημιουργία μιας παρουσίας της κλάσης και τη ρύθμιση του χειριστή pathUpdateHandler. Στη συνέχεια καλείται η μέθοδος start με καθορισμό της ουράς dispatch queue στην οποία θα εκτελείται το closure. Η διακοπή της παρακολούθησης γίνεται με τη μέθοδο cancel, η οποία επίσης απελευθερώνει πόρους.
import Network
class NetworkMonitor {
private let monitor = NWPathMonitor()
private let queue = DispatchQueue("monitor")
func startMonitoring() {
monitor.pathUpdateHandler = { path in
if path.status == .satisfied {
print("Δίκτυο διαθέσιμο")
} else {
print("Δίκτυο μη διαθέσιμο")
}
}
monitor.start(on: queue)
}
func stopMonitoring() {
monitor.cancel()
}
}
Το NWPathMonitor μπορεί να ρυθμιστεί ώστε να παρακολουθεί μόνο έναν συγκεκριμένο τύπο διεπαφής. Για αυτό χρησιμοποιείται ο αρχικοποιητής NWPathMonitor(requiredInterfaceType:) με την παράμετρο NWInterface.InterfaceType — .wifi, .cellular, .wiredEthernet ή .loopback. Εάν ο τύπος δεν έχει καθοριστεί, η παρακολούθηση γίνεται για όλες τις διεπαφές.
Πρακτικό παράδειγμα: μια εφαρμογή ροής μπορεί να παρακολουθεί μόνο το Wi-Fi και να προειδοποιεί τον χρήστη για μετάβαση σε δεδομένα κινητού. Ο έλεγχος isConstrained και isExpensive στο NWPath επιτρέπει τον προσδιορισμό του εάν η τρέχουσα σύνδεση χρεώνεται ή είναι περιορισμένη σε ταχύτητα.
Η παρακολούθηση πρέπει να ξεκινά κατά την εκκίνηση της εφαρμογής ή κατά την είσοδο σε πρώτο πλάνο και να σταματά κατά τη μετάβαση σε δεύτερο πλάνο. Συνιστάται η δημιουργία μιας παρουσίας NWPathMonitor για ολόκληρη την εφαρμογή (singleton) και η χρήση της από διαφορετικές ενότητες μέσω ενός πρωτοκόλλου ή επιπέδου υπηρεσιών.
NWPath — το αντικείμενο που μεταβιβάζεται στο pathUpdateHandler, το οποίο περιγράφει την τρέχουσα κατάσταση της διαδρομής δικτύου. Περιέχει πέντε βασικές ιδιότητες που καλύπτουν τα περισσότερα σενάρια παρακολούθησης δικτύου. NWPath.Status — μια απαρίθμηση με τρεις καταστάσεις: satisfied (διαθέσιμο), unsatisfied (μη διαθέσιμο) και requiresConnection (απαιτεί σύνδεση).
| Ιδιότητα | Τύπος | Περιγραφή |
|---|---|---|
| status | NWPath.Status | Τρέχουσα κατάσταση διαδρομής: satisfied, unsatisfied, requiresConnection |
| availableInterfaces | [NWInterface] | Λίστα όλων των διαθέσιμων διεπαφών δικτύου |
| gateways | [NWEndpoint] | Λίστα πυλών που χρησιμοποιούνται για δρομολόγηση |
| isExpensive | Bool | True εάν η σύνδεση χρεώνεται (δεδομένα κινητού, προσωπικό hotspot) |
| isConstrained | Bool | True εάν η σύνδεση είναι περιορισμένη σε ταχύτητα (Λειτουργία Χαμηλών Δεδομένων) |
Η ιδιότητα isExpensive — μια κρίσιμης σημασίας σημαία για εφαρμογές που εργάζονται με μεγάλους όγκους δεδομένων. Εάν isExpensive = true, η εφαρμογή πρέπει να μειώσει την ποιότητα ροής, να αναβάλει τη λήψη ενημερώσεων ή να προειδοποιήσει τον χρήστη. Το isConstrained υποδεικνύει ενεργοποιημένη Λειτουργία Χαμηλών Δεδομένων.
Για τον έλεγχο της διαθεσιμότητας διαδικτύου (όχι μόνο δικτύου) χρησιμοποιείται η μέθοδος usesInterfaceType. Εάν η συσκευή είναι συνδεδεμένη σε Wi-Fi χωρίς διαδίκτυο — το NWPath μπορεί να εμφανίζει satisfied, αλλά η πραγματική πρόσβαση απουσιάζει. Σε τέτοιες περιπτώσεις απαιτείται πρόσθετη επικύρωση μέσω NWConnection.
Ας εξετάσουμε μια προηγμένη υλοποίηση NWPathMonitor με διαχείριση κόστους, τύπων διεπαφής και ειδοποίηση του ViewModel μέσω publisher. Στο παράδειγμα χρησιμοποιείται το πλαίσιο Combine για αντιδραστική ενημέρωση του UI κατά την αλλαγή κατάστασης δικτύου.
import Network
import Combine
final class NetworkManager: ObservableObject {
static let shared = NetworkManager()
@Published private(set) var isConnected = true
@Published private(set) var isExpensive = false
private let monitor = NWPathMonitor()
private let queue = DispatchQueue("NetworkMonitor")
private init() {
monitor.pathUpdateHandler = { [weak self] path in
DispatchQueue.main.async {
self?.isConnected = path.status == .satisfied
self?.isExpensive = path.isExpensive
}
}
monitor.start(on: queue)
}
func checkInterface() -> NWInterface.InterfaceType {
let path = monitor.currentPath
if path.usesInterfaceType(.wifi) { return .wifi }
if path.usesInterfaceType(.cellular) { return .cellular }
return .other
}
}
Κατά την απώλεια σύνδεσης μπορεί να απαιτείται όχι μόνο ειδοποίηση του UI, αλλά και εκτέλεση καθυστερημένων ενεργειών — για παράδειγμα, αποθήκευση ενός προσχεδίου αιτήματος για μεταγενέστερη αποστολή. Υλοποιήστε μια ουρά καθυστερημένων αιτημάτων που συσσωρεύει λειτουργίες σε κατάσταση unsatisfied και τις αποστέλλει κατά την αποκατάσταση του satisfied.
Για αυτήν την εργασία, το μοτίβο ReachabilityManager με εκπρόσωπο είναι ιδανικό: το NWPathMonitor ειδοποιεί τον διαχειριστή, ο διαχειριστής ενημερώνει την ουρά και το UI. Κατά την αλλαγή κατάστασης σε satisfied, η ουρά αδειάζει αυτόματα και το UI λαμβάνει ένδειξη αποκατάστασης της σύνδεσης.
Πριν από την εμφάνιση του NWPathMonitor, η τυπική λύση για παρακολούθηση δικτύου στο iOS ήταν η βιβλιοθήκη Reachability της Apple (παράδειγμα από την τεκμηρίωση), χτισμένη στο SystemConfiguration. Οι κύριες διαφορές: Η Reachability λειτουργεί μέσω SCNetworkReachability σε C, δεν υποστηρίζει σύγχρονους τύπους δικτύου και δίνει μόνο μια δυαδική απάντηση σχετικά με τη διαθεσιμότητα.
Το NWPathMonitor λύνει αυτούς τους περιορισμούς: είναι γραμμένο σε Swift, υποστηρίζει VPN, multipath, 5G και LTE, παρέχει λεπτομερείς πληροφορίες για κάθε διεπαφή και λειτουργεί ασύγχρονα μέσω GCD. Η Reachability εξακολουθεί να χρησιμοποιείται σε έργα με ελάχιστη υποστήριξη για iOS 11 και παλαιότερα.
| Χαρακτηριστικό | NWPathMonitor | Reachability |
|---|---|---|
| Ελάχιστη έκδοση | iOS 12 | iOS 2 |
| Γλώσσα | Swift (Network) | C (SystemConfiguration) |
| Τύποι διεπαφών | Wi-Fi, Cellular, Ethernet, VPN | Wi-Fi, WWAN (γενικό) |
| isExpensive | Υπάρχει | Δεν υπάρχει |
| Ασύγχρονο | GCD (dispatch queue) | RunLoop |
| Πολλαπλές διεπαφές | Υπάρχει (multipath) | Δεν υπάρχει |
Εάν η εφαρμογή σας υποστηρίζει iOS 11 και παλαιότερα, το Reachability παραμένει η μόνη επιλογή. Για έργα iOS 12+ συνιστάται η άμεση χρήση του NWPathMonitor — ενσωματώνεται καλύτερα με σύγχρονο κώδικα Swift, Combine και SwiftUI.
Η μετάβαση από Reachability σε NWPathMonitor είναι απλή: αρκεί να αντικαταστήσετε τις κλήσεις SCNetworkReachability με NWPathMonitor, διατηρώντας την ίδια λογική επεξεργασίας. Το επίπεδο αφαίρεσης (πρωτόκολλο NetworkMonitorProtocol) θα επιτρέψει την εναλλαγή μεταξύ υλοποιήσεων χωρίς αλλαγή της επιχειρηματικής λογικής της εφαρμογής.
Συχνές Ερωτήσεις
Το NWPathMonitor είναι διαθέσιμο από iOS 12.0, macOS 10.14, watchOS 5.0 και tvOS 12.0. Για έργα που υποστηρίζουν παλαιότερες εκδόσεις, χρησιμοποιήστε το Reachability από το SystemConfiguration ή βιβλιοθήκες περιτυλίγματος με υπό όρους μεταγλώττιση μέσω #available.
Satisfied σημαίνει ότι η κίνηση μπορεί να διέλθει μέσω τουλάχιστον μιας διεπαφής. Unsatisfied — καμία διεπαφή δεν είναι διαθέσιμη. Η κατάσταση requiresConnection — η διαδρομή απαιτεί εγκατάσταση σύνδεσης (π.χ. το VPN δεν είναι συνδεδεμένο) και η κίνηση προσωρινά δεν διέρχεται.
Χρησιμοποιήστε τη μέθοδο usesInterfaceType στο NWPath: path.usesInterfaceType(.wifi) για Wi-Fi, path.usesInterfaceType(.cellular) για δεδομένα κινητού. Η μέθοδος επιστρέφει true εάν η τρέχουσα κίνηση διέρχεται μέσω του καθορισμένου τύπου διεπαφής.
Συνιστάται η παύση της παρακολούθησης στο δεύτερο πλάνο για εξοικονόμηση μπαταρίας. Η κλήση monitor.cancel() στο applicationDidEnterBackground και η επανεκκίνηση στο applicationWillEnterForeground μειώνουν την κατανάλωση ενέργειας. Για κρίσιμες λειτουργίες, χρησιμοποιήστε το Background Task.
Το NWPathMonitor μπορεί να εμφανίζει satisfied ακόμη και σε δεσμευμένη πύλη. Για τον προσδιορισμό της πραγματικής πρόσβασης στο διαδίκτυο, εκτελέστε ένα αίτημα HTTP σε αξιόπιστο τελικό σημείο μέσω NWConnection. Εάν ληφθεί ανακατεύθυνση — η πύλη είναι ενεργή, απαιτείται εξουσιοδότηση στο WebView.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης