본문 바로가기

Programming/iOS

iOS에서 NWPathMonitor를 통한 네트워크 검색

반응형

iOS 12 이전에는

Reachability 클래스를 통하여 iOS 내에서 인터넷 상태를 체크했었습니다.

https://developer.apple.com/library/archive/samplecode/Reachability/Introduction/Intro.html

 

Reachability

Reachability Last Revision:Build Requirements:iOS SDK 8.0 or laterRuntime Requirements:iOS 8.0 or later Important: This document is no longer being updated. For the latest information about Apple SDKs, visit the documentation website. The Reachability sam

developer.apple.com

https://github.com/tonymillion/Reachability

 

tonymillion/Reachability

ARC and GCD Compatible Reachability Class for iOS and MacOS. Drop in replacement for Apple Reachability - tonymillion/Reachability

github.com

 

iOS12부터는

NWNetworkMonitor 라는 내부 라이브러리를 통해서

현재 인터넷 상태 변경에 대한 감지를 할 수 있도록 제공해주고 있습니다.

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

 

Apple Developer Documentation

 

developer.apple.com

 

일단 사용하기 위해선

import Network

let monitor = NWPathMonitor()

클래스를 초기화 해줍니다.

만약 특정상태에서의 변화를 감지하고 싶다면 파라미터를 추가해주시면 됩니다.

import Network

let monitor = NWPathMonitor(requiredInterfaceType: .wifi)
let monitor = NWPathMonitor(prohibitedInterfaceTypes: [.wifi, .cellular])

InterfaceType의 종류는 아래와 같습니다.

public enum InterfaceType {
	case other		/// A virtual or otherwise unknown interface type
	case wifi		/// A Wi-Fi link
	case cellular		/// A Cellular link
	case wiredEthernet	/// A Wired Ethernet link
	case loopback		/// The Loopback Interface
}

 

모니터링을 시작하기 위해선 

monitor.start(queue: DispatchQueue.global())

를 시작해주면 그때부터, 인터넷 변경사항에 대한 체크를 시작합니다.

 

변화된 인터넷 상태를 알고 싶다면

monitor.pathUpdateHandler = { path in
      
}

를 추가하여, 변경 사항에 대한 알림을 받을 수 있습니다.

 

더이상 모니터링을 하고 싶지 않은 경우에는

monitor.cancel()

을 호출해줍니다.

 

전체 구현방식은 아래와 같습니다.

let monitor = NWPathMonitor()

func startMonitoring() {
    monitor.start(queue: DispatchQueue.global())
    monitor.pathUpdateHandler = { [weak self] path in
        if path.status == .satisfied {
            print("connected")
            if path.usesInterfaceType(.wifi) {
            	print("wifi mode")
            } else if path.usesInterfaceType(.cellular) {
            	print("cellular mode")
            } else if path.usesInterfaceType(.wiredEthernet) {
            	print("ethernet mode")
            }
        } else {
            print("not connected")
        }
    }
}
        
func stopMonitoring() {
    monitor.cancel()
}

 

 

반응형