👩💻 새롭게 공부하며 작성한 글이기 때문에 틀린 정보가 있을 수 있습니다! 이에 대한 피드백은 언제나 환영입니다 🙌
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())
}
}
🔖 참고