Tag Archives: Watch

애플와치 개발 개요

애플 와치는 유저들로 하여금 명백하게 개인적이고 거슬리지 않는 방법으로 그들의 데이터를 엑세스할 수 있게 제공합니다. 주머니에서 아이폰을 꺼내드는것보다 유저들은 애플와치를 힐끗 보는것만으로 중요한 정보를 빠르게 습득할 수 있어야 합니다. 애플 와치의 앱은 가장 중요한 정보들을 손쉬운 방법으로 유저들에게 제공될 수 있도록 개발되어야 합니다.

Apple-Watch-Logo

애플 와치는 써드파티 앱들을 구동하기 위해 아이폰이 필요합니다. 써드파티앱을 만드는것은 두가지 분리된 번들이 요구됩니다. 하나는 애플 와치에서 구동되는 WatchKit 앱이고 다른 하나는 사용자의 아이폰에서 구동되는 WatchKit 익스텐션입니다. WatchKit 앱은 단지 스토리보드와 앱의 유저인터페이스와 관련된 리소스만을 가질 수 있습니다. WatchKit 익스텐션은 WatchKit 앱의 유저 인터페이스가 사용자들과의 인터렉션의 결과들을 관리할 수 있는 코드들을 가지게 됩니다.

당신의 WatchKit 앱은 다음과 같은 방법으로 유저와 인터렉션이 일어나게 됩니다.

  • 유저는 홈스크린에서 앱을 실행함으로써 당신 앱의 전체 인터페이스와 소통할 수 있습니다. 당신의 앱의 풀 인터페이스는 컨텐츠를 가진 다수의 스크린을 가질 수 있으며 앱의 데이터를 가지고 유저와 소통할 수 있습니다. 당신은 모든 앱경험을 제공할 수 있어야 합니다.

  • Glance는 적시의 타이밍에 당신의 앱으로부터 관련정보를 읽기전용의 인터페이스를 제공할 수 있습니다. Glance의 제공은 선택사항입니다.

  • Custom Notification 인터페이스는 로컬/리모트 노티피케이션의 정보를 유저에게 보여주는 방법을 변경할 수 있게 해줍니다.Custom Notification을 사용하여 회사의 그래픽이나 추가적인 정보 또는 커스텀 레이아웃을 노티피케이션의 정보에 적용할 수 있습니다.Custom Notification의 제공은 선택사항입니다.

WatchKit앱은 이미 존재하고 있는 iOS 앱을 확장하는 개념이기 때문에 WatchKit 앱과 WatchKit 익스텐션은 함께 번들로 포장되어 당신의 iOS 앱에 포함됩니다. iOS 앱이 설치될 때 시스템은 유저에게 페어링 되어있는 애플와치에 WatchKit앱을 설치할지 물어보게 됩니다.

The WatchKit App

WatchKit 앱은 애플 와치의 홈스크린에서 보여지며 유저가 실행할 수 있습니다. 이 WatchKit 앱은 유저로 하여금 당신의 데이터를 보고 사용하는 가장 메인이 되는 방법입니다. 앱에서는 데이터를 보는 방법을 제공할 수 있으며 선택적으로 테이터를 조작하거나 소통할 수 있도록 할 수 있습니다. 데이터에 따라 WatchKit 앱은 iOS 앱이 가지고 있는 데이터의 일부분만을 보여줄 수 있습니다.

watchkit_appsWatchKit 앱은 당신의 앱의 공개된 얼굴 역할을 하지만 내부적으로는 두뇌 역할을 하는 WatchKit 익스텐션과 협력하여 동작을 하게 됩니다. WatchKit 앱은 스토리보드들과 당신의 앱의 유저인터페이스와 관련된 리소스 파일만을 가질 수 있습니다. WatchKit 익스텐션은 WatchKit 앱의 유저 인터페이스가 사용자들과의 인터렉션의 결과들을 관리할 수 있는 코드들을 가지게 됩니다. 익스텐션이 사용자의 아이폰에 설치됨에 따라 보다 정교한 작업이 요구되는 경우 iOS에서 수행되도록 조정될 수 있습니다.

Glance Interfaces

Glance는 당신 앱에서 가장 중요한 정보를 보여주도록 사용되는데에 집중하는 인터페이스 입니다. Glance는  이름 그대로(힐끗 보다) 사용자로 하여금 빠르게 정보를 볼 수 있도록 의도되었습니다. Glance는 스크롤을 해서는 안되며 힐끗 볼때 정보의 전달이 될 수 있도록 하나의 스크린에 딱 맞도록 인터페이스가 구성되어야 합니다. Glance는 읽기전용이며 버튼, 스위치, 다른 인터렉션이 가능한 컨트롤이 있어서는 안됩니다. Glance화면을 탭하면 당신의 WatchKit 앱이 구동되게 됩니다.

watchkit_glance

