본문 바로가기
iOS

Watch Connectivity (watchOS)

by 융식 2022. 7. 31.

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