WCSession
Getting the Default Session ( 기본 세션 가져오기 )
class func isSupported() -> Bool
현재 iOS 기기가 세션을 사용할 수 있는지 여부를 Bool로 반환
class var `default`: WCSession { get }
현재 기기에 대한 싱글톤 세션 개체를 반환함
이 메소드를 호출 전에 isSupported() 메서드를 호출하여 통신할 수 있는지 확인필요
Configuring the Session ( 세션 구성 )
weak var delegate: WCSessionDelegate? { get set }
activate() 메소드를 호출전에 WCSessionDelegate프로토콜을 준수하는 개체를 할당해야 함.
func activate()
이 메소드는 비동기적으로 실행되고 완료 시 delegate의
session(_:activationDidCompleteWith:error:) 를 호출함.
이 메소드는 상대방과 통신할 준비가 되면 호출 됨. 메소드 호출 안될시 메시지 전송 불가능함
var activationState: WCSessionActivationState { get }
이 속성값을 이용하면 WCSessionActivationState.activated 를 알 수 있음
sessionDidBecomeInactive(_:) 와 sessionDidDeactivate(_:) delegate 메소드로 상태를 모니터링 할 수 있음.
Determining the Sesstion's Reachability ( 세션에 연결 확인 )
var isReachable: Bool { get }
워치와 iOS 간 실시간으로 메시징을 할 수 있는지 Bool로 반환
WCSessionActivationState
enum WCSessionActivationState : Int, @unchecked Sendable
case notActivated = 0 // 워치와 iOS 통신 불가
case inactive = 1 // 활성 상태에서 비활성 상태로 전환, 데이터 수신 가능하지만 송신은 불가
case activated = 2 // 통신 활성화
Managing Background Updates ( 백그라운드 업데이트 관리 )
func updateApplicationContext(_ applicationContext: [String : Any]) throws
앱을 실행시켰을 때 최신 데이터를 사용할 수 있도록 백그라운드에서 데이터를 전송해줌
delegate의 session(_:didReceiveApplicationContext:) 이용
var receivedApplicationContext: [String : Any] { get }
받은 데이터에 접근함
delegate의 session(_:didReceiveApplicationContext:) 이용
Sending Messages ( 메시지, 데이터 보내기 )
func sendMessage(
_ message: [String : Any],
replyHandler: (([String : Any]) -> Void)?,
errorHandler: ((Error) -> Void)? = nil
)
message :
딕셔너리로 메시지를 보냄 Key에 보내는곳과 받는 곳의 String을 맞추고 Value에 내가 원하는 메시지 입력
replyHandler :
상대에서 수신이 되면 오는 메시지 nil 설정 가능
errorHandler :
수신 실패시 에러 처리
func sendMessageData(
_ data: Data,
replyHandler: ((Data) -> Void)?,
errorHandler: ((Error) -> Void)? = nil
)
메시지와 보내는 것은 동일. 하지만 Data를 보냄
Transferring Data or File in the background ( 백그라운드에서 메시지, 파일 보내기 )
func transferUserInfo(_ userInfo: [String : Any] = [:]) -> WCSessionUserInfoTransfer
백그라운드에서 메시지 전송
func transferFile(
_ file: URL,
metadata: [String : Any]?
) -> WCSessionFileTransfer
백그라운드에서 파일 전송
file : 식별 가능한 URL
metadata : 메시지 전송, nil 가능
WCSessionDelegate
Managing Session Activation ( 세션 활성화 관리 )
func session(
_ session: WCSession,
activationDidCompleteWith activationState: WCSessionActivationState,
error: Error?
)
세션이 actived 활성화할 경우 실행
func sessionDidBecomeInactive(_ session: WCSession)
세션이 정지상태로 돌입할 때 (통신을 중지 한다고 알림 )
func sessionDidDeactivate(_ session: WCSession)
세션이 모든 데이터를 전송했고, 통신이 종료되었음을 알림
Managing State Changes ( 상태 변경 관리 )
optional func sessionWatchStateDidChange(_ session: WCSession)
watch 와 iOS의 연결 상태 등 바뀌게 되면 호출
optional func sessionReachabilityDidChange(_ session: WCSession)
실시간 메시징이 가능한지에 대한 상태가 변경되면 호출
optional func sessionCompanionAppInstalledDidChange(_ session: WCSession)
지원 앱의 설치 상태가 변경되면 호출 (앱을 설치하거나 제거할 때, 독립접인 Watch 앱 에서만 유효)
Receiving Context Data ( 데이터 수신 )
optional func session(
_ session: WCSession,
didReceiveApplicationContext applicationContext: [String : Any]
)
데이터가 수신되면 딕셔너리의 Key에 맞는 Any값이 수신 됨
Receiving Immediate Messages ( 메시지 수신 )
optional func session(
_ session: WCSession,
didReceiveMessage message: [String : Any],
replyHandler: @escaping ([String : Any]) -> Void
)
session : 메시지를 받을 개체
message : 딕셔너리를 통해 메시지를 수신
replyHandler : 메시지 수신시 실행
Managing Data Dictionary Transfers ( 데이터 딕셔너리 변경 관리 )
optional func session(
_ session: WCSession,
didReceiveUserInfo userInfo: [String : Any] = [:]
)
성공적으로 값을 수신 시, 호출
optional func session(
_ session: WCSession,
didFinish userInfoTransfer: WCSessionUserInfoTransfer,
error: Error?
)
데이터를 송신 실패 혹은 성공시 호출
실제 코드
iOS의 ViewController에
WatchConnectivity 를 import 하고 델리게이트를 설정
그 후 실제 메시지를 보낼 수 있는 메소드와, 메시지를 받을 수 있는 델리게이트 설정
워치에서도 똑같이
WatchConnectivity 를 import 하고 델리게이트를 설정
메시지를 보낼 수 있는 메소드와, 받는 델리게이트를 설정해줌
결과
참고자료
https://developer.apple.com/documentation/watchconnectivity
Apple Developer Documentation
developer.apple.com
'iOS' 카테고리의 다른 글
AVCapture Session (0) | 2022.10.17 |
---|---|
iOS ARKit LiDAR 에 대해 (0) | 2022.09.27 |
Pencil Kit (iPadOS) - 기초편 (0) | 2022.09.21 |
View Life Cycle (0) | 2022.09.06 |
DispatchQueue, sync 와 async (0) | 2022.06.10 |