[swift] Reachability를 사용해 인터넷 연결 상태에 따라 앱 동작 변경하기

앱을 개발할 때, 사용자가 인터넷에 연결되어 있는지 여부에 따라 다른 동작을 수행해야 할 때가 있습니다. 이를 위해 Reachability라는 라이브러리를 사용할 수 있습니다. Reachability는 iOS 앱에서 네트워크 연결 상태를 감지하는 데 유용한 도구입니다.

Reachability 라이브러리 설치하기

Reachability 라이브러리를 사용하기 위해서는 먼저 프로젝트에 해당 라이브러리를 추가해야 합니다. CocoaPods를 사용한다면, Podfile 파일에 다음과 같이 추가한 후 pod install 명령어를 실행하세요.

pod 'Reachability'

CocoaPods를 사용하지 않는다면, Reachability 라이브러리를 다운로드하고 직접 프로젝트에 추가하세요.

Reachability 사용하기

Reachability를 사용하기 위해서는 몇 가지 단계를 거쳐야 합니다. 먼저, Reachability 객체를 생성하고 초기화해야 합니다. 다음은 Swift에서 Reachability를 사용하는 예제입니다.

import Foundation
import Reachability

class NetworkManager {
    static let shared = NetworkManager()
    
    private var reachability: Reachability?
    
    private init() {
        reachability = try? Reachability()
        
        NotificationCenter.default.addObserver(self, selector: #selector(reachabilityChanged), name: .reachabilityChanged, object: nil)
        do {
            try reachability?.startNotifier()
        } catch {
            print("Unable to start reachability notifier")
        }
    }
    
    @objc private func reachabilityChanged(notification: Notification) {
        guard let reachability = notification.object as? Reachability else { return }
        
        if reachability.connection != .unavailable {
            print("인터넷에 연결되었습니다.")
            // 여기서 원하는 동작을 수행하세요.
        } else {
            print("인터넷에 연결되지 않았습니다.")
            // 여기서 원하는 동작을 수행하세요.
        }
    }
}

위의 코드에서 NetworkManager는 싱글톤으로 구현되어 있습니다. Reachability 객체를 생성하고, reachabilityChanged(notification:) 메서드에서 인터넷 연결 상태에 따라 동작을 처리합니다.

Reachability를 사용하여 앱 동작 변경하기

이제 Reachability를 사용하여 인터넷 연결 상태에 따라 앱 동작을 변경해보겠습니다. 예를 들어, 인터넷에 연결되었을 때는 데이터를 가져와서 화면에 표시하고, 인터넷에 연결되지 않았을 때는 로컬 캐시를 사용하여 이전 데이터를 표시하는 동작을 구현해보겠습니다.

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        NetworkManager.shared.startListening()
        
        NotificationCenter.default.addObserver(self, selector: #selector(reachabilityChanged), name: .reachabilityChanged, object: nil)
    }
    
    @objc private func reachabilityChanged(notification: Notification) {
        guard let reachability = notification.object as? Reachability else { return }
        
        if reachability.connection != .unavailable {
            fetchDataFromServer()
        } else {
            fetchDataFromCache()
        }
    }
    
    private func fetchDataFromServer() {
        // 서버에서 데이터를 가져와서 화면에 표시하는 로직을 구현하세요.
    }
    
    private func fetchDataFromCache() {
        // 로컬 캐시에서 데이터를 가져와서 화면에 표시하는 로직을 구현하세요.
    }
}

위의 코드에서 ViewController는 인터넷 연결 상태에 따라 데이터를 가져오는 동작을 수행합니다. NetworkManager의 인터넷 연결 상태 변경을 관찰하고, reachabilityChanged(notification:) 메서드를 호출하여 동작을 처리합니다. 인터넷에 연결되었을 때는 fetchDataFromServer() 메서드를 호출하여 서버에서 데이터를 가져오고, 인터넷에 연결되지 않았을 때는 fetchDataFromCache() 메서드를 호출하여 로컬 캐시에서 데이터를 가져옵니다.

이렇게 Reachability를 사용하여 인터넷 연결 상태에 따라 앱의 동작을 변경할 수 있습니다.

참고 자료