Mobil uygulama geliştirirken kullanıcıların, cihazlarının ağ bağlantı durumunu izlemek ve bu duruma göre uygulama davranışlarını uyarlamak oldukça yaygındır. Bu amaçla, iOS ve macOS gibi platformlarda kullanılan Network framework’ü bize NWPathMonitor sınıfını sunar. NWPathMonitor, ağ bağlantısı durumunu izlememize ve bu durumu takip eden eylemleri gerçekleştirmemize olanak tanır.
Aşağıda, basit bir ConnectivityMonitor sınıfını ve bu sınıfı kullanarak ağ bağlantı durumunu izlemeyi gösteren bir örneği bulabilirsiniz.
ConnectivityMonitor Sınıfı:
import Foundation
import Network
import Observation
@Observable
class ConnectivityMonitor {
private let connectivityMonitor = NWPathMonitor()
private let workerQueue = DispatchQueue(label: "Monitor")
var isConnected = false
init() {
connectivityMonitor.pathUpdateHandler = { path in
self.isConnected = path.status == .satisfied
}
connectivityMonitor.start(queue: workerQueue)
}
}
Yukarıdaki sınıf, Observation Framework ve @Observable makrosu ile Network Framework’a ait NWPathMonitor sınıfını kullanır. Bağlantı durumu değiştiğinde, Observation Framework sayesinde diğer nesnelere otomatik olarak bildirim gönderir. (Swift 5.9 ile hayatımıza gire makrolar sayesinde nesneleri @Published, @ObservableObject veya @StateObject olarak işaretlememiz gerekmiyor. iOS 17 ve üstüne destek verdiği unutulmamalıdır. Alt versiyonları da desteklemek istiyorsak buna dikkat etmeliyiz.)
private let workerQueue = DispatchQueue(label: "ConnectivityMonitor")
workerQueue adında bir DispatchQueue oluşturulur. Bu, bağlantı durumu güncellemelerini işlemek için kullanılacak özel bir iş parçacığı kuyruğudur.connectivityMonitor.pathUpdateHandler = { path in ... }
: NWPathMonitor’ün pathUpdateHandler özelliği atanır. Bu özellik, ağ bağlantısının durumu güncellendiğinde çağrılır ve bağlantı durumu değişkeni (isConnected
) güncellenir.connectivityMonitor.start(queue: workerQueue)
: NWPathMonitor başlatılır ve workerQueue üzerinde çalıştırılır. Bu, bağlantı durumu izleme işleminin belirtilen iş parçacığı kuyruğunda gerçekleştirileceği anlamına gelir.
Kullanım Örneği:
struct ContentView: View {
@State private var connectivityMonitor = ConnectivityMonitor()
var body: some View {
NavigationStack {
VStack {
if connectivityMonitor.isConnected {
Text("İnternet Bağlantısı Var.")
.font(.title)
.foregroundStyle(.green)
} else {
Text("İnternet Bağlantısı Yok.")
.font(.title)
.foregroundStyle(.red)
}
}
.padding()
.navigationTitle("Connection Check")
}
}
}
Uygulama genelinde herhangi bir view içerisinde kullanmak istersek de .environment olarak bu işaretleyip kullanabiliriz.
import SwiftUI
@main
struct CheckInternetConnectionApp: App {
@State private var connectivityMonitor = ConnectivityMonitor()
var body: some Scene {
WindowGroup {
ContentView()
.environment(connectivityMonitor)
}
}
}
struct ContentView: View {
@Environment(ConnectivityMonitor.self) private var connectivityMonitor
var body: some View {
NavigationStack {
VStack {
if connectivityMonitor.isConnected {
Text("İnternet Bağlantısı Var.")
.font(.title)
.foregroundStyle(.green)
} else {
Text("İnternet Bağlantısı Yok.")
.font(.title)
.foregroundStyle(.red)
}
}
.padding()
.navigationTitle("Connection Check")
}
}
}