관리 메뉴

Hello!! Kyle

[watchOS] watchOS 2.0 변경 및 개발 방법 본문

Programming/Mac & iOS

[watchOS] watchOS 2.0 변경 및 개발 방법

기타치는 개발자 MB Kyle KWON 2016.01.26 10:05
크리에이티브 커먼즈 라이선스
Creative Commons License




    watchOS 2.0 (이하 watchOS 2)이 릴리즈된지 벌써 4개월이 지났다. 이제서야 watchOS 2를 정리하는 나의 천성적 게으름을 핀잔하며 이 글을 시작하려 한다. 참고로 이 포스팅은 Apple에서 제공하는 Transition Guide와 Document를 기반으로 작성됨을 알린다. watchOS 1.0 (이하 watchOS 1)에 대한 전반적 이해를 위해서는 이전 포스팅 (WatchKit : watchOS 1.0으로 개발하기)을 참고하기 바란다.



1. OS 업데이트로 인한 App 구조 변화


    watchOS 2에서 바뀐 가장 큰 소프트웨어적 차이점은 앱 소스 및 리소스를 관리하는 WatchKit Extension이 iOS app 부분에서 watch app으로 이동한 부분이다. 아래의 그림을 참고하면 알기 쉽다.





    위와 같은 변화로 인하여 기존에 Extension을 작성할 때는 iOS SDK를 활용하여 구현했지만 watchOS 2부터는 watchOS SDK를 활용해야 한다. 기존에 iOS SDK를 통한 기능 활용이 이 부분으로 인하여 제한이 걸린다. 그래서 watchOS 2에서 구현할 때는 iOS SDK가 아닌 watchOS SDK의 사용 가능 기술을 참고하여 구현해야 한다. 추가적으로 이전처럼 Extension에서 Shared Container를 이용한 iOS app과 watch app간의 데이터 전송이 불가능해졌다. 이를 해결하기 위해서는 iPhone과 Apple watch간의 무선 전송을 이용해야 한다.



2. watchOS 2에서 제공하는 추가 기능


    watchOS 2는 기존 watchOS 1에서 제공하던 일부 기능 외에 보다 많은 기술적 리소스를 활용할 수 있도록 기능이 많이 추가되었다. 추가된 기능의 목록은 아래와 같다. 그리고 무엇보다 NSURLSession을 통한 직접 다운로드가 가능하며 이는 background download를 제공한다.


Complication 기능 (ClockKit) : 자주 접근하는 정보를 Watch face를 통하여 표시

연락처 접근 (Contacts)

데이터 베이스 (Core Data)

Core Foundation (Core Foundation)

The Foundation (Foundation)

그래픽스 (Core Graphics)

위치 정보 (Core Location)

모션 인식 (Core Motion)

캘린더, 미리알림 (Event Kit)

건강 (Health Kit)

스마트 홈 (Home Kit)

이미지 처리 (Image I/O)

지도 정보 (Map Kit)

전화 기능 활용 (Mobile Core Services)

전자티켓 (Pass Kit)

보안 관련 : 키체인, 인증서 (Security)

iOS app - watch app간 통신 (Watch Connectivity)

Watch app 인터페이스 (Watch Kit) : 기존 인터페이스에서 추가로 다양한 인터페이스 제공 (미디어 파일 : 오디오/비디오 재생 등)


    특히 위에서 언급한 것 중에 Complication 기능은 사용자에게 자주 접근하는 정보를 Watch face상에 표시해줘 편의성을 증대시킨다. 서비스의 성격에 따라 Push Notification으로 정보 업데이트를 알려줄건지, Complication을 사용할건지 정해야 한다. Complication을 배치할 수 있는 유형은 아래와 같다. Complication의 구현에 대해 보다 상세한 내용을 원한다면 Apple Complications Document를 참고한다.





3. 코드 구현 상, 주의사항

Extension Delegate


    기존의 Extension은 iOS app에 귀속되어 있어 Apple watch의 life cycle과 독립적이었지만 watchOS 2에서는 watch app으로 이동하면서 Apple watch의 life cycle에 기반한 로직 구현이 가능해졌다. WKExtensionDelegate protocol을 이용하여 Apple watch life cycle에 따른 로직을 구현하자.



