투케이2K

624. (ios/swift5) [유틸 파일] isPingInternetAvailable : URLSession 사용해 Ping 핑 체크 수행 실시 본문

IOS

624. (ios/swift5) [유틸 파일] isPingInternetAvailable : URLSession 사용해 Ping 핑 체크 수행 실시

투케이2K 2025. 1. 12. 10:29

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : SWIFT5

 

[소스 코드]

 

// --------------------------------------------------------------------------------------
[개발 및 테스트 환경]
// --------------------------------------------------------------------------------------

- 언어 : Swift5

- 개발 툴 : Xcode

- 기술 구분 : 유틸 파일 / URLSession / Http / Ping

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[소스 코드]
// --------------------------------------------------------------------------------------

var checkPingFlag = false
func isPingInternetAvailable() -> Bool {
    
    /*
    // -----------------------------------------
    // [isPingInternetAvailable 메소드 설명]
    // -----------------------------------------
    1. 필요 import : 
      
      import Foundation
      import UIKit
    // -----------------------------------------
    2. 호출 방법 : 
      
      DispatchQueue.main.async { // [비동기 요청]
      
        if C_StateCheck().isPingInternetAvailable() == true {} else {}
      
      }
      
    // -----------------------------------------
    */
    
    
    // [변수 값 초기화 설정]
    self.checkPingFlag = false
    
    
    // [세마포어 선언 : 프로그램 로직을 동기화 구현 : value 0 값은 대기 상태 선언]
    let semaphore = DispatchSemaphore(value: 0)
    
    
    // [Http 요청 Request 지정]
    let urlData = "https://www.google.com"
    let urlComponents = URLComponents(string: urlData)
    
    var requestURL = URLRequest(url: (urlComponents?.url)!)
    requestURL.httpMethod = "GET"
    requestURL.addValue("application/x-www-form-urlencoded; charset=utf-8;", forHTTPHeaderField: "Content-Type")
    requestURL.addValue("no-cache", forHTTPHeaderField: "Cache-Control")
    
    
    // [http 요쳥을 위한 URLSessionDataTask 생성]
    let sessionConfig = URLSessionConfiguration.default
    sessionConfig.timeoutIntervalForRequest = 5.0 // [커넥션 타임 아웃 설정]
    sessionConfig.timeoutIntervalForResource = 5.0 // [리소스 읽기 , 쓰기]
    
    
    // [Http 요청 수행]
    S_Log._D_(description: "GET 방식 PING 핑 [요청] 수행", data: ["URL :: " + String(describing: urlData)])
    let session = URLSession(configuration: sessionConfig)
    let dataTask = session.dataTask(with: requestURL, completionHandler: { (data, response, error) in
        
        S_FileManager.appHttpLogSave(description: nil, request: nil, data: data, response: response as? HTTPURLResponse, error: error)
        
        // [error가 존재하면 종료]
        if error != nil {
            S_Log._E_(description: "GET 방식 PING 핑 [결과] 실패", data: [
                "URL :: " + String(describing: urlData),
                "ERROR :: \(error?.localizedDescription ?? "")"
            ])
            
            // [세마 포어 종료]
            semaphore.signal()
        }
        else {
            
            // [응답 코드 확인]
            let responseCode = (response as? HTTPURLResponse)?.statusCode
            
            S_Log._W_(description: "GET 방식 PING 핑 [결과] 성공", data: [
                "URL :: " + String(describing: urlData),
                "RESPONSE_CODE :: \(String(describing: responseCode))"
            ])
            
            // [리턴 변수 값 변경]
            self.checkPingFlag = true
            
            // [세마 포어 종료]
            semaphore.signal()
        }
        
    })

    
    // [network 통신 실행]
    dataTask.resume()
    
    
    // [세마포어 확인 대기]
    semaphore.wait()
    
    
    // [로그 출력]
    S_Log._D_(description: "Ping 핑 체크 방식을 통해 네트워크 사용 가능 상태 확인", data: [
        "RETURN :: \(self.checkPingFlag)"
    ])

    
    // [결과 리턴 수행 실시]
    return self.getMobileLockFlag
    
}

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[결과 출력]
// --------------------------------------------------------------------------------------

================================================================
LOG :: TYPE :: LOG :: 🟢
-------------------------------------------------
LOG :: CLASS PLACE :: C_StateCheck.swift :: isPingInternetAvailable() :: 1062
-------------------------------------------------
LOG :: NOW TIME :: 2025-01-12 10:20:08
-------------------------------------------------
LOG :: DESCRIPTION :: GET 방식 PING 핑 [요청] 수행
-------------------------------------------------
LOG :: URL :: https://www.google.com
================================================================




================================================================
LOG :: TYPE :: IMPORT :: 🟠
-------------------------------------------------
LOG :: CLASS PLACE :: C_StateCheck.swift :: isPingInternetAvailable() :: 1083
-------------------------------------------------
LOG :: NOW TIME :: 2025-01-12 10:20:08
-------------------------------------------------
LOG :: DESCRIPTION :: GET 방식 PING 핑 [결과] 성공
-------------------------------------------------
LOG :: URL :: https://www.google.com
-------------------------------------------------
LOG :: RESPONSE_CODE :: Optional(200)
================================================================




================================================================
LOG :: TYPE :: LOG :: 🟢
-------------------------------------------------
LOG :: CLASS PLACE :: C_StateCheck.swift :: isPingInternetAvailable() :: 1107
-------------------------------------------------
LOG :: NOW TIME :: 2025-01-12 10:20:08
-------------------------------------------------
LOG :: DESCRIPTION :: Ping 핑 체크 방식을 통해 네트워크 사용 가능 상태 확인
-------------------------------------------------
LOG :: RETURN :: true
================================================================

// --------------------------------------------------------------------------------------

 

반응형
Comments