본문 바로가기
iOS 한번 개발해보자/related to UIKit

[iOS][UIKit]Network 상태 확인하기

by 임간디 2022. 6. 28.

App 실행 시 네트워크 상태를 확인해야할 일이 생겼다.

찾아본 바로는 2가지 방법이 있는 것 같다.

 

1. import Reachability (over iOS8)

Reachability란 네트워크 상태를 체크할 수 있는 외부 라이브러리이다.

cocopod을 통해 의존성 주입하면 import가 가능하다.

허나 필자는 iOS13이상만 지원하는 App을 개발하므로 다음으로 넘어가자.

 

2. import Network (over iOS12)

iOS 12부터는 Apple에서 Network 프레임워크를 지원한다.

Network 프레임워크에 대한 자세한 내용은 https://developer.apple.com/documentation/network

 

Apple Developer Documentation

 

developer.apple.com

(좋은 개발자가 되려면 영어를 잘해야한다. 물론 필자는 잘 못 한다.)

아래는 네트워크 상태를 체크하기 위해 만든 NetworkConnectionCheck.swift 파일이다.

import Foundation
import Network

struct NetworkConnectionCheck {
    let monitor = NWPathMonitor()
    let queue = DispatchQueue(label: "Monitor")
    func startCheckingNetwork(){
        monitor.start(queue: queue)
        
        monitor.pathUpdateHandler = { path in
            if path.status == .satisfied{ //네트워크 상태가 정상일 경우
                NSLog("[NetworkConnectionCheck] : True")
            }else { //네트워크 상태가 비정상일 경우
                NSLog("[NetworkConnectionCheck] : False")
            }
        }
    }
    
    func stopCheckingNetwork(){
        monitor.cancel()
    }
}

 

startCheckingNetwork()가 호출되면,

monitor.start(queue: queue)를 통해 NWPathMonitor로 모니터링할 Dispatch Queue를 세팅해준다.

(start는 처음 한번만 인정되고 후에 호출되면 모두 무시된다고 Network Framework에 주석으로 쓰여있음)

monitor.pathUpdateHandler로 네트워크 상태에 따른 처리방법을 closure로 전달한다.

 

stopCheckingNetwork()가 호출되면,

간단하다. monitor.cancel()로 모니터링을 끝낸다.

 

아래는 호출단 소스이다.

class ViewController: UIViewController {
	let networkCheck = NetworkConnectionCheck()
    
    override func loadView() {
        super.loadView()
        networkCheck.startCheckingNetwork() //네트워크 감시 시작
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        checkNetworkConnection() //네트워크 상태 체크 function
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        networkCheck.stopCheckingNetwork() //네트워크 감시 종료
    }
    
    func checkNetworkConnection(){
    	//네트워크 상태가 불만족(비정상)스러울 때 onError() 호출
        if networkCheck.monitor.currentPath.status == .unsatisfied {
            onError() //에러 팝업을 띄우는 funciton
        }
    }
}

ViewConroller의 loadView()시점에 네트워크 감시를 시작하고

viewDidLoad()시점에 네트워크를 체크했다.

viewDidDisappear 시점에 네트워크 감시를 종료하면서 App이 종료된다.

 

처음 시작할때 네트워크 상태 판별하기 위해 시도해본 소스로 일단은 생각한대로 작동된다.

댓글