> 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>