본문 바로가기

TIL

[TIL] SwiftUI에서 네트워크 단절 대응 구현기

오늘 포스팅은 SwiftUI에서 네트워크 단절 대응 기능을 구현하였던 과정에 대해 서술해 볼까 합니다.

 

네트워크 연결 모니터링 클래스 NWPathMonitor

Swift에서 네트워크 단절 대응이라는 키워드를 구글링하면 나오는 키워드는 NWPathMonitor  클래스입니다. 

이 클래스의 특징은 이름에서도 유추할 수 있다시피 네트워크 연결에 대해 실시간으로 모니터링해주는 클래스입니다.

이 기능은 iOS12이후 버전부터 사용 가능하다고 합니다.

 

네트워크 모니터링 구현

자 이제 그럼 네트워크 연결을 담당하는 클래스를 만들어 보겠습니다.

네트워크 모니터링 클래스 선언

 

우선 NWPathMonito클래스의 인스턴스를 선언해줍니다.

그리고 나서 네트워크 모니터링을 담당할 DispatchQueue를 선언해줍니다.

외부로 네트워크 연결 상태를 나타내는 isConnected 변수를 선언해줍니다.

모니터링 개시

네트워크 연결 상태 모니터링을 시작하고 그 결과를 외부로 반환해줍니다.

모니터링 취소

 

모니터링틀 취소하는 메서드를 정의해줍니다.

실제 적용

 

위 코드와 같이 현재 네트워크 상태를 나타내는 isConnected의 값에 따라 네트워크 오류 화면을 보여줍니다.

네트워크 모니터링 클래스 전체 코드

import SwiftUI
import Network

final class Network: ObservableObject {
    
    // NWPathMonitor 클래스 인스턴스 선언
    let monitor = NWPathMonitor()
    // 네트워크 모니터링 담당 Thread
    let queue = DispatchQueue(label: "Monitor")
    @Published private(set) var isConnected: Bool = false
    
    func checkConnection() {
        // 모니터링 시작
        monitor.start(queue: queue)
        // 네트워크 연결 상태 모니터링 결과 반환
        monitor.pathUpdateHandler = { path in
            
            DispatchQueue.main.async { [weak self] in
                guard let self else { return }

                // 네트워크가 연결되어있다면 isConnected에 true 값 전달
                isConnected = path.status == .satisfied
            }
        }
    }
    
    func stop() {
        // 모니터링 취소
        monitor.cancel()
    }
}

참고 사이트

https://developer.apple.com/documentation/network/nwpathmonitor

https://velog.io/@johnjeongukhur/Network-Monitor-SwiftUI-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81

https://medium.com/@desilio/how-to-check-internet-connection-with-swiftui-9426454027f5