일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- KoreaMango
- wwdc2023
- RxSwift
- @Model
- tutorials
- WWDC
- fruta
- xcode15
- ActivityKit
- Unit
- unittest
- watchkit
- watchapp
- ios
- Swift
- 프로그래머스
- letswift
- 1주차
- 콩세알프로젝트
- 개발자
- 2023
- SwiftData
- DynamicIsland
- test
- 대학생협
- 2주차
- tutorial
- 3주차
- 회고
- swiftUI
- Today
- Total
KoreaMango 나무
2024년 watchOS, watchKit, watchExtension 개발 본문
오랜만입니다 :)
요즘 다시 swift로 watchOS 를 개발하고 있어서 포스팅 하나 남깁니다!
# watchApp, watchApp WatchKit Extension
옛날 워치 앱 코드를 작업하다 보니 watchApp, watchApp WatchKit Extension 이렇게 두 개가 있더라구요
이렇게 말이죠..
그런데 테스트로 만들어본 프로젝트에서 워치 앱을 만들어봤는데,
전혀 다른 구조더라구요.
scheme도 다르고 target도 달라서 이게 뭐지 싶었는데 찾아보니까
Xcode 14이후 부터는 watchKit Extension 필요없이 바로 watchApp으로 단일 앱 타겟으로 만들어진다고 해요.
그래서 크게 신경 안써도 되는 문제였어요.
# Watch Connectivity
iOS랑 watchOS랑 어떻게 데이터를 주고 받는지 찾아봤었는데
Watch Connectivity의 WCSession을 사용하면 되는거 같았어요.
통신을 하려면 iOS, watchOS 둘다 WCSession을 사용해야해요.
WCSessionDelegate를 상속 받아서 통신할 객체를 만들어야 하는데 이 WCSessionDelegate는 싱글톤이라서
여러 곳에서 위임자로 상속한 다음 통신하려고 하면 충돌이 발생해 어느 한 쪽은 제대로 작동 안하니 주의하시길 바랍니다 :)
# watchOS 통신 테스트
watchOS랑 iOS랑 데이터를 잘 주고 받는지 테스트를 하려 했는데,
애플에서 시뮬레이터로 테스트하는 것 보다 실 기기로 테스트 하는 것을 권장한다고 해요.
그래서 실제 애플워치 하나랑 아이폰을 준비해서 xcode에 연결하고 build를 하려고 했는데 .....
xcode 15에서 watchOS를 잘 못찾는 버그가 있었어요..
https://forums.developer.apple.com/forums/thread/734694
Apple Watch cannot reconnect | Apple Developer Forums
This is a workaround that won't work if you only have one Mac... In my case, I happen to have a Macbook Pro and a mac mini, and the problem did not occur on the Macbook Pro, so I copied watchOS DeviceSupport (latest is Watch6,6 10.2 (21S364)) to the mac mi
forums.developer.apple.com
계속 제 애플워치를 못찾더라구요...
그래서 다른 방법 없나 찾아보던 중 한 방법을 찾았어요.
iOS는 연결이 잘 되는 상태였기 때문에 iOS를 빌드하고 실행한 다음
iOS 안에 watch 어플을 통해서 워치 앱을 설치해줬어요.
그리고 통신 이벤트를 주니까
iOS 코드에 print, breakpoint를 걸어서 통신이 잘 되는 걸 확인했어요.
양쪽이 reachable 되어야 통신이 되는거니 iOS에만 결과가 나와도
통신이 잘 되는 것을 확인할 수 있었어요!