Glance 인터페이스를 만드는것은 또다른 실행가능한 무언가를 만드는것을 필요로 하지 않습니다. Glance를 만드는것은 당신의 이미 존재하는 WatchKit 앱과 익스텐션안에 특별한 세트를 만드는것을 의미합니다. 사실 Glance를 구현하는데에 사용되는 클래스들과 테크닉들은 WatchKit 앱을 만들때 사용되는것들과 동일합니다.

Custom Interfaces for Local and Remote Notifications

애플 와치는 페어링된 아이폰과 함께 동작하여 로컬/리모트 노티피케이션을 보여줄수 있습니다. 초기에 애플 와치는 도착한 노티피케이션을 보여주기 위해 최소한의 인터페이스만을 사용합니다. 유저가 더 많은 정보를 보기 원하여 상세 인터페이스로 이동할 때 최소한의 인터페이스는 좀 더 상세한 정보를 보여주는 인터페이스로 변경됩니다. 당신은 이 상세 인터페이스를 커스터마이징 하고 그래픽을 추가하고 노티피케이션 정보를 시스템이 기본제공하는 레이아웃과 다르게 제공할 수 있습니다.

watchkit_actionable_notification

애플 와치는 iOS 8에서 소개된 Actionable Notification을 자동으로 제공합니다.  Actionable Notification은 사용자가 수행 가능한 작업이 반영된 버튼을 추가하는 방법을 제공하는것을 말합니다. 예를 들어 회의 초대 노티피케이션은 참석 또는 거부 버튼을 포함 할 수 있습니다. 당신의 iOS 앱이 Actionable Notification을 지원한다고 등록하게 되면 애플 와치는 자동으로 노티피케이션 인터페이스에 적절한 버튼을 추가하게 됩니다. 유저로 부터 선택된 액션에 대한 모든 처리는 WatchKit 익스텐션에서 하게 됩니다.

참고 : Developing for Apple Watch

iOS WatchKit 개발 팁

watchkit_logo

애플 개발자 센터에 등록되어있는 WatchKit Development Tips를 번역한 내용입니다. Google Watch와 마찬가지로 굉장히 제한적이고 권고사항이 많은것을 알 수 있습니다. 모든것은 배터리 때문인듯 하네요.

일반 가이드

이미지 시퀀스를 이용한 애니메이션

애플 와치의 애니메이션은  순차적인 이름을 가진 이미지 리소스를 반복적으로 순환하는 방식으로 만들어집니다. 또한 애니메이션할 이미지들에 대해 지속시간(duration) 또는 반복 횟수(repeat count)를 정의하거나 지속시간을 음수로 지정하여 애니메이션 순서를 반대로 할 수도 있습니다.

이미지 시퀀스는 애플와치에 저장하여 사용

에니메이션이 시작되면 에니메이션 시퀀스(애니메이션을 구동하기 위한 설정이 포함된 이미지 집합)는 애플와치에 로드되어 사용됩니다. 미리 만들어진 시퀀스들을 당신의 WatchKit AppBundle 또는 UIImage 객체에 추가하면 WKInterfaceDevice를 통해 시퀀스가 생성되고 이후에 사용되기 위해 메모리에 캐시되게 됩니다. 이때의 로딩 시간을 줄이기 위해서는 필요한 비쥬얼 효과를 충분히 표현하는 선에서 이미지의 수를 가능한한 최소화 하여야 합니다.

설정 번들을 사용

iOS앱들과 마찬가지로 설정 번들(Settings bundle)을 제공하여 유저들이 WatchKit 앱의 설정을 할 수 있도록 합니다. 이 설정 번들은 iPhone의 Apple Watch 앱안에서 보여집니다.

바로 받아쓰기를 적용

만약 당신이 받아쓰기를 활성화 하기 위해 텍스트 입력 컨트롤러를 사용한다면 아래 스크린샷과 같은 제안 시트를 사용하지 않고 텍스트 입력 모드를 Plain(WKTextInputModePlain)으로 하여 사람들이 바로 받아쓰기를 수행하도록 할 수 있습니다.

text_input_example

상태 복구

인터페이스 컨트롤러의 didDeactivate: 메소드에서 앱의 상태와 그 유저 인터페이스를 저장하십시오. 그리고 루트 컨트롤러에서 willActivate: 메소드에서 이전에 저장했던 앱과 유저 인터페이스를 복원하십시오.

퍼포먼스

트래픽 최소화

잘 동작하는 WatchKit 앱은 아이폰과 애플와치간의 통신 최소화가 필요합니다.

무엇인가 변했을 경우에만 업데이트

컨트롤러에서 당신의 WatchKit 익스텐션은 모든 값을 리로딩하는것 대신에 변경된 값만을 업데이트하는것이 필요합니다. 이것은 특히 테이블 로우(rows)를 조작하는데에 중요합니다. 테이블의 전체를 리로딩하는것 대신에 변경되는것에 대한 update, add, remove를 수행해야 합니다.

