Dev-iOS/iOS

Apple Watch - iPhone 간 데이터 전송 시

lafortune 2024. 9. 5. 09:50
반응형

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

 

 

반응형