Computer >> 컴퓨터 >  >> 프로그래밍 >> iOS

iOS Swift에서 외부 호스트 핑(Ping) 상태 확인하는 방법

외부 웹사이트에 본격적인 요청을 보내거나 작업을 처리하기 전에, 해당 사이트가 정상적으로 작동 중인지 먼저 확인해야 하는 경우가 종종 있습니다. 서버가 다운된 상태에서 요청을 보내면 불필요한 오류 처리만 늘어나기 때문입니다.

이 글에서는 iOS 앱에서 외부 웹사이트가 현재 정상적으로 실행 중인지 확인하는 방법을 단계별로 살펴보겠습니다.

프로젝트 생성 및 함수 작성

1단계: Xcode를 열고 New Project → Single View Application을 선택한 뒤, 프로젝트 이름을 "PingMe"로 지정합니다.

2단계: ViewController.swift 파일을 열고 아래와 같이 checkIsConnectedToNetwork() 함수를 추가합니다.

func checkIsConnectedToNetwork() {
    let hostUrl: String = "https://google.com"
    if let url = URL(string: hostUrl) {
        var request = URLRequest(url: url)
        request.httpMethod = "HEAD"
        URLSession(configuration: .default)
        .dataTask(with: request) { (_, response, error) -> Void in
            guard error == nil else {
                print("Error:", error ?? "")
                return
            }
            guard (response as? HTTPURLResponse)?
            .statusCode == 200 else {
                print("The host is down")
                return
            }
            print("The host is up and running")
        }
        .resume()
    }
}

이 함수의 동작 원리는 간단합니다. 먼저 확인하려는 호스트 URL로 URLRequest 객체를 생성하고 HTTP 메서드를 "HEAD"로 설정합니다. HEAD 요청은 응답 본문 없이 헤더 정보만 받아오므로, 호스트 상태를 가볍고 빠르게 확인할 때 적합합니다. 이후 URLSession의 dataTask를 통해 비동기로 요청을 전송하고, 에러 발생 여부와 HTTP 상태 코드(200)를 검사해 호스트의 정상 작동 여부를 판단합니다.

3단계: viewDidLoad 메서드에서 위에서 만든 함수를 호출합니다.

전체 코드

import UIKit
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.checkIsConnectedToNetwork()
    }
    func checkIsConnectedToNetwork() {
        let hostUrl: String = "https://google.com"
        if let url = URL(string: hostUrl) {
            var request = URLRequest(url: url)
            request.httpMethod = "HEAD"
            URLSession(configuration: .default)
            .dataTask(with: request) { (_, response, error) -> Void in
                guard error == nil else {
                    print("Error:", error ?? "")
                    return
                }
                guard (response as? HTTPURLResponse)?
                .statusCode == 200 else {
                    print("The host is down")
                    return
                }
                print("The host is up and running")
            }
            .resume()
        }
    }
}

위 코드를 실행하면 콘솔에 "The host is up and running"(호스트가 정상적으로 실행 중입니다)이라는 메시지가 출력되는 것을 확인할 수 있습니다.

iOS Swift에서 외부 호스트 핑(Ping) 상태 확인하는 방법

응용 및 추가 참고 사항

UI에 버튼을 배치하고 버튼 탭 이벤트 발생 시 요청을 전송하도록 구현할 수도 있으며, 결과를 콘솔 대신 텍스트 필드나 레이블에 표시하도록 확장할 수도 있습니다.

참고로, 기기의 네트워크 연결 상태 자체를 지속적으로 모니터링해야 한다면 iOS 12부터 제공되는 Network 프레임워크의 NWPathMonitor를 사용하는 것이 좋습니다. 반면 특정 호스트가 실제로 응답하는지까지 확인해야 한다면 이 글에서 소개한 HEAD 요청 방식이 더 적합합니다.