[swift] Reachability를 사용해 서버와의 통신 가능 여부 확인하기

앱을 개발할 때 서버와의 통신이 필요한 경우가 많습니다. 하지만 사용자의 인터넷 연결이 불안정하거나 서버의 문제로 인해 통신이 실패할 수 있습니다. 이러한 상황에서 효율적으로 서버와의 통신 가능 여부를 확인하기 위해 Reachability라는 도구를 사용할 수 있습니다.

Reachability란?

Reachability는 네트워크 연결 상태를 감지하고 알려주는 도우미 클래스입니다. iOS에서는 Reachability 클래스를 사용하여 현재 네트워크 연결 상태를 확인할 수 있습니다. Reachability는 Objective-C로 작성되어 있으며 Swift에서도 사용할 수 있도록 래핑된 라이브러리가 제공됩니다.

Reachability 라이브러리 가져오기

Reachability를 사용하기 위해서는 먼저 Reachability 클래스의 라이브러리를 가져와야 합니다. Cocoapods를 사용하거나 수동으로 라이브러리를 추가할 수 있습니다. Cocoapods를 사용한다면 Podfile에 다음과 같이 추가합니다:

pod 'ReachabilitySwift'

라이브러리를 수동으로 추가한다면, ReachabilitySwift GitHub 저장소에서 최신 버전을 다운로드하고 프로젝트에 추가합니다.

Reachability 클래스 사용하기

Reachability 클래스를 사용하려면 다음과 같은 단계를 따르세요:

  1. Reachability 클래스를 import합니다:
import Reachability
  1. Reachability 인스턴스를 생성합니다:
let reachability = try! Reachability()
  1. 네트워크 연결 상태 변경을 감지하기 위한 옵저버를 등록합니다:
NotificationCenter.default.addObserver(self, selector: #selector(reachabilityChanged(note:)), name: .reachabilityChanged, object: reachability)
  1. Reachability를 시작합니다:
do {
    try reachability.startNotifier()
} catch {
    print("Could not start reachability notifier")
}
  1. 네트워크 연결 상태 변경 이벤트를 처리하기 위한 메소드를 추가합니다:
@objc func reachabilityChanged(note: Notification) {
    let reachability = note.object as! Reachability
    
    if reachability.connection != .unavailable {
        // 서버와의 통신 가능
        print("Server reachable")
    } else {
        // 서버와의 통신 불가능
        print("Server unreachable")
    }
}

Reachability 사용 예시

위에서 작성한 Reachability 클래스를 사용하여 서버와의 통신 가능 여부를 확인하는 예시를 보겠습니다:

import Reachability

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

    override func viewDidLoad() {
        super.viewDidLoad()
        
        NotificationCenter.default.addObserver(self, selector: #selector(reachabilityChanged(note:)), name: .reachabilityChanged, object: reachability)
        
        do {
            try reachability.startNotifier()
        } catch {
            print("Could not start reachability notifier")
        }
    }
    
    @objc func reachabilityChanged(note: Notification) {
        let reachability = note.object as! Reachability
        
        if reachability.connection != .unavailable {
            // 서버와의 통신 가능
            print("Server reachable")
        } else {
            // 서버와의 통신 불가능
            print("Server unreachable")
        }
    }

}

위의 예시 코드는 앱이 시작될 때 Reachability를 시작하고, 네트워크 연결 상태가 변경될 때마다 reachabilityChanged 메소드가 호출되어 서버와의 통신 가능 여부를 확인합니다.

참고 자료