Programming/Mac & iOS

[watchOS] Complication in Apple watch (watchos 2.0 or above)

MB Brad KWON 2016. 3. 28. 17:06

    Complication은 복잡한 요소를 말하는 것으로 시계에서 시간을 가르쳐주는 페이스를 제외한 부속 화면 등을 얘기한다. watchOS2.0으로 업데이트되면서 Apple watch는 Complication을 지원하게 됬다. 사용자에세 간략한 정보를 신속하게 실시간(실제로는 사용자가 보는 순간)으로 업데이트하고 싶을 때 사용하면 좋다. 단, 여기서 중요한 것은 '간략한'이다. 데이터 처리 혹은 네트워크를 활용한 데이터 접근 등의 overload 많은 데이터 처리는 삼가는 것이 좋다. 이를 위해 watch app 내부에 data를 캐싱하는 것도 좋은 방법이다. 이제 Complication에 대해 하나씩 알아보자.




    Complication은 모두 5가지의 family를 제공한다. 5가지의 모양을 가지고 있는 것을 말한다. 각 5가지의 모양은 정보를 표시하기 위한 영역이 상이 하므로 이를 고려하여 Complication을 구현해야한다. 




Complication 동작 원리


    Clock kit에서 Complication에 표시하기 위한 데이터가 필요할 때, CLKComplicationDataSource를 구현한 객체를 통해 데이터에 접근한다. 객체의 메소드를 통해 데이터를 Clock kit에 제공하며 현재의 데이터 뿐만 아니라 구현 형태에 따라서 과거, 미래의 데이터도 보여줄 수 있다.

    Complication에 표시되는 데이터는 타임라인 형태로 구축하여 사용한다. Clock kit은 각 시간에 맞춰 타임라인으로 구축된 데이터를 읽어와 Complication에 바로 표시해준다. 또한 타임라인 형태로 데이터를 구축하면 Time Travel 기능을 지원하기 쉽다.

    Time Travel은 디지털 크라운을 이용하여, Complication에서 재공하는 과거와 현재의 데이터를 볼 수 있는 기능이다. Time line에 맞춰서 데이터를 구축할 때는 Date 값에 맞는 적절한 데이터를 산출하는 Logic이 중요하다. 예를 들어 일반적인 앱은 Date 당시의 데이터를 표시하지만 일정 앱은 다음 일정에 대한 안내를 보여줘야 한다. 각 Date 값에 따른 데이터 Logic 구현에 각별히 신경쓰도록 한다. 




Complication을 제공하기 위한 기준


    구현하기에 앞서, Complication을 통한 정보 표시 필요성에 관하여 고려해봐야 한다. Complication은 제한적인 공간에 시간 제약적인 데이터를 표시하기 때문에 구현했을 때, 효용이 떨어질수도 있기 때문이다. 아래는 Apple에서 제시하는 Complication 구현 기준이다. 이를 참조하면 Complication 구현 여부에 대한 판단에 도움이 될 것이다.


1. Complication은 공간이 매우 제약적이다. 몇몇 글자나 작은 이미지 정도만 표시 가능하다. 이 작은 공간을 통해 유용한 데이터를 전달할 수 있는지 확인해야한다.


2. Notification을 통해서 시간에 민감한 정보들을 전달하고 있다면 Complication을 고려해보는 것도 좋은 방법이다. 예를 들어 스포트 앱의 실시간 스코어를 Notification으로 알리는 것보다 Complication으로 알리는 것이 더 나을 수도 있다.


3. 데이터가 자주 업데이트된다면 데이터를 표시하기 위해 많은 시간을 할애하게 된다. 이는 Complication의 간결함에 많은 영향을 준다. 데이터의 업데이트가 자주 일어난다면 Complication 구현을 지양하는 것이 좋다.




Complication DataSource 구현


    DataSource 객체는 CLKComplicationDataSource 프로토콜을 구현한 클래스의 객체이다. 앞서 말한 바와 같이 구현된 클래스는 runtime에 객체를 생성하지 않는다. Xcode 프로젝트 설정에서 해당 클래스를 지정하면 Clock kit에 의해 필요할 때 객체를 생성하여 사용하게 된다. 생성된 객체는 다른 클래스들처럼 'init'메소드에 의해 초기화가 이루어진다. 만약에 네트워크를 이용해서 데이터를 읽거나 복잡한 연산을 통해서 데이터를 추출해야하는 경우, Clock kit에서 데이터를 불러오는데 많은 지연 시간을 유발한다. 이를 피하기 위해 iOS app 혹은 Watch extension을 통해 미리 계산하거나 로딩한 데이터를 캐시한다. DataSource 객체는 앞서 캐시한 데이터를 읽어오도록 구현하는 것이 바람직한다.




Timeline Data 구현 (TimeTravel 지원)


    먼저 Complication에 표시하기 위해 준비된 데이터를 객체를 불러온다. 해당 객체를 CLKComplicationTimelineEntry 객체로 만들어 Clock kit에 넘겨줘야 한다. CLKComplicationTimelineEntry 객체에 text나 image를 표시해야한다면 기존 앱처럼 raw 포맷으로 표시할 수 없다. Complication을 표시하기 위해서는 CLKTextProvider와 CLKImageProvider 객체를 사용한다. 


*TimeTravel에 관한 구체적 구현 사례 필요




Complication Data 업데이트


    Runtime에서 Clock kit을 총해 Complication Data를 업데이트하는 방법 몇 가지를 소개한다.


1. WatchKit extension이 실행 중일 때, 데이터를 업데이트한다.

2. Clock kit을 통해 주기적으로 WatchKit extension을 깨워 데이터를 업데이트한다.

3. 데이터 업데이트를 위해 Notification을 사용한다.

4. iOS app에서 시간에 민감한 데이터를 전달한다.


    Complication에 업데이트를 해야할 새로운 데이터가 있다면 CLKComplicationServer 객체를 이용하면 된다. 해당 객체의 'reloadTimelineForComplciation:'이나 'extendTimlineForComplication:' 메소드를 사용해야 한다. 새로운 데이터가 존재하지 않을 때는 굳이 해당 메소드를 호출하면 안된다. 해당 메소드의 호출 회수는 OS에 의해 제한되어 있다. 할당된 호출 회수를 다 사용하고 나면 회수가 복구될 때까지 Complication을 업데이트할 수 없기 때문에 새로운 데이터가 존재할 때만 신중하게 호출하도록 구현한다.


    각 업데이트 싸이클이 완료될 때마다 다음 업데이트 시점을 정하기 위해 'getNextRequestUpdateDateWithhandler' 메소드가 호출된다. 이 때 지정된 다음 업데이트 싸이클이 되면 DataSource 객체에서 'requestUpdateDidBegin'과 'requestUpdateBudgeExhausted' 메소드를 호출하게 된다. 이 메소드들 안에서 Complication 데이터 업데이트를 위해 호출했던 'reloadTimelineForComplciation:'이나 'extendTimlineForComplication:' 메소드를 사용하면 된다.


    iOS app에서 Complication 데이터를 업데이트해야 한다면 WKSession 객체의 'transferCurrentComplicationUserInfo:' 메소드를 사용한다. 해당 메소드를 호출하면 해당 메시지를 최우선순위로 하여, Clock kit이 강제로 Complication의 데이터 업데이트를 진행한다.




참고 : https://goo.gl/BWXGzQ