개발환경 Xcode 12.1

개발 언어 : swift

난 swift와 storyboard로 이루어진 app을 가지고 있고 애플 와치 se를 샀다.

그래서 가벼운 마음으로 app 데이터를 보여주는 watch app이 있으면 좋다고 생각했다.

작업 당시 xcode에서 생성 가능한 watch app의 크게 선택지가 다음과 같다.

1. watch app 개발을 하기 위해서는 새로운 target을 추가로 이동한다.

2. watch만으로 동작 가능한 앱인지 아니면 app와 연동이 되어야 하는지?

난 'app과 연동한다;를 선택했다.

 

3. 그 다음에 Interface를 선택한다. 

- storyboard와 swiftUI 중에 선택한다.

- storyboard를 선택하면 Life Cycle은 WatchKit만 선택 가능하지만 swiftUI를 선택하면 "SwiftUIApp"과 "WatchKit App Delegate"가 선택 가능하다.

> swiftUI 와 "SwiftUIApp"으로 설정한 경우 app과 watch app이 통신 하는 방법을 찾지는 못했다 ㅠㅠㅠㅠ

apple 문서에서도 swiftui + watchkit app 으로 되어 있었다 ㅠㅠ

developer.apple.com/tutorials/swiftui/creating-a-watchos-app

 

Apple Developer Documentation

 

developer.apple.com

그래서 난 storyboard와 watchkit app delegate를 하기로 했다.

데이터 공유의 방향은 다음으로 정했다.

- app에서는 데이터를 CRUD 모두 한다.

- watch에서는 데이터를 RU 만 한다. 

기본적인 통신으로 고려했던 방법은 다음과 같다.

1. 현재 app 에서 데이터를 저장하는 방법은 realm이란 라이브러리를 사용하고 있으니 realm 파일을 App Group을 이용해서 공유하는 방식으로 처리한다.

- 실제 이 방법으로 widget은 공유하고 있는 상태이다.

지만 watch app에 realm이 설치하는 방법을 찾지 못하였다 ㅠㅠㅠㅠ

2. app에서 생성한 데이터를 app에 알고 있는 경로에 json 파일로 저장하고 그걸 watch에서 읽는 방법

사용자에게 노출되지 않는 app내 혹은 app group 내 경로를 맞추는 데 실패하였다.

시뮬레이터 기준으로 다음처럼 나오더라고요

- app에서 얻은 경로

file:///Users/dd/Library/Developer/CoreSimulator/Devices/01BFA962-A2AA-47FC-B1C2-A4638317799A/data/Containers/Shared/AppGroup/724A8AEB-4451-4418-9767-9F78658CEDA1/wrecords.json

- watch에서 얻은 경로

file:///Users/dd/Library/Developer/CoreSimulator/Devices/5E88A606-60DA-4412-96D6-1D386B204C46/data/Containers/Shared/AppGroup/72538C89-C6E1-4FF0-ADB0-044942559F25/wrecords.json

3. 마지막으로 WCSession을 이용해서 json 데이터를 string으로 주고 받도록 한다!!!!!!!!!!!!!!!!!! 

WCSession 

The object that initiates communication between a WatchKit extension and its companion iOS app.

와치와 app 사이에 통신하기 위한 객체... 정도인 듯하다.

출처 :developer.apple.com/documentation/watchconnectivity/wcsession 

 

Apple Developer Documentation

 

developer.apple.com

해당 내용을 구현한 애플의 샘플 주소는 다음과 같다.

developer.apple.com/documentation/watchconnectivity/using_watch_connectivity_to_communicate_between_your_apple_watch_app_and_iphone_app

 

Apple Developer Documentation

 

developer.apple.com

하지만 난 다음 포스팅이 이해하기가 쉬워서 차용했다.

martiancraft.com/blog/2018/02/notification-handling-on-watchkit/

 

Notification Handling on WatchKit

According to our own Richard Turton, notifications are one of the key interaction modes on Apple Watch. A well-designed notification quickly presents any pertinent information to the user and may also give them the opportunity to act on said information. I

martiancraft.com

적용하는 순서는 다음과 같다.

1. app에 wcsession을 제어할 수 있는 코드를 추가한다.

1-1. app delegate에 Session handler를 이용해서 지원 여부를 확인하면 좋다

2. watch 에서도 app과의 메세지를 주고 받도록 session handler를 추가한다.

gist.github.com/zapping0320/cc1fe8368f83a09091fa3797c28003b4.js"></script>

3. app에서 watch로 메시지를 보낸다.

app의 session handler의 sendMessage 를 이용해서 watch에 string을 보낼 수 있다.

4. watch에서 app으로 메시지를 보낸다.

watch에서도 3번과 유사하게 session handler의 sendMessage를 활용하면 된다.

(3,4번 공통)은 메시지를 보내면 응답으로 오는 replyHandler를 이용해서 상대방 혹은 자기가 원하는 동작을 추가해서 구현할 수 있다.

이 때 주고 받는 데이터를 나의 경우에는 json string을 주고 받아서 Encode / Decode 해서 처리하였다.

이 부분에 대해서 궁금하다면 여기를 클릭 bmwe3.tistory.com/1765

 

[swift] codable를 이용해서 json 파일 읽고 쓰기

개발 환경 : Xcode 12.1 사용언어 : swift 애플은 데이터의 json으로의 encode / decode를 지원하기 위해서 codable이란 프로토콜을 지원하고 있다 (Xcode 9.0+) developer.apple.com/documentation/swift/codable..

bmwe3.tistory.com

마치기전에

왜 개발환경을 강조하면서 시작했을까 할 수 있다.

하드웨어를 영향은 아닌 것 같고 Xcode 12.2에서는 app <> watch  메시지를 연결해주는 WCSession 디버깅이 안 된다!!!

부디 유사한 프로젝트 진행하시는 분들에게 도움이 되길 바랍니다.

 

덧> 해당 개발 사항은 하기 앱에 적용되어 있으니 한번 보셔도 좋을 것 같습니다.

https://itunes.apple.com/US/app/id1527099671

by 무위자연 2020. 11. 30. 18:26