[iOS | Swift] Network 연결 확인하기

Minji Kim·2022년 2월 9일
0

iOS | Swift

목록 보기
10/13
post-thumbnail
post-custom-banner

NetWork 프레임워크를 사용해서 현재 기기의 인터넷 연결 상태와 연결 타입을 알 수 있다. 네트워크 연결을 계속 감지하여 연결이 끊기면 실시간으로 알려준다.

1. NetworkMonitor 클래스 만들기

Network 프레임워크를 import하고 네트워크 연결을 감지하는 클래스를 별도로 만든다. NWPathMonitor로 현재 네트워크 연결 상태를 확인할 수 있다

// file: NetworkCheck.swift
import Foundation
import Network

final class NetworkCheck {
    static let shared = NetworkCheck()
    private let queue = DispatchQueue.global()
    private let monitor: NWPathMonitor
    public private(set) var isConnected: Bool = false
    public private(set) var connectionType: ConnectionType = .unknown

    // 연결타입
    enum ConnectionType {
        case wifi
        case cellular
        case ethernet
        case unknown
    }

    // monotior 초기화
    private init() {
        monitor = NWPathMonitor()
    }

    // Network Monitoring 시작
    public func startMonitoring() {
        monitor.start(queue: queue)
        monitor.pathUpdateHandler = { [weak self] path in

            self?.isConnected = path.status == .satisfied
            self?.getConnectionType(path)

            if self?.isConnected == true {
				print("연결됨!")
            } else {
				print("연결안됨!")
                showNetworkVCOnRoot()
            }
        }
    }

    // Network Monitoring 종료
    public func stopMonitoring() {
        monitor.cancel()
    }

    // Network 연결 타입
    private func getConnectionType(_ path: NWPath) {
        if path.usesInterfaceType(.wifi) {
            connectionType = .wifi
        } else if path.usesInterfaceType(.cellular) {
            connectionType = .cellular
        } else if path.usesInterfaceType(.wiredEthernet) {
            connectionType = .ethernet
        } else {
            connectionType = .unknown
        }
    }
}

2. AppDelegate에서 클래스 호출하기

앱이 실행되면 네트워크 연결을 확인하도록 NetworkCheck 클래스의 startMonitoring 메서드를 호출한다.

// file: AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool {
	NetworkCheck.shared.startMonitoring()
	return true
}

[참고] 네트워크 연결 안 될 때

네트워크 연결이 안 되면 showNetwokrVCOnRoot 함수를 호출해서 화면에 Alert 창을 띄우도록 했다.

// file: ShowViewController.swift
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

// NetworkViewController를 RootViewController로 보여주는 메소드
func showNetworkVCOnRoot() {
    DispatchQueue.main.async {
        let networkViewController = storyboard.instantiateViewController(withIdentifier: "NetworkViewController")
        networkViewController.modalPresentationStyle = .fullScreen
        UIApplication.shared.windows.first?.rootViewController?.show(networkViewController, sender: nil)
    }
}
// file: NetworkViewController.swift
class NetworkViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let alertController = UIAlertController(
            title: "네트워크에 접속할 수 없습니다.",
            message: "네트워크 연결 상태를 확인해주세요.",
            preferredStyle: .alert
        )

        let endAction = UIAlertAction(title: "종료", style: .destructive) { _ in
            // 앱 종료
            UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
                exit(0)
            }
        }

        let confirmAction = UIAlertAction(title: "확인", style: .default) { _ in
            // 설정앱 켜주기
            guard let url = URL(string: UIApplication.openSettingsURLString) else { return }
            if UIApplication.shared.canOpenURL(url) {
                UIApplication.shared.open(url)
            }
        }

        alertController.addAction(endAction)
        alertController.addAction(confirmAction)
        self.present(alertController, animated: true, completion: nil)
    }
}

💙 참고한 블로그 💙

https://qteveryday.tistory.com/m/314

profile
iOS Developer
post-custom-banner

0개의 댓글