#네트워크 변경 감지

minin·2022년 2월 16일
0

iOS Practices

목록 보기
4/4
post-thumbnail

#네트워크 변경 감지

👩‍💻 새롭게 공부하며 작성한 글이기 때문에 틀린 정보가 있을 수 있습니다! 이에 대한 피드백은 언제나 환영입니다 🙌

Network Reachability ?

: 사용자의 기기의 네트워크의 상태이다.

  • 어플을 사용하다보면, 네트워크에 잘 연결되어 있는지 확인해야 할 때가 있다.
  • 그리고 그것이 Wifi인지, Cellular인지도 알아야 할 때도 있다.
  • ex
    • iOS wifi 환경에서 앱을 다운받을지 등을 설정할 수 있다.
    • 유튜브나 넷플릭스 등의 대용량 데이터를 요청할 경우에 사용자의 네트워크 상태가 Cellular이면, Wifi로 변경할 것인지, 혹은 Cellular을 이용할 것인지 묻는 Alert이 뜨기도 한다.

변경을 감지하는 방법들

1. Reachability

🔗 github docs

SCNetworkReachability

SCNetworkReachability는 어플리케이션이 시스템의 현재 네트워크 상태타켓 호스트에 접근 가능성(reachability)을 결정하게 해준다.

∙ 원격 호스트는 언제 기기에 접근가능reachable하다고 여겨질까?

  • 👉 어플리케이션으로부터 네트워크 스택에 전달되는 data packet이 로컬 디바이스를 떠날 수 있을 때 reachable하다고 여긴다.
    간단하게 말하면, 이미 우리가 추상적으로 알고 있듯이 데이터가 기기에서 서버로 전달될 수 있을 때 reachable하다고 생각하면 되겠다.

  • but Reachability는 데이터파켓이 서버에 확실하게 전달된다는 것을 보장하지는 않는다고 한다.


🙋 그렇다면 이런 데이터 상태를 어떻게 알 수 있을까?

✔︎synchronous & asynchronous model에서 network status 받는 방법

SCNetworkReachability는 synchronous와 asynchronous 모델을 지원한다.

  1. synchronous moel : SCNetworkReachabilityGetFlags(_:_:)
    를 통해서 reachability status를 받을 수 있다.
  2. unsynchronous moel
    클라이언트는 네트워크 환경이 변경되었을 때 알림을 받기 위해서 callback함수를 실행한다.

복잡..
중요한 것은! iOS12부터는 Network.frameworkNWPathMonitor 클래스를 사용해서 네트워크 연결을 감지할 수 있다@@는 것.

2. NWPathMonitor ✔︎

  • docs

  • WWDC18 iOS12 이상의 변경감지

  • Network.frameworkNWPathMoniotr 클래스 이용

  • NWPathMonitor은 특정/모든 네트워크 인터페이스를 감지

  • 👉 pathUpdateHandler를 통해서 변화를 알려준다.

3. NWPathMonitor 구현하기

//viewDidLoad()에서 네트워크가 끊겼을 때 바로 얼럿을 띄워주는 기능을 구현해보자

  1. NWPathMonitor() 생성
  • 파라미터를 주지 않으면 모든 네트워크 환경의 변화를 감지한다.
  • 파라미터를 주면 와이파이나 셀룰러 등 특정 상태의 변화만을 감지하도록 지정하거나, 제외할 수 있다.
import Network
    let networkMonitor = NWPathMonitor()
    let specificNetworkMonitor = NWPathMonitor(requiredInterfaceType: .wifi)
    let prohibitNetworkMonitor = NWPathMonitor(prohibitedInterfaceTypes: [.wifi, .cellular])
  1. NWInterface.InterfaceType의 종류

    :.cellular .wifi .loopback .wiredEthernet .other

  1. 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("끊김")
	}
}
  1. 변화를 감지하기 위해서 시작메서드 호출하기
	self.networkMonitor.start(queue: DispatchQueue.global())
  1. 결과
    연결 상태가 변화될 때마다 상태 변화가 반환된다.

전체코드

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())
    }
}

🔖 참고

profile
🍫 iOS 🍫 Swift

0개의 댓글