[swift] Reachability를 사용해 인터넷 연결 상태에 따른 UI 변경하기

소개

iOS 앱에서는 사용자에게 인터넷 연결 상태에 따라 적절한 UI를 제공해야 합니다. 이를 위해 Reachability 라이브러리를 사용하여 인터넷 연결 상태를 확인하고, 연결 상태에 따라 사용자 인터페이스를 동적으로 변경할 수 있습니다. 이번 블로그 포스트에서는 Swift 언어를 사용하여 Reachability를 이용해 인터넷 연결 상태에 따른 UI 변경하는 방법에 대해 알아보겠습니다.

Reachability 라이브러리

Reachability란?

Reachability는 iOS 앱에서 인터넷 연결 상태를 확인할 수 있는 라이브러리입니다. Apple에서 제공하는 Reachability 예제를 기반으로 구현되었으며, 네트워크 연결 상태의 변화를 감지하고 해당 상태에 따라 알림을 받을 수 있습니다. Reachability는 네트워크 연결 상태를 확인하는데 사용되며, Wi-Fi, 모바일 데이터, VPN 등의 연결 상태를 확인할 수 있습니다.

Reachability 라이브러리 추가하기

Reachability 라이브러리를 추가하기 위해 Cocoapods를 사용할 수 있습니다. Podfile에 아래와 같이 Reachability를 추가합니다.

target 'MyApp' do
  use_frameworks!
  pod 'ReachabilitySwift'
end

그리고 터미널에서 pod install 명령어를 실행하여 라이브러리를 설치합니다. ReachabilitySwift 라이브러리가 프로젝트에 추가되면, 앱에서 Reachability를 사용할 수 있게 됩니다.

Reachability를 사용해 인터넷 연결 상태 확인하기

Reachability 객체 생성하기

Reachability를 사용하기 위해 먼저 Reachability 객체를 생성해야 합니다. 보통 AppDelegate에서 Reachability를 초기화하고 앱 전역에서 사용할 수 있도록 합니다.

import Reachability

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var reachability: Reachability!
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // ...

        // Reachability 객체 생성
        reachability = Reachability()

        // ...
        
        return true
    }

    // ...
}

Reachability 관찰자 등록하기

Reachability를 사용하기 위해 관찰자를 등록해야 합니다. 이 때, 관찰자로 등록된 객체는 Reachability의 상태 변화를 감지하고 적절한 동작을 수행할 수 있습니다. 보통 ViewController에서 Reachability의 상태 변화를 처리합니다.

import Reachability

class ViewController: UIViewController {

    var reachability: Reachability!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // AppDelegate에서 참조한 Reachability 객체 가져오기
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        reachability = appDelegate.reachability

        // Reachability 관찰자 등록
        NotificationCenter.default.addObserver(self, selector: #selector(networkStatusChanged(_:)), name: .reachabilityChanged, object: reachability)

        // ...
    }

    // ...
}

Reachability 상태 변화 처리하기

Reachability 상태 변화 처리를 위해 networkStatusChanged 메서드를 구현합니다. 이 메서드에서는 Reachability의 상태를 확인하고 해당 상태에 따른 UI 변경을 수행합니다.

import Reachability

class ViewController: UIViewController {

    // ...
    
    @objc func networkStatusChanged(_ notification: Notification) {
        let reachability = notification.object as! Reachability

        if reachability.connection == .wifi {
            // Wi-Fi 연결인 경우
            updateUIForConnected()
        } else if reachability.connection == .cellular {
            // 모바일 데이터 연결인 경우
            updateUIForConnected()
        } else if reachability.connection == .none {
            // 인터넷 연결이 없는 경우
            updateUIForDisconnected()
        }
    }

    private func updateUIForConnected() {
        // 인터넷 연결이 있는 경우 UI 변경
        // 예: 네트워크 아이콘 색상 변경
        // ...
    }

    private func updateUIForDisconnected() {
        // 인터넷 연결이 없는 경우 UI 변경
        // 예: 네트워크 아이콘 색상 변경
        // ...
    }
    
    // ...
}

결론

Reachability를 사용하면 iOS 앱에서 인터넷 연결 상태에 따른 UI 변경을 간편하게 구현할 수 있습니다. Reachability를 이용해 앱의 사용자 경험을 향상시키고, 인터넷 연결 상태에 대한 사용자에게 적절한 메시지를 전달할 수 있습니다.

참고 자료