[IOS / Swift] 네트워크 연결상태 체크

서프로·2023년 4월 6일
0
post-thumbnail

오늘은 개인 프로젝트에서 네트워크 상태를 체크하는 기능을 구현하면서 알아본 내용을 적으려고 함.

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 가 나타나도록 할 수 있었음.

0개의 댓글