[iOS] WatchKit[2] - Watch Connectivity, 앱이랑 데이터 주고받기

ungchun·2022년 8월 2일
0

WatchKit

목록 보기
2/5
post-thumbnail

Watch Connectivity ?

iOS 앱이랑 watch 앱이랑 데이터를 주고받으려면 widget 처럼 UserDefaults 데이터를 가지고 쉽게 공유할 수 없습니다.


사진으로 보면 알 수 있듯, iOS App의 Data Store 부분과 Watch App의 Data Store 부분이 완전 분리돼있기 때문이죠. 그래서 우리는 Watch Connectivity 를 사용해서 데이터를 공유해야합니다.

공식문서에서는 Watch Connectivity 를 이렇게 정의하고 있습니다. " iOS 앱과 페어링된 watchOS 앱 간의 양방향 통신을 구현합니다. " 이제 iOS앱과 watch앱 사이에 데이터 공유를 위해서는 Watch Connectivity 를 사용해야 하는것을 알았으니 한번 사용해보도록 합시다.


세팅

지금부터 나오는 예제들은 모두 공식 문서의 예제를 다운받아 참고했습니다. 워치앱과 관련된 자료들이 너무 적다보니 제가 아직 이해를 하지 못하거나 틀린 부분도 있을 수 있습니다. 틀린부분이 있으면 댓글로 알려주시면 수정하겠습니다!

To configure and activate the session, assign a delegate to the default session object and call that object’s activate() method, as shown in Listing 1. Your WatchKit extension and iOS app must each configure their own session object. Activating the session establishes a connection between the two apps.

세션을 구성화하고 활성화하려면 iOS 앱, WatchKit Extension 부분에 ativate() 메서드를 호출하라고 하네요. session을 활성화하면 두 앱이 서로 연결된다고 합니다.

Configuring and Activating the Session

// iOS App -> AppDelegate
...
import WatchConnectivity

...
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        // watchKit init
        //
        assert(WCSession.isSupported(), "watch")
        WCSession.default.delegate = self
        WCSession.default.activate()

        return true
    }
    ...
// WatchKit Extension
...
    override func awake(withContext context: Any?) {
        assert(WCSession.isSupported(), "watch")
        WCSession.default.delegate = self
        WCSession.default.activate()
    }
    ...

iOS App, WatchKit Extension의 info.plist

아마 WKExtensionDelegateClassName이 없으실 겁니다. 추가해서

$(PRODUCT_MODULE_NAME).ExtensionDelegate

이걸 값으로 넣어주세요. ( 저도 저걸로 값을 추가했는데, 어느새 사진처럼 변경되어있었네요. 아마도 자동으로 바뀌는 것 같습니다. )


WCSessionActivationState

session 의 활성화 상태에 따른 케이스가 3가지가 있습니다.

  • notActivated : 연결 x
  • inactive : 연결 o, 비활성화 (수신만 가능)
  • activated : 연결 o, 활성화

사실 이 내용은 간단하게 이정도면 알면 될 것 같다고 생각합니다. 자세한 내용은 WCSessionActivationState 공식 문서를 확인해주세요.


데이터를 주고 받는 테스트를 하려면 실기기에서 진행해야 합니다. 어디까지 시뮬레이터에서 허용되고 안되는지 정확하게는 모르지만 애플 워치 문서를 볼 때마다 하단에서 " 실기기로 테스트하세요. 시뮬레이터에서는 메서드를 호출하지 않습니다. " 라는 문장을 심심치않게 볼 수 있습니다.

Send

updateApplicationContext(_:)
이 방법을 이용하면 페어링된 앱에 현재 상태를 전달합니다. 자주 업데이트되는 데이터를 전달해야 합니다.

sendMessage(_:replyHandler:errorHandler:)
sendMessageData(_:replyHandler:errorHandler:)
이 방법을 이용하면 iOS앱과 watch앱 사이의 즉각적인 커뮤니케이션이 가능합니다.

transferUserInfo(_:)
transferFile(_:metadata:)
이 방법을 사용하면 background 에서 데이터, 파일을 전송합니다.

transferCurrentComplicationUserInfo(_:)
이 방법을 사용하면 iOS 앱에서 WatchKit Extension의 complication한테 데이터를 보냅니다.

Receive

WCSessionDelegate 의 메소드들을 이용하면 메시지를 받을 수 있습니다. 문서의 하위 섹션을 보시면 데이터 수신, 상태 변경 관리 등 자세하게 설명이 되어있습니다.


다음 글에서 저의 프로젝트에서 사용했던 코드 예시들을 보여주며 몇 가지 주의사항에 대해 한번 작성해보겠습니다. 가장 좋은 방법은 공식문서와 그 예제들을 참고하는 것이니 한번씩 읽어보시길 추천해드립니다 !

0개의 댓글