[swift] Reachability를 사용해 네트워크 연결이 불안정한 경우 대응 방법

네트워크 연결이 불안정한 경우, 앱은 사용자 경험을 향상시키기 위해 적절하게 대응해야 합니다. 사용자에게 불편함을 최소화하기 위해서는 네트워크 상태에 따라 적절한 조치를 취하는 것이 중요합니다.

Swift에서는 Reachability를 사용하여 네트워크 상태를 감지하고, 적절한 대응 방법을 적용할 수 있습니다. 이러한 대응 방법은 다음과 같습니다.

1. Reachability 라이브러리 추가하기

먼저, Reachability 라이브러리를 프로젝트에 추가해야 합니다. 이 라이브러리는 CocoaPods를 통해 쉽게 설치할 수 있습니다. Podfile에 다음과 같이 추가한 후, pod install 명령을 실행해주세요.

pod 'ReachabilitySwift'

2. Reachability 객체 생성하기

네트워크 연결 상태를 감지하기 위해 Reachability 객체를 생성해야 합니다. 다음은 Reachability 객체를 생성하는 코드입니다.

import Reachability

let reachability = try! Reachability()

3. 네트워크 상태 변경 감지하기

네트워크 상태가 변경되었을 때 알림을 받기 위해 Reachability 객체에 옵저버를 등록해야 합니다. 대부분의 경우, 앱이 AppDelegate 클래스를 가지고 있으므로, 이곳에서 옵저버를 등록하는 것이 좋습니다. 다음은 AppDelegate 클래스 내부에 옵저버를 등록하는 코드입니다.

import Reachability

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Reachability 객체 생성하기
    let reachability = try! Reachability()
  
    // 네트워크 상태 변경 감지하기
    reachability.whenReachable = { reachability in
        print("네트워크가 연결되었습니다.")
    }
  
    reachability.whenUnreachable = { reachability in
        print("네트워크가 연결되지 않았습니다.")
    }
  
    // Reachability 객체 시작하기
    try! reachability.startNotifier()
  
    return true
}

위 코드에서 whenReachable 클로저는 네트워크가 연결되었을 때 실행되고, whenUnreachable 클로저는 네트워크가 연결되지 않았을 때 실행됩니다. 이곳에 네트워크 상태에 맞는 알림 및 처리 로직을 구현하면 됩니다.

4. Reachability 객체 제거하기

앱이 종료되거나 더 이상 네트워크 상태를 감지할 필요가 없을 때, Reachability 객체를 제거하고 옵저버를 해제해야 합니다. 다음은 AppDelegate 클래스 내부의 UIApplicationWillTerminate 이벤트 핸들러에서 Reachability 객체를 제거하는 코드입니다.

import Reachability

func applicationWillTerminate(_ application: UIApplication) {
    let reachability = Reachability()!
    reachability.stopNotifier()
    NotificationCenter.default.removeObserver(self, name: .reachabilityChanged, object: reachability)
}

5. 참고 자료