본문 바로가기

iOS/Swift

NWPathMonitor

An observer that you use to monitor and react to network changes.

  • 네트워크 변화를 감지해 전달해주는 클래스
  • iOS 14부터 사용 가능

Creating Path Monitors

func start(queue: DispatchQueue)

  • Starts monitoring path changes, and sets a queue on which to deliver path events
  • 모니터를 시작하는 함수

var queue: DispatchQueue?

  • The Queue on which path events are delivered
  • path events를 전달하기 위한 큐

Handling Path Updates

var currentPath: NWPath

  • The currently available network path observed by the path monitor

var pathUpdateHandler: (NWPath) → Void)?

  • A handler that receives network path updates.
  • 네트워크 패스의 업데이트 사항을 전달받는 핸들러

Canceling Path Monitors

func cancel()

  • Stops receiving network path updates
  • 업데이트 패스를 받는 행위를 취소하기 위한 함수
enum NetworkType {
    
    case wifi
    case cellular
    case wiredEthernet
    case loopback
    case other
    
}

enum NetworkStatus {
    
    case satisfied(NetworkType)
    case unsatisfied
    case requiresConnection
    
}

protocol NetworkManagerProtocol {
    
    var networkStatusPublisher: PassthroughSubject<NetworkStatus, Never> { get }
    func startMonitor()
    func stopMonitor()
    
}

final class NetworkManager {
    
    static let shared: NetworkManager = NetworkManager()
    var networkStatusPublisher: PassthroughSubject<NetworkStatus, Never> = .init()
    private let nwPathMonitor = NWPathMonitor()
    private let queue = DispatchQueue.global() // 이벤트를 백그라운드에서 처리하기 위해 global queue로 선언
    
    private init() {
        self.startMonitor()
    }
    
}

extension NetworkManager: NetworkManagerProtocol {
    
    func startMonitor() {
        self.nwPathMonitor.pathUpdateHandler = { [weak self] path in
            switch path.status {
            case .satisfied:
                if path.usesInterfaceType(.wifi) {
                    self?.networkStatusPublisher.send(.satisfied(.wifi))
                } else if path.usesInterfaceType(.cellular) {
                    self?.networkStatusPublisher.send(.satisfied(.cellular))
                } else if path.usesInterfaceType(.wiredEthernet) {
                    self?.networkStatusPublisher.send(.satisfied(.wiredEthernet))
                } else if path.usesInterfaceType(.loopback) {
                    self?.networkStatusPublisher.send(.satisfied(.loopback))
                } else {
                    self?.networkStatusPublisher.send(.satisfied(.other))
                }
            case .unsatisfied:
                self?.networkStatusPublisher.send(.unsatisfied)
            case .requiresConnection:
                self?.networkStatusPublisher.send(.requiresConnection)
            @unknown default:
                self?.networkStatusPublisher.send(.unsatisfied)
            }
        }
        self.nwPathMonitor.start(queue: queue)
    }
    
    func stopMonitor() {
        self.nwPathMonitor.cancel()
    }
    
}

 - 샘플앱에는 토스트 라는 뷰를 만들어 정상적인 상태가 아닐 때에는 해당 뷰를 보여주는 형태로 구성되어 있다.

Github

https://github.com/davidyoon891122/NWPathMonitorSample

참조

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

'iOS > Swift' 카테고리의 다른 글

UIBackgroundTaskIdentifier  (0) 2024.05.20
UnsafePointer  (0) 2024.05.08
UnsafePointer  (0) 2024.04.29
Singleton Pattern  (0) 2024.04.15
CombineLatest Vs Zip  (0) 2024.04.08