> WCSession 객체를 수신하는 메서드를 정의하는 delegate protocol > (iOS 앱과 watchOS 앱 간의 통신과 관련된 이벤트를 처리할 수 있는 메서드를 정의하는) <br> ```swift protocol WCSessionDelegate ``` <br> ## 개요 - Session 객체는 WatchKit extension과 companion iOS 앱 간의 통신에 사용된다. - Session 객체를 구성할 때 반드시 이 프로토콜을 구현한 delegate 객체를 지정해야 한다. - Session은 companion app으로부터 수신되는 데이터를 전달하고 세션 관련 변경사항을 관리하기 위해 해당 delegate 메서드를 호출한다. <br> - 이 프로토콜의 대부분 메서드는 optional 하지만, 비동기 activation을 위한 `session(_:activationDidCompleteWith:error:)` 메서드는 반드시 구현해야 한다. - iOS에서는 여러 개의 애플워치를 지원하기 위해 `sessionDidBecomeInactive(_:)`와  `sessionDidDeactivate(_:)` 메서드를 구현해야 한다. <br> ## 주요 메서드 #### Session Activation 관리하기 ```swift func session( _ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error? ) ``` - **iOS 앱과 watchOS 앱 간의 세션이 활성화 될 때 호출되는 메서드** - 반드시 구현해야 함 - `activationState` 의 값을 확인해서 companion 앱과 **통신이 가능한지 확인**해야 한다. - 상태가 `WCSessionActivationState.activated`일 때 정상적으로 통신할 수 있다. - `WCSessionActivationState.notActivated`: error 발생 - `WCSessionActivationState.inactive` : (iOS에서) 이전 세션에서 전달 대기 중인 데이터가 있는 경우 <br> ```swift func sessionDidBecomeInactive(_ session: WCSession) ``` - 현재 통신중인 애플워치와 통신을 종료하는 메서드 - iOS 앱에서 기기 간의 빠른 전환을 지원하려면 이 메서드를 반드시 구현해야 함 - **사용자가 다른 애플워치로 전환한 것을 감지하면 호출됨** - 세션은 비활성화 과정에서 pending 상태의 데이터를 델리게이트 객체로 전송하고 새로운 데이터 전송을 시작할 수 없도록 막는다. - 마지막 전송이 끝나면 비활성화 상태 on - **다른 애플 워치를 활성화하기 전에 끝내야 하는 작업(e.g. private한 자료 구조 업데이트, 관련 파일 닫기)을 이 메서드에서 수행하면 된다.** <br> ```swift func sessionDidDeactivate(session: WCSession) { // Begin the activation process for the new Apple Watch. WCSession.defaultSession().activateSession() } ``` - delegate에 이전 세션의 모든 데이터를 전달했고 애플워치와 통신이 종료되었음을 알리는 메서드 - 마찬가지로 iOS 앱에서 기기 간의 빠른 전환을 지원하려면 이 메서드를 반드시 구현해야 함 - 이전 세션을 종료할 수 있고, **더이상 전달할 pending 상태의 데이터가 없을 때 호출됨** - 이 메서드가 호출되면 `activate()` 메서드를 다시 호출해서 새 애플워치와 세션을 시작한다. - 이전 세션을 종료하는 것과 관련된 다양한 작업을 이 메서드에서 수행하면 된다. <br> #### 메시지 받기 ```swift optional func session( _ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void ) ``` - 메시지를 수신할 때 호출되는 메서드 - `sendMessage(_:replyHandler:errorHandler:)`에 대한 응답으로 호출됨 - 앱의 백그라운드 스레드에서 호출됨 - `replyHandler` : 응답 보내는데 쓰이는 클로저 - 메시지 데이터를 처리하고 응답을 보내는 작업을 이 메서드에서 수행하면 된다. <br> --- **참고 문서** - https://developer.apple.com/documentation/watchconnectivity/wcsessiondelegate <br> <br> <br> <br>