Managing Your Data


    Extension이 watch app으로 이동하면서 데이터 관리 영역에 있어, watch app의 역할이 커졌다. watch app에서 사용자 데이터는 'Documents' 디렉토리에 저장하고, 중요도가 낮은 임시 데이터는 'Caches' 디렉토리에 저장한다. watch app은 자동 백업 기능을 아직 지원하지 않는다. 그래서 데이터 백업을 위해서는 iOS app으로 데이터를 전송하여 저장한다. 아이클라우드에 파일을 업로드/다운로드 하기 위해서도 iOS app을 통해서 사용해야 한다. watchOS 2에서는 기존 OS버전과 달리 오디오/비디오 파일을 실행할 수 있다. 이를 위해서 미디어 파일은 Extension의 Bundle에 저장한다. 다운로드 받은 미디어 파일은 Shared Container에 저장하도록 한다.



Communicating with Companion iOS app


    watchOS 2에서는 Watch Connectivity framework를 이용하여 foreground와 background에서 데이터와 파일 전송을 할 수 있도록 한다. Watch Connectivity framework에서 WCSession으로 WatchKit extension과 iOS app간 연결을 관리한다. 그리고 session을 활성화하면 다른 앱간의 메시지를 주고 받을 수 있다. 실제로 앱간 통신을 구축하기 위해서 아래의 사항들을 참고하여 구현하면 용이하다.



watch app에 새로운 데이터를 넣을 때, 백그라운드 새로고침을 사용한다. 'updateApplicationContext: error:' 메소드를 이용한다. 특히 Glance를 주기적으로 업데이트할 때, 유용하다.


Delegate 메소드에서는 파일을 바로 옮긴다. 'session: didReceiveFile:' 메소드를 사용하여 파일을 이동할 경우, 시스템에서 불필요한 공간을 확보하기 위해 파일을 지울 수 있으므로 새로운 저장소로 옮겨 줘야 한다.


필요한 데이터만 전송한다. 불필요한 데이터를 전송하면 전력을 낭비하게 된다.

가변성 임시 데이터는 application context를 사용한다. 'updateApplicationContext: error:' 메소드는 watch app과 iOS app간 상태 정보의 스냅샷을 주고 받는 수단이다. 이 메소드를 여러 번 호출할 경우, 이전 호출과 데이터가 교차할 수 있다. 데이터의 온전한 전송을 보장하기 위해서는 'transferUserInfo:'를 대신 사용하도록 한다.

각 error 케이스에 대처한다. 데이터를 저장할 공간이 부족하여 에러가 발생할 수 있다. 그러면 불완전한 데이터로 인한 이상 동작에 대한 케이스들을 적절히 대처해야 한다.

background 데이터 전송은 즉시 실행되지 않는다. 단편적인 파일이나 데이터들은 가능한 빠르게 전달된다. 하지만 크기가 큰 파일들은 그에 상응하는 시간이 걸린다는 걸 명신해라.


Network-Based Operations


    Network Operation을 위해서 NSURLSeesion을 사용한다. NSURLSession은 iOS app에서와 같은 동일 스펙으로 지원한다. 추가로 watch app에서 데이터를 가져올 때, watch app이 언제든지 종료될 수 있음을 명심하자. 조금이라도 watch app이 종료되는 것을 방지하기 위해서는 NSProcessInfo의 'performExpiringActivityWithReson: usingBlock:'을 사용한다.


    iOS app과 watch app이 같은 서버와 통신한다면 하나의 앱에서 데이터를 동기화 해오는 것보다 각자 서버와 통신하는 것이 훨씬 간단하다. 굳이 두 앱간의 데이터를 동기화하고 싶다면 통신은 각 앱에서 따로 수행하고, 'updateApplicationContext: error:' 메소드를 활용하여 동기화 하도록 한다.


저작자 표시 비영리 변경 금지
신고
0 Comments
댓글쓰기 폼