투케이2K

17. (TWOK/UTIL) [Ios/Swift] C_StateCheck - 네트워크 연결 상태 본문

투케이2K 유틸파일

17. (TWOK/UTIL) [Ios/Swift] C_StateCheck - 네트워크 연결 상태

투케이2K 2022. 3. 24. 14:46

[설 명]

프로그램 : Ios / Swift

설 명 : 네트워크 연결 상태 확인 클래스

 

[소스 코드]

 

// -----------------------------------------
import Foundation
import UIKit
// -----------------------------------------
//MARK: [네트워크 연결 상태 체크]
import Network
import SystemConfiguration
// -----------------------------------------


class C_StateCheck {
    
    
    // MARK: - [클래스 설명]
    /*
    // -----------------------------------------
    1. 모바일 기능 활성 및 비활성 체크 클래스
    2. 네트워크 연결 상태
    // -----------------------------------------
    */
    
    
    
    
    
    // MARK: - [현재 연결된 네트워크 상태 확인 메소드]
    var checkNetworkFlag = false
    func getWhatOfNetwork() -> Bool {
        
        /*
        // -----------------------------------------
        // [getWhatOfNetwork 메소드 설명]
        // -----------------------------------------
        1. 필요 import : import Network
        // -----------------------------------------
        2. 호출 방법 : if C_StateCheck().getWhatOfNetwork() == true {} else {}
        // -----------------------------------------
        */
        
        if #available(iOS 12, *) {
            // [현재 네트워크 연결 상태 확인 객체 선언]
            let monitor = NWPathMonitor()

            // [세마포어 선언 : 프로그램 로직을 동기화 구현 : value 0 값은 대기 상태 선언]
            let semaphore = DispatchSemaphore(value: 0)

            // [네트워크 연결 상태 확인 부분]
            monitor.pathUpdateHandler = { path in
                if path.status == .satisfied { // [네트워크가 연결된 경우]
                    if path.usesInterfaceType(.wifi) {
                        print("")
                        print("====================================")
                        print("[C_StateCheck >> getWhatOfNetwork() :: 네트워크 연결 상태 확인 [IF]]")
                        print("연결 상태 :: \("와이파이")")
                        print("====================================")
                        print("")
                    }
                    else if path.usesInterfaceType(.cellular) {
                        print("")
                        print("====================================")
                        print("[C_StateCheck >> getWhatOfNetwork() :: 네트워크 연결 상태 확인 [IF]]")
                        print("연결 상태 :: \("모바일")")
                        print("====================================")
                        print("")
                    }

                    // [네트워크 활성 상태 값 저장]
                    self.checkNetworkFlag = true

                    // [세마포어 신호 알림]
                    semaphore.signal()
                }
                else { // [네트워크가 연결되지 않은 경우]
                    print("")
                    print("====================================")
                    print("[C_StateCheck >> getWhatOfNetwork() :: 네트워크 연결 상태 확인 [IF]]")
                    print("연결 상태 :: \("없음")")
                    print("====================================")
                    print("")

                    // [네트워크 활성 상태 값 저장]
                    self.checkNetworkFlag = false

                    // [세마포어 신호 알림]
                    semaphore.signal()
                }
            }
            
            // [네트워크 연결 상태 확인 수행]
            monitor.start(queue: DispatchQueue.global())
            
            // [세마포어 확인 대기]
            semaphore.wait()

            print("")
            print("====================================")
            print("[C_StateCheck >> getWhatOfNetwork() :: 네트워크 연결 상태 확인 [IF]]")
            print("return :: \(self.checkNetworkFlag)")
            print("====================================")
            print("")

            // [결과 리턴 수행 실시]
            return self.checkNetworkFlag
        }
        else {
            // [세마포어 선언 : 프로그램 로직을 동기화 구현 : value 0 값은 대기 상태 선언]
            let semaphore = DispatchSemaphore(value: 0)

            // [ios 12 버전 미만 네트워크 연결 상태 체크]
            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
            }

            // [Working for Cellular and WIFI]
            let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
            let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0

            let ret = (isReachable && !needsConnection)

            // [세마포어 신호 알림]
            semaphore.signal()

            // [세마포어 확인 대기]
            semaphore.wait()

            print("")
            print("====================================")
            print("[C_StateCheck >> getWhatOfNetwork() :: 네트워크 연결 상태 확인 [ELSE]]")
            print("return :: ", ret)
            print("====================================")
            print("")

            // [결과 리턴 수행 실시]
            return ret
        }
    }

    
} // [클래스 종료]

 

반응형
Comments