반응형
1. Apple Watch -> iPhone으로 데이터 전송 시
1-1. Apple Watch 구현
WCSession은 init 함수에서 할 필요는 없으나, WCSessionDelegate 함수들은 구현해줘야 한다.
임의의 sendMessageToiPhone 함수를 통해서 WCSession을 통해 활성화되고 Reachable이 된다면 데이터를 전송한다.
전송하는 데이터 형태는 Dictionary형태로 전송 가능하다.
import WatchConnectivity
class WatchSessionManager: NSObject, WCSessionDelegate {
override init() {
super.init()
if WCSession.isSupported() {
WCSession.default.delegate = self
WCSession.default.activate()
}
}
// delegate: 세션 활성화 여부 확인
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
if let error = error {
print("Watch session activation failed: \(error.localizedDescription)")
} else {
print("Watch session activated with state: \(activationState.rawValue)")
}
}
// delegate: iPhone과의 연결 상태가 변경될 때 호출
func sessionReachabilityDidChange(_ session: WCSession) {
if session.isReachable {
print("Watch session is reachable")
} else {
print("Watch session is not reachable")
}
}
// iPhone으로 메시지 전송하는 함수
func sendMessageToiPhone(message: [String: Any]) {
if WCSession.default.activationState == .activated && WCSession.default.isReachable {
WCSession.default.sendMessage(message, replyHandler: { response in
print("Received reply from iPhone: \(response)")
}, errorHandler: { error in
print("Error sending message: \(error.localizedDescription)")
})
} else {
print("WCSession is not activated or iPhone is not reachable.")
}
}
}
2. iPhone 구현
마찬가지로, WCSession은 init 함수에서 할 필요는 없으나, WCSessionDelegate 함수들은 구현해줘야 한다.
Watch에서 전송하는 데이터는 WCSessionDelegate에 정의된 didReceiveMessage delegate함수를 통해 전달 받는다.
import WatchConnectivity
class iPhoneSessionManager: NSObject, WCSessionDelegate {
override init() {
super.init()
if WCSession.isSupported() {
WCSession.default.delegate = self
WCSession.default.activate()
}
}
// delegate: 세션이 성공적으로 활성화되었는지 확인
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
if let error = error {
print("iPhone session activation failed: \(error.localizedDescription)")
} else {
print("iPhone session activated with state: \(activationState.rawValue)")
}
}
// delegate: 연결이 변경될 때 호출
func sessionReachabilityDidChange(_ session: WCSession) {
if session.isReachable {
print("iPhone session is reachable")
} else {
print("iPhone session is not reachable")
}
}
// delegate: Apple Watch로부터 메시지 수신
func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
print("Received message from Watch: \(message)")
// 답장을 보낼 수 있음
replyHandler(["response": "Message received successfully"])
}
}
반대로 iPhone에서 Apple Watch로 데이터를 전송하려면 Apple Watch에서 didReceiveMessage도 구현하고 iPhone에서 sendMessage를 통해 데이터를 전달하면 된다.
데이터 전송 시 아래와 같은 에러가 발생하면
WCSession _onqueue_notifyOfMessageError:messageID:withErrorHandler:] 0B2139AA-E8FA-4F2D-A368-20D058F45978 errorHandler: NO with WCErrorCodeDeliveryFailed
아래 글을 통해 수정한다.
https://lafortune.tistory.com/60
반응형
'Dev-iOS > iOS' 카테고리의 다른 글
[SwiftUI] MapKit - 기본 (0) | 2024.09.09 |
---|---|
errorHandler: NO with WCErrorCodeDeliveryFailed 발생 시 (1) | 2024.09.05 |
iOS 버전별 점유율 - 2024년 8월 기준 (0) | 2024.08.23 |
Localizable.xcstrings 사용 팁 (Localizable.string에서 전환 시) (27) | 2024.05.23 |
[iOS 앱] ScreenTime API 적용 앱 개발 진행기 (19) | 2023.09.15 |