How to monitor network in SwiftUI
Network monitoring is crucial for maintaining robust and reliable applications.
In this blog post, we’ll explore how to implement network monitoring in Swift using Apple’s native Network framework.
By leveraging this framework, you can efficiently track network connectivity, detect changes, and respond accordingly.
What is NWPathMonitor
?
NWPathMonitor is a class that monitors changes to network connectivity.
It provides information about the current network path, such as the status of the network connection and the available interfaces.
Writing the monitor
import SwiftUI
import Network
final class NetworkMonitor: ObservableObject {
// This will be used to track the network connectivity
@Published
var isConnected = true
// This will be used to track if the network is expensive (e.g. cellular data)
@Published
var isExpensive = false
@Published
var networkType: NWInterface.InterfaceType? = .other
// This will be used to track the network path (e.g. Wi-Fi, cellular data, etc.)
@Published
var nwPath: NWPath?
// Create an instance of NWPathMonitor
let monitor = NWPathMonitor()
init() {
// Set the pathUpdateHandler
monitor.pathUpdateHandler = { [weak self] path in
// Check if the device is connected to the internet
self?.isConnected = path.status == .satisfied
// Check if the network is expensive (e.g. cellular data)
self?.isExpensive = path.isExpensive
// Check which interface we are currently using
self?.networkType = path.availableInterfaces.first?.type
// Update the network path
self?.nwPath = path
}
// Create a queue for the monitor
let queue = DispatchQueue(label: "Monitor")
// Start monitoring
monitor.start(queue: queue)
}
deinit {
// Stop monitoring
monitor.cancel()
}
}
Use the monitor
import SwiftUI
struct ContentView: View {
@ObservedObject
private var network = NetworkMonitor()
var body: some View {
VStack {
Text("Hello!")
Text("The network status is \(network.isConnected ? "Connected" : "Disconnected")")
Text("You are using a \"\(network.isExpensive ? "Expensive" : "Normal")\" internet connection")
HStack(spacing: 0) {
Text("You are using \"")
switch (network.networkType) {
case .cellular:
Text("Celluar")
case .wifi:
Text("Wifi")
case .loopback:
Text("Loopback")
case .other:
Text("Other")
case .wiredEthernet:
Text("Wired")
default:
Text("Unknown")
}
Text("\" to connect to the internet")
}
}.task {
print(network.nwPath)
}
}
}
Download the Swift Playground here
Conclusion
Network monitoring is crucial for maintaining robust and reliable applications.
In this blog post, we explored how to implement network monitoring in Swift using Apple’s native Network framework.
By leveraging this framework, you can efficiently track network connectivity, detect changes, and respond accordingly.
Resources:
https://developer.apple.com/documentation/network
Read more
- Aurora Editor • 5 minutes reading time.
- @ViewBuilder in Swift • 4 minutes reading time.
- Simplifying Game Controller Integration with GameControllerKit • 5 minutes reading time.
Share
Share Mastodon Twitter LinkedIn Facebook