아이폰 개발/Swift

swift network conection 체크 - 인터넷 연결 체크

인생여희 2021. 10. 6. 23:50

swift network conection 체크 - 인터넷 연결 체크 

 

ios 에서는 NWNetworkMonitor 라이브러리를 이용해서 지금 폰이 인터넷에 연결이 되어 있는지 안되어 있는지 체크를 할수 있다. 그리고 와이파이에 연결이 되어 있는지, lte에 연결이 되어 있는지 등을 알수 있다. 그리고 네트워크가 끊겼을때도 백그라운드에서 계속 감지하고 있다가 실시간으로 알려준다.

 

싱글톤 클래스로 네트워크 연결하는 클래스를 만든다.

import Foundation
import Network

final class NetworkMonitor{
    static let shared = NetworkMonitor()
    
    private let queue = DispatchQueue.global()
    private let monitor: NWPathMonitor
    public private(set) var isConnected:Bool = false
    public private(set) var connectionType:ConnectionType = .unknown
    
    /// 연결타입
    enum ConnectionType {
        case wifi
        case cellular
        case ethernet
        case unknown
    }
    
    private init(){
        print("init 호출")
        monitor = NWPathMonitor()
    }
    
    public func startMonitoring(){
        print("startMonitoring 호출")
        monitor.start(queue: queue)
        monitor.pathUpdateHandler = { [weak self] path in
            print("path :\(path)")

            self?.isConnected = path.status == .satisfied
            self?.getConenctionType(path)
            
            if self?.isConnected == true{
                print("연결이된 상태임!")
            }else{
                print("연결 안된 상태임!")

            }
        }
    }
    
    public func stopMonitoring(){
        print("stopMonitoring 호출")
        monitor.cancel()
    }
    
    
    private func getConenctionType(_ path:NWPath) {
        print("getConenctionType 호출")
        if path.usesInterfaceType(.wifi){
            connectionType = .wifi
            print("wifi에 연결")

        }else if path.usesInterfaceType(.cellular) {
            connectionType = .cellular
            print("cellular에 연결")

        }else if path.usesInterfaceType(.wiredEthernet) {
            connectionType = .ethernet
            print("wiredEthernet에 연결")

        }else {
            connectionType = .unknown
            print("unknown ..")
        }
    }
}

 

그 다음 앱델리게이트에서 앱이 구동될때 실행되는 함수에서 위에서 작성한 싱글톤 클래스를 호출해준다.

 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        NetworkMonitor.shared.startMonitoring()
        return true
    }

 

네트워크 변화 상태는 실시간으로 monitor.pathUpdateHandler = { path in... 클로저에서 확인할 수 있다. 
네트워크가 변하면 이부분이 호출이되고 path 변수에 현재 네트워크 정보가 들어있다.

그리고 아래처럼 뷰컨트롤러가 로드되었을때에 네트워크를 체크해 볼 수도 있다.

 

    override func viewDidLoad() {
        super.viewDidLoad()
        
        if NetworkMonitor.shared.isConnected {
            print("연결됨...")
        }else{
            print("연결안됨...ㅜ")
        }
    }