일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Swift
- ios
- WWDC22
- UIStackView
- Apple Developer Academy
- Coding Test
- coreml
- Project
- Sendbird
- 코테
- backend
- Firebase
- Tuist
- github
- widgetkit
- fcm
- Delegate Pattern
- cloud functions
- UITableView
- watchkit
- SwiftUI
- Complication
- Flutter
- swift concurrency
- UIDatePicker
- tabman
- app intents
- task.yield()
- createml
- spring
- Today
- Total
azhy의 iOS 이야기
[iOS] WatchKit[2] - Watch Connectivity, 앱이랑 데이터 주고받기 본문
2022년 8월 2일에 작성됨
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의 메서드들을 이용하면 메시지를 받을 수 있습니다. 문서의 하위 섹션을 보시면 데이터 수신, 상태 변경 관리 등 자세하게 설명이 되어있습니다.
다음 글에서 저의 프로젝트에서 사용했던 코드 예시들을 보여주며 몇 가지 주의사항에 대해 한번 작성해 보겠습니다. 가장 좋은 방법은 공식문서와 그 예제들을 참고하는 것이니 한 번씩 읽어보시길 추천해 드립니다!
'iOS' 카테고리의 다른 글
[iOS] WatchKit[4] - Complication 살펴보기 (0) | 2024.11.13 |
---|---|
[iOS] WatchKit[3] - 예시를 통해 Watch Connectivity 알아보기, 주의사항 (0) | 2024.11.13 |
[iOS] WatchKit[1] - watch 프로젝트 시작, 살펴보기 (1) | 2024.11.13 |
[iOS] 앱 심사 리젝 해결 - App Crash, Report 확인 (1) | 2024.11.13 |
[iOS] 두 번째 앱 출시 후기 (0) | 2024.11.12 |