
👩💻 새롭게 공부하며 작성한 글이기 때문에 틀린 정보가 있을 수 있습니다! 이에 대한 피드백은 언제나 환영입니다 🙌
Network Reachability ?
: 사용자의 기기의 네트워크의 상태이다.
SCNetworkReachability
∙ SCNetworkReachability는 어플리케이션이 시스템의 현재 네트워크 상태와 타켓 호스트에 접근 가능성(reachability)을 결정하게 해준다.
∙ 원격 호스트는 언제 기기에 접근가능reachable하다고 여겨질까?
👉 어플리케이션으로부터 네트워크 스택에 전달되는 data packet이 로컬 디바이스를 떠날 수 있을 때 reachable하다고 여긴다.
간단하게 말하면, 이미 우리가 추상적으로 알고 있듯이 데이터가 기기에서 서버로 전달될 수 있을 때 reachable하다고 생각하면 되겠다.
but Reachability는 데이터파켓이 서버에 확실하게 전달된다는 것을 보장하지는 않는다고 한다.
🙋 그렇다면 이런 데이터 상태를 어떻게 알 수 있을까?
SCNetworkReachability는 synchronous와 asynchronous 모델을 지원한다.
SCNetworkReachabilityGetFlags(_:_:)복잡..
중요한 것은! iOS12부터는 Network.framework의 NWPathMonitor 클래스를 사용해서 네트워크 연결을 감지할 수 있다@@는 것.
WWDC18 iOS12 이상의 변경감지
Network.framework → NWPathMoniotr 클래스 이용
NWPathMonitor은 특정/모든 네트워크 인터페이스를 감지
👉 pathUpdateHandler를 통해서 변화를 알려준다.
//viewDidLoad()에서 네트워크가 끊겼을 때 바로 얼럿을 띄워주는 기능을 구현해보자

import Network
let networkMonitor = NWPathMonitor()
let specificNetworkMonitor = NWPathMonitor(requiredInterfaceType: .wifi)
let prohibitNetworkMonitor = NWPathMonitor(prohibitedInterfaceTypes: [.wifi, .cellular])
NWInterface.InterfaceType의 종류
:.cellular .wifi .loopback .wiredEthernet .other

networkMonitor.pathUpdateHandler: NWPath(상태) 반환satisfied: 연결됨.networkMonitor.pathUpdateHandler = { path in
if path.status == .satisfied {
print("connected")
if path.usesInterfaceType(.cellular) {
print("셀룰러")
} else if path.usesInterfaceType(.wifi) {
print("와이파이")
} else if path.usesInterfaceType(.wiredEthernet) {
print("유선연결")
} else {
print("기타")
}
} else {
print("끊김")
}
}
self.networkMonitor.start(queue: DispatchQueue.global())
연결 상태가 변화될 때마다 상태 변화가 반환된다.전체코드
import UIKit
import Network
final class NetworkMonitor: UIViewController {
let networkMonitor = NWPathMonitor()
let wifiMonitor = NWPathMonitor(requiredInterfaceType: .wifi)
override func viewDidLoad() {
super.viewDidLoad()
networkStatus()
}
func networkStatus() {
networkMonitor.pathUpdateHandler = { path in
if path.status == .satisfied {
print("connected")
if path.usesInterfaceType(.cellular) {
print("셀룰러")
} else if path.usesInterfaceType(.wifi) {
print("와이파이")
} else if path.usesInterfaceType(.wiredEthernet) {
print("유선연결")
} else {
print("기타")
}
} else {
print("끊김")
}
}
self.networkMonitor.start(queue: DispatchQueue.global())
}
}
🔖 참고