[swift] Reachability와 네트워크 상태 바로 알리기

iOS 앱을 개발하다보면 네트워크 상태를 실시간으로 확인하고, 변경되는 경우에 사용자에게 알림을 줄 필요가 있습니다. 이때 사용할 수 있는 도구 중 하나가 “Reachability”입니다. Reachability는 iOS에서 현재의 네트워크 연결 상태를 감지하기 위해 사용되는 클래스입니다.

Reachability 클래스

Reachability 클래스는 SystemConfiguration 프레임워크에서 제공되며, 앱이 현재 인터넷에 연결되어 있는지 여부를 확인할 수 있습니다. Reachability 클래스를 사용하여 네트워크 상태를 실시간으로 모니터링하고, 변경되는 경우에 적절한 알림을 사용자에게 전달할 수 있습니다.

Reachability 클래스 사용하기

먼저, Reachability 클래스를 사용하기 위해 SystemConfiguration 프레임워크를 프로젝트에 추가해야 합니다. 프로젝트 타겟을 선택한 다음, Build Phases 탭으로 이동하여 Link Binary With Libraries 섹션에 SystemConfiguration.framework 가 추가되어 있는지 확인합니다.

Reachability 클래스를 사용하기 위해서는 다음과 같은 단계를 따릅니다:

  1. Reachability 파일을 프로젝트에 추가합니다. Swift에서는 Reachability 클래스를 사용하기 위해 공식 GitHub 저장소에서 Reachability.swift 파일을 다운로드 받아 프로젝트에 추가합니다.
  2. Reachability 인스턴스를 생성하여 사용합니다.

Reachability로 네트워크 상태 확인하기

import Reachability

let reachability = try! Reachability()

if reachability.connection != .unavailable {
    // 인터넷에 연결되어 있음
    print("네트워크에 연결되어 있습니다.")
} else {
    // 인터넷에 연결되어 있지 않음
    print("인터넷에 연결되어 있지 않습니다.")
}

위의 코드에서 try! Reachability()를 사용하여 Reachability 인스턴스를 생성합니다. 이후 reachability.connection 속성을 통해 현재의 네트워크 연결 상태를 확인할 수 있습니다. Reachability.Connection 열거형을 통해 가능한 연결 상태는 다음과 같습니다:

Reachability 변경 감지하기

Reachability 클래스는 네트워크 상태가 변경될 때 delegate 패턴을 사용하여 이를 감지할 수 있도록 지원합니다. 이를 통해 네트워크 상태가 변경되면 적절한 알림을 사용자에게 전달할 수 있습니다.

import Reachability

class MyViewController: UIViewController {
    let reachability = try! Reachability()

    override func viewDidLoad() {
        super.viewDidLoad()

        reachability.whenReachable = { reachability in
            if reachability.connection == .wifi {
                // Wi-Fi에 연결되어 있음
                print("Wi-Fi에 연결되었습니다.")
            } else {
                // 셀룰러 네트워크에 연결되어 있음
                print("셀룰러 네트워크에 연결되었습니다.")
            }
        }

        reachability.whenUnreachable = { _ in
            // 인터넷에 연결되어 있지 않음
            print("인터넷에 연결되어 있지 않습니다.")
        }

        do {
            try reachability.startNotifier()
        } catch {
            print("Reachability 알림을 시작하지 못했습니다.")
        }
    }

    deinit {
        reachability.stopNotifier()
    }
}

위의 코드에서는 Reachability 인스턴스를 일반적인 방법으로 생성한 후, whenReachablewhenUnreachable 클로저를 사용하여 네트워크 상태 변경을 감지할 수 있습니다. 위의 예제에서는 whenReachable 클로저 내부에서 현재의 연결 상태에 따라 적절한 알림을 사용자에게 전달하고, whenUnreachable 클로저 내부에서는 인터넷에 연결되어 있지 않음을 알림으로 출력하도록 하였습니다.

또한, viewDidLoad 메서드에서 Reachability의 알림을 시작하고, deinit 메서드에서 알림을 중지시키도록 하였습니다. 이는 Reachability 인스턴스의 수명 주기에 맞게 알림을 시작하고 중지하는 것이 중요합니다.

결론

Reachability 클래스를 사용하면 iOS 앱에서 현재의 네트워크 상태를 감지하고, 변경되는 경우에 알림을 적절하게 사용자에게 전달할 수 있습니다. Reachability를 활용하여 앱의 네트워크 관련 기능을 원활하게 개발할 수 있습니다.