NetWork 프레임워크를 사용해서 현재 기기의 인터넷 연결 상태와 연결 타입을 알 수 있다. 네트워크 연결을 계속 감지하여 연결이 끊기면 실시간으로 알려준다.
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
}
}
}
앱이 실행되면 네트워크 연결을 확인하도록 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)
}
}
💙 참고한 블로그 💙