[swift] Reachability를 사용해 네트워크 연결이 불가능한지 확인하기

앱 개발 중 네트워크 기능을 구현할 때, 사용자의 디바이스가 현재 네트워크에 연결되어 있는지를 확인해야 할 때가 있습니다. 이때 Reachability 클래스를 사용하면 간단하게 네트워크 상태를 확인할 수 있습니다.

Reachability란?

Reachability는 Apple이 제공하는 클래스로, 현재의 네트워크 상태를 감지할 수 있도록 해줍니다. 네트워크가 연결되어 있는지 여부를 확인할 수 있고, 연결 종류를 판별할 수도 있습니다. 예를 들어 Wi-Fi, 셀룰러 데이터, VPN 등의 연결 유형을 확인할 수 있습니다.

Reachability 사용하기

Reachability 클래스를 사용하기 위해서는 ‘SystemConfiguration’ 프레임워크를 프로젝트에 추가해야 합니다. Xcode에서 프로젝트 네비게이터에서 프로젝트 파일을 선택한 후, ‘Build Phases’ 탭에서 ‘Link Binary With Libraries’ 섹션을 찾아 ‘+ 버튼’을 클릭하고 ‘SystemConfiguration.framework’를 추가해줍니다.

Reachability 클래스를 사용하는 방법은 다음과 같습니다.

import SystemConfiguration

class NetworkUtils {
    
    class func isNetworkAvailable() -> Bool {
        var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
        
        zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
        zeroAddress.sin_family = sa_family_t(AF_INET)
        
        let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
            $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { zeroSockAddress in
                SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
            }
        }
        
        var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0)
        if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false {
            return false
        }
        
        let isReachable = ((flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0)
        let needsConnection = ((flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0)
        return (isReachable && !needsConnection)
    }
}

위의 코드는 네트워크 연결 가능 여부를 확인하는 isNetworkAvailable() 메서드를 구현한 예시입니다. 이 메서드를 호출하면 현재 네트워크 상태에 따라 true 또는 false 값을 반환합니다.

사용 예시:

if NetworkUtils.isNetworkAvailable() {
    print("네트워크 연결 가능")
} else {
    print("네트워크 연결 불가능")
}

위의 예시 코드에서는 isNetworkAvailable() 메서드를 호출하여 현재 네트워크 연결 가능 여부를 확인하고, 그에 따라 메시지를 출력하는 간단한 예시입니다.

참고자료