컨텐츠를 불러올때는 필요한 시점에 로드 (Load lazily)

당신의 WatchKit 앱의 구동 시간과 앱의 반응성이 더 좋게 느껴지도록 최적화 하기위해서는 먼저 컨트롤러의 화면영역부터 먼저 초기화한뒤에 유저에게 보여주고 그 뒤에 컨텐츠(내용)을 로드하는것이 좋습니다. WKInterfaceController 의 willActivate: 메소드안에서 dispatch_async를 호출함으로써 컨트롤러가 화면에 표시될때까지 컨텐츠를 세팅하는것을 지연시킬 수 있습니다.

페이징이 되는 컨트롤러(Pagenated Controllers)의 초기화는 빠르게

다수의 뷰를 담고 있는 페이지 컨트롤러의 로드 시간을 줄이기 위해서는 거의 모든 셋업 작업을 각 페이지의 컨트롤러의 willActivate: 메소드안에서 상태를 체크하여 최초로 호출될 때 실행하도록 합니다. 페이지 컨트롤러가 생성되면 willActivate: 메소드가 호출되기 이전에 각페이지의 init: 와 awakeWithContext: 가 호출됩니다. 시스템은 유저에게 첫번째 페이지를 보여주기 이전에 모든 페이지의 init: 와 awakeWithContext: 의 수행이 끝날때까지 기다리게 됩니다.

컨트롤러 씬은 단순하게

로드 시간의 확연한 향상을 위해 숨겨져있는 오브젝트의 수를 가능한한 줄이십시오. 예를 들어 하나의 컨트롤러씬에서의 다섯가지 버전의 컨트롤러 레이아웃은 모든 오브젝트가 생성된 이후에나 화면에 표시되게 됩니다.

적은 테이블 로우를 사용하여 로드 시간을 향상

화면에 처음으로 표시할 로우의 최적의 수를 정하고 willActivate: 메소드의 수행이 끝날때까지 추가적인 로우의 로딩을 미루도록 구현합니다. 컨트롤러가 화면에 표시되기 이전에 모든 테이블의 로우가 생성되므로 당신이 더 많은 로우를 생성한다면 컨트롤러가 화면에 보여지기까지 더 많은 시간이 소요될 수 있습니다.

아이폰과의 통신

아이폰앱이 대부분의 작업을 수행해야 함

만약 Apple Watch에서 당신의 앱이 백그라운드에서 긴 작업을 수행해야 할 필요가 있다면(예를들어 네트워크 통신) 아이폰 앱이 그 작업을 수행하도록 의존해야 합니다. WKInterfaceController 안의 openParentApplication:reply: 메소드를 이용하여 백그라운드 상태에 있는 당신의 아이폰앱을 깨울 수 있고 WatchKit 익스텐션이 필요로 하는 정보를 받을 수 있습니다. UIApplicationDelegate 의 메소드를 이용하여 WatchKit이 필요로 하는 정보를 바로 반환할 수 있습니다. 만약 비동기 호출이 필요할 경우(예를 들어 네트워크 통신) 원하는 값을 반환하기 전까지 서스펜드 상태로 들어가지 않는 백그라운드 작업을 이용할 수 있습니다.

앱 그룹간 데이터 공유

앱 그룹과 NSUserDefaults를 사용하여 당신의 iOS 앱과 WatchKit 익스텐션간의 적은양의 데이터를 손쉽게 공유할 수 있습니다. Core Data 저장소와 같은 다른 리소스에 접근하기 위해 당신의 iOS 앱과 WatchKit 익스텐션간의 공유 컨테이터를 이용하여 최신 정보를 간단하게 접근하거나 제공할 수 있습니다.

핸드오프(Handoff ) 사용 (다른 디바이스간 자연스러운 사용연결을 의미)

핸드오프는 유저로 하여금 당신의 앱과 Apple Watch간 이동을 손쉽게 할 수 있도록 해줍니다. WKInterfaceController의 핸드오프 API는 Glance나 Custom Notification 인터페이스를 이용하여 아이폰 앱으로의 딥링크를 생성하는데 사용될 수 있습니다. 이 API를 사용하여 당신의 인터페이스가 현재 무엇을 하고 있었는지에 대한 정보를 포장하고 앱의 메인 인터페이스 컨트롤러에 넘길 수 있습니다. 그러므로 앱의 시작 시점에 다른 인터페이스를 보여줄 수 있습니다.

프레임워크를 이용하여 코드 공유하기

프레임워크를 만들어서 iOS 앱과 WatchKit 익스텐션간에 코드를 공유할 수 있습니다. 프레임워크는 당신의 코드를 접근가능하고 중복 작업을 방지해주고 버그 수정시 당신의 프로젝트의 코드들의 인스턴스에 한번에 적용시킬 수 있습니다.