오늘은 개인 프로젝트에서 네트워크 상태를 체크하는 기능을 구현하면서 알아본 내용을 적으려고 함.
Network 라이브러리에서는 Network 객체를 사용하여 네트워크 상태 변경에 대한 알림을 받을 수 있으며, PathMonitor 객체를 사용하여 인터넷 연결 상태 및 네트워크 경로 변경을 모니터링할 수 있음.
먼저, 아래는 예제 코드이다.
import Network
let monitor = NWPathMonitor()
monitor.pathUpdateHandler = { path in
if path.status == .satisfied {
print("인터넷 연결됨")
} else {
print("인터넷 연결 안 됨")
}
}
let queue = DispatchQueue(label: "NetworkMonitor")
monitor.start(queue: queue)
위 예제 코드에서는 NWPathMonitor를 사용하여 네트워크 경로 상태를 모니터링하고, pathUpdateHandler 클로저를 통해 상태 변경에 대한 처리를 수행함. start(queue:) 메서드를 호출하여 모니터링을 시작함.
Network 라이브러리에서는 이외에도, Wi-Fi 연결 상태, 셀룰러 데이터 사용 상태 등 다양한 네트워크 상태 정보를 제공한다고 함.
필자는 SwiftUI에서 적용하였고, 모든 화면에서 네트워크 연결상태를 계속 바라보기 위해서 ViewModel에서 네트워크 연결상태를 나타내는 @Published 변수를 사용하여 ContentView에서 네트워크 연결변화를 감지하도록 하였음.
아래는 필자가 개인 프로젝트에 작성한 코드임.
class HomeViewModel: ObservableObject {
var monitor = NWPathMonitor()
let queue = DispatchQueue.global()
@Published var isConnected = false
init() {
startMonitoring()
}
deinit {
stopMonitoring()
}
// method working when you touch 'Check Status' button.
func startMonitoring() {
//연결을 끊고 재연결 시 모니터링이 되지 않았음. -> 객체를 새로 생성하니 정상적으로 모니터링이 이루어졌음. (cancel시에 객체가 사라지나봄?)
monitor = NWPathMonitor()
monitor.start(queue: queue)
monitor.pathUpdateHandler = { [weak self] path in
guard let self = self else { return }
DispatchQueue.main.async {
self.isConnected = path.status == .satisfied
}
}
}
// method stop checking.
func stopMonitoring() {
monitor.cancel()
}
}
struct ContentView: View {
@StateObject var viewModel = HomeViewModel()
var body: some View {
ZStack {
VStack {
// View code
}
if !viewModel.isConnected {
ZStack {
GeometryReader { geometry in
NetworkPopupView(viewModel: viewModel)
.position(x: geometry.size.width / 2, y: geometry.size.height / 2)
}
.background(
Color.black.opacity(0.65)
.edgesIgnoringSafeArea(.all)
)
}
}
}
}
}
위와 같이 앱내 모든 화면에서 네트워크 상태가 끊어지면 작성한 NetworkPopupView 가 나타나도록 할 수 있었음.