[swift] Reachability를 사용해 연결된 네트워크의 속도 체크하기

작은 모바일 앱이든 혹은 대규모의 네트워크 앱이든, 사용자에게 네트워크 연결 상태를 보여주는 것은 매우 중요합니다. 이를 위해 Reachability 라이브러리를 사용하여 네트워크 연결 상태를 감지하고, 연결된 네트워크의 속도를 체크하는 방법을 알아보겠습니다.

Reachability 라이브러리 다운로드

Reachability 라이브러리를 사용하기 위해 먼저 다운로드해야 합니다. 아래의 명령어를 사용하여 Reachability 라이브러리를 프로젝트에 추가합니다.

import Reachability

Reachability 초기화

Reachability 객체를 초기화하고, 네트워크 연결 상태를 감지하기 위해 Reachability 클래스의 인스턴스를 생성합니다.

let reachability = try? Reachability()

네트워크 상태 체크

Reachability 객체를 사용하여 현재 네트워크 상태를 체크할 수 있습니다. 아래의 코드는 네트워크 상태가 변경될 때마다 호출되는 메소드를 정의한 예제입니다.

NotificationCenter.default.addObserver(self, selector: #selector(networkStatusChanged(_:)), name: .reachabilityChanged, object: reachability)

@objc func networkStatusChanged(_ notification: Notification) {
    if reachability.connection == .wifi {
        print("Wi-Fi 연결됨")
    } else if reachability.connection == .cellular {
        print("셀룰러 연결됨")
    } else if reachability.connection == .none {
        print("연결 없음")
    }
}

위의 코드에서 networkStatusChanged(_:) 메소드를 통해 연결된 네트워크 상태를 체크하고, Wi-Fi인지 셀룰러인지 또는 연결이 없는지 출력합니다.

연결된 네트워크의 속도 체크

Reachability 객체를 사용하여 연결된 네트워크의 속도를 체크할 수도 있습니다. 아래의 코드는 네트워크 속도를 체크하는 메소드를 정의한 예제입니다.

func checkNetworkSpeed() {
    if let reachability = try? Reachability() {
        reachability.whenReachable = { reachability in
            if reachability.connection == .wifi {
                print("Wi-Fi 속도 체크 중...")
            } else if reachability.connection == .cellular {
                print("셀룰러 속도 체크 중...")
            }
            
            let url = URL(string: "https://www.example.com")!
            let request = URLRequest(url: url)
            
            let startTime = CFAbsoluteTimeGetCurrent()
            URLSession.shared.dataTask(with: request) { (_, _, error) in
                let endTime = CFAbsoluteTimeGetCurrent()
                let elapsedTime = endTime - startTime
                let speed = Double(request.httpBody?.count ?? 0) / elapsedTime / 1024 / 1024
                
                print("네트워크 속도: \(speed) Mbps")
            }.resume()
        }
        try? reachability.startNotifier()
    }
}

위의 코드에서 checkNetworkSpeed() 메소드를 통해 네트워크 속도를 체크합니다. 먼저 Reachability 객체를 생성하고, 연결된 네트워크 상태에 따라 적절한 메세지를 출력합니다. 그 후, 특정 URL에 대한 HTTP 요청을 보내고, 요청에 걸린 시간을 측정하여 속도를 계산합니다.

위의 예제 코드를 참고하여 원하는 방식으로 네트워크 연결 상태와 속도 체크를 구현할 수 있습니다.


참고 자료