Apple Watch – 새로운 영역에서

저는 LINE iOS 개발을 담당하고 있는 Roy Kang입니다. Apple Watch 출시에 맞춰 Apple Watch의 기능을 간단히 둘러보고 Apple Watch 개발 방법, 라인에서의 대응 방법을 소개하고자 합니다.

Apple Watch 소개

Apple Watch는 2014년 9월 9일 처음으로 소개되었다. 아이폰6, 아이폰6+, 애플 페이가 소개된 후 “One More Thing”으로 소개되었으며 38mm42mm의 사이즈, Watch, Watch Sport, Watch Edition 3가지 케이스가 공표되었다. 사용자의 움직임을 측정하는 것은 물론 아이폰이 수신하는 알림을 볼 수 있으며 Apple이 아닌 3rd party 회사들을 위한 SDK도 공개되었다. 1 Apple Watch는 터치 스크린과 화면을 스크롤 또는 줌인/줌아웃할 수 있는 디지털 크라운이 오른쪽에 붙어 있다. 그 아래에는 바로 연락처에 접근할 수 있는 피플 버튼이 있으며 시계 아래 쪽엔 사용자가 시계를 찼는지 체크하거나 사용자의 생체 정보를 습득할 수 있는 센서가 부착되어 있다. 스피커와 진동 센서가 내장되어 있어서 알림이 오면 소리를 듣거나 진동을 느낄 수 있다. 2Apple-Watch-Heart-Rate-Sensor-337x400

Apple Watch 개발 방법

Apple Watch 를 개발하려면 iOS 앱에서 Watch extension을 추가하면 된다. extension 중에선 위젯처럼 하나의 iOS 앱에서 여러 extension을 생성할 수 있는 것도 있지만 Watch extension은 하나의 iOS 앱에서 하나의 Watch extension만 추가할 수 있다. Apple Watch extension을 추가하면 3가지 기능을 만들 수 있는데 Watch App, Glances, Custom Notification 기능이다.

Watch App : Apple Watch에서의 iOS 앱이라고 생각하면 된다. 페이지를 구성하거나 화면을 전환하거나 사용자 입력을 받을 수 있다. 3

Glances : Apple Watch에서의 위젯같은 것이다. Apple Watch의 락 스크린에서 아래에서 위로 스와이프하면 사용자가 즐겨찾기 해놓은 앱의 목록을 볼 수 있는데 이때의 화면이 Glance이다. 캘린더 Glance는 사용자의 일정을 보여주고 날씨 앱은 현재 날씨를 보여주는 등의 기능을 한다. 4

Custom Notification : 기본적으로 iOS에서 수신하는 모든 알림은 Apple Watch로 수신이 되는데 이때 지정한 알림이 Apple Watch에서 어떻게 보여질지 화면을 구성할 수 있다. 알림으로 온 데이터를 기반으로 Watch App처럼 화면을 구성할 수 있다. 관련된 사진을 보여주는 것도 가능하다. 5

Apple Watch에서는 이미지를 보여주거나 텍스트를 보여주는 등 iOS처럼 화면을 구성하는 것이 가능하고 버튼, 스위치, 테이블 뷰 등을 활용할 수 있지만 iOS 앱처럼 화면 방향 전환이 없고 동영상 재생이나 음악 재생 등의 특정한 기능이 불가능하다.

Apple Watch의 모든 코드는 아이폰에서 실행된다. Apple Watch는 코드를 실행시키지 않는다. Apple Watch는 아이폰에서 모든 코드가 실행되어 화면에 보여줘야 하는 것을 보여주는 역할만 하며 Apple Watch에는 사용된 이미지 리소스나 스토리 보드 정도만 저장된다. 그렇기 때문에 Apple Watch와 아이폰이 멀리 떨어지는 경우 3rd party 앱들은 아무것도 실행되지 않는다. 심지어 Apple Watch에서 명령을 실행하고 아이폰과의 페어링이 끊어지는 경우 다음 단계가 실행되지 않은 채로 유지된다. Apple Watch는 아이폰에서의 Apple Watch 관련 코드를 보여주는 스크린 정도라고 생각하면 된다. 6

iOS 앱과 데이터를 공유하기 위해선 데이터베이스나 사용자 설정 등의 데이터 또는 파일로 가능하며 동적으로 Watch에서 iOS 앱을 기동시켜서 데이터를 주고 받는 것도 가능하다. openParentApplication이라는 함수로 아이폰을 기동시켜서 아이폰에 질의를 보내고 아이폰에선 그 답변을 Watch로 보내줄 수 있다. 굉장히 편리한 함수이지만 아이폰을 기동시켜야 하기 때문에 느리다는 치명적인 단점이 있다. 시계를 지켜보고 있으려면 팔을 들고 있어야 하므로 몇 초라도 딜레이가 생기면 불편하다는 느낌이 든다. 안 쓸 수 있으면 무조건 안 쓰는 것이 좋다. 하지만 일정이 촉박하거나 아이폰과의 통신 없이 Watch의 코드만으로 구현하기에 너무 힘든 상황이라면 아주 최소한으로 사용해야 하는 상황도 있다.

Apple Watch에서 가능한 것과 불가능한 것

  • 하드웨어 제어가 불가능하다. 디지털 크라운이나 심박 센서, GPS 등에 접근이 불가능하다(디지털 크라운은 테이블 뷰를 추가하면 자동적으로 적용). 하지만 Apple Watch 기본 앱들 중에는 해당 하드웨어에 접근하는 앱들이 있다.
  • 음성을 인식하여 텍스트를 입력하는 것은 가능하지만 음성을 녹음할 수는 없다.
  • 뷰를 겹치게 배열하는 것이 불가능하다.
  • 제스처 인식에 대한 제어가 불가능하다.
  • Force-Touch에 대해선 메뉴를 보여주는 것 외엔 다른 기능을 실행할 수 없다.
  • 사용자가 Apple Watch를 차고 있고 아이폰이 꺼져 있는 상황에서만 Apple Watch에서 알림을 보여준다.
  • 특정 알림만 Apple Watch에서 보여지게 할 수는 없다. 모든 알림은 기본적으로 Apple Watch에서 보여준다.

라인에서의 Apple Watch 대응

라인에서 Apple Watch에 대응한 부분은 Custom Notification과 Watch App이다. 먼저 Custom Notification은 아래와 같은 모습이다.

Custom Notification

<JP_1

사용자가 텍스트, 사진, 스티커 알림을 받은 경우 해당 콘텐츠를 알림에서 바로 보여준다. iOS 앱의 경우 단순히 스티커를 받았다거나 사진을 받았다는 알림을 텍스트로 받기 때문에 내용을 확인하려면 앱을 기동시켜야 하는데 Apple Watch를 사용하고 있는 사용자는 바로 확인할 수 있다. 다른 메시지의 경우 텍스트 메시지처럼 보여지게 하였다. 텍스트가 너무 긴 경우 화면이 잘리기 때문에 텍스트의 최대 길이도 3줄로 제한했다.

이미지 보여주기

payload의 정보만으로 스티커 이미지나 사진 이미지를 보여주는 것은 이전에도 언급했었던 openParentApplication 함수를 사용했었다. 느리다는 것을 알고 있었지만 결과물을 빠르게 만들어야 했기 때문에 일단 이 방법으로 처리하고 나중에 개선하는 쪽으로 방향을 잡았다. 하지만 많이 느려서, Apple Watch가 출시되기 직전에 이 부분에 대한 개선을 요구받았다.

답장하기 버튼

사용자가 메시지를 받은 경우에 대한 알림에 대응하기로 해서 하단에 답장하기 버튼을 넣으려고 했었는데 이 부분이 그렇게 간단하지 않았다. 알림 하단에 버튼을 넣는 것은 그 알림이 버튼을 보여줄 수 있는 알림인지를 분기 처리를 해야 했는데 이 분기를 위해선 알림 payload를 수정해야 했다. 그러면 서버 측의 대응 및 실 서버 배포를 해야 했다. 서버 측에게 도움을 요청해도 다른 문제가 있었는데, 아이폰에서 보여지는 알림에도 버튼이 노출될 수 있는 것이었다. 이건 Apple Watch를 사용하는 사람이라고 해도 Apple Watch가 가끔 아이폰과 멀리 떨어져 있을 때가 있기 때문에 그때를 위한 대응이라고 한다. Apple Watch 작업이 아이폰에 영향을 미치기 때문에 기획 측의 확인을 받아야 했는데 전체적인 프로세스가 무거웠고 이슈도 있을 것 같아서 1.0에는 답장하기 버튼을 넣지 않았다. 디자인 측과 기획 측에서도 왜 넣지 않았는지에 대해 많은 문의를 받았다. 1.1에 바로 넣겠다고 답변을 하곤 했다.

테스트

알림은 특히 개발이 힘든 부분이었다. 실제 기기에서 테스트를 할 수 없기 때문이었다. 시뮬레이터에서 테스트하는 환경은 알림이 왔다는 상황을 가정하고 작업하는 수준이었는데 홈 스크린에도 진입하지 못했으므로 앱을 실행하는 도중에 알림이 오거나 알림을 보는 도중에 알림이 오거나, 알림을 닫거나 하는 부분은 확인할 수 없었다. 그렇기 때문에 이 부분은 실제 기기로 테스트할 수 있기 전에는 대응하는 것이 불가능했다.

Watch App

Watch App은 아래와 같이 구현했다. JP_12 Apple Watch에서의 라인은 사진에서처럼 읽지 않은 메시지를 읽고 답변할 수 있도록 되어 있다. 첫 화면에서 읽지 않는 메시지가 존재하는 대화방 리스트가 보여지고 대화방에 들어가서 읽지 않은 메시지를 읽고 답변하기 버튼을 눌러서 답변을 할 수도 있다. 답변은 스티커 또는 스티콘만 가능한데 스티콘을 보내더라도 스티커 버전의 스티콘이 전송된다. 대화방을 나가면 해당 대화방은 읽음 처리되어 대화방 리스트에서 제외된다.

대화방 리스트 불러오기 (데이터베이스 갱신)

대화방 리스트를 불러오는 부분에서 조금 큰 이슈가 있었는데, Apple Watch에서 알림을 받고 바로 대화방 리스트로 진입하면 iOS 앱에서 대화방 리스트에 대한 데이터베이스를 갱신하지 않았기 때문에 새로 도착한 메시지에 대한 대화방을 보여주지 못하는 문제였다. 그래서 Watch에서 대화방 리스트에 진입하면 대화방 리스트를 가져오는 중이라는 메시지가 나타나고 이때 데이터베이스를 갱신한다. 이때의 로딩 화면은 Apple Watch의 기본 화면과 최대한 비슷하게 구성하여 사용자가 위화감을 느끼지 않도록 하였다. 대화방 리스트에 대한 데이터베이스를 갱신하는 부분은 이전에 언급했던 openParentApplication 함수를 썼는데, 느린 것을 알지만 아이폰이 실행 중인 경우에도 데이터베이스를 일치시키려는 목적도 있었고 무엇보다 이 부분을 Apple Watch만을 위해 새롭게 구현하는 데 시간을 많이 들였다. 로딩 화면을 추가해서 그런지 크게 딜레이가 된다는 생각이 들지 않았다.

대화방 구현

대화방 안에선 사실 큰 문제가 없었지만 대화방 내부를 구현하는 것 자체에 시간을 많이 들여야 했고, 워낙 중요한 부분이라 디자인 이슈가 많이 있긴 했지만 새롭게 기술 조사를 해야 하는 부분은 없었다. iOS 앱에서의 대화방과는 달리 Apple Watch에서는 같은 사용자가 1분 이내에 연속적으로 대화를 보냈을 경우 프로필 사진이나 대화를 보낸 시간, 말풍선 꼬리를 생략했다. 작은 화면에서 많은 정보를 보여줄 수 없었기 때문에 결정한 디자인이었는데 결과적으로 보기가 좋았지만 이 부분에 있어서 버그가 다소 있었다. 모두 사소한 버그들이었지만 고치는 데 시간이 좀 걸렸다.

스티커 / 스티커 목록 불러오기

스티커나 스티콘을 전송하는 부분에 있어서는 큰 이슈가 있었는데, 이번에도 속도 이슈였다. 한꺼번에 많은 스티커나 스티콘 이미지를 보여줘야 했기 때문에 속도가 너무 느렸다. 이 속도 이슈에 대해선 Apple에 출장을 갔던 당시 한 번 도움을 받았는데 당시에 받은 도움은 아래 함수를 사용하라는 것이었다.

[WKInterfaceImage setImageNamed:]

나는 [WKInterfaceImage setImage:[UIImage imageNamed:]] 함수로 이미지를 설정해주고 있었는데 이 둘 사이에는 큰 차이가 있었다. [WKInterfaceImage setImageNamed:] 함수를 사용하면 Apple Watch 내에 저장된 이미지의 경우 바로 이미지를 보여주지만 [UIImage imageNamed:] 함수를 사용하는 순간 Apple Watch 내에 저장되어 있던 이미지라고 해도 해당 이미지가 아이폰으로 전송되었다가 다시 Apple Watch로 전송되기 때문에 현저하게 느려진다. 이 부분을 조언 받은 대로 수정하니 속도가 아주 많이 개선되었다.

속도가 개선되었음에도 불구하고 한 번에 보여주는 이미지의 개수가 200개 정도로 아주 많아서 여전히 느렸는데 이것은 이미지를 30개 정도로 나눠서 리스트 하단의 이미지는 몇 초 후에 불러오는 방식으로 해결하였다. 이러한 방법을 쓰면 사용자가 스티커 리스트로 진입해서 빠르게 스크롤하면 이미지가 조금 후에 표시되긴 하지만 iMessage에서도 비슷하게 처리한 것을 볼 수 있었고 실제로 사용하는 느낌이 별로 이상하지 않았다. 짧은 시간 뒤에 곧 표시되므로 로딩하는 중이라는 느낌도 들었다.

성능 테스트 툴

Apple Watch 성능 테스트 툴은 없었다. 현재로선 개발자가 사용하면서 어떤 기능이 얼마나 걸리는지 시간을 재는 정도가 유일한 방법이라고 한다. 메모리 체크도 할 수 없었다. 다만 내가 만든 클래스들의 메모리가 잘 해제되는지는 잘 확인하였다. 특히 테이블 뷰는 iOS와 달리 cell을 재활용하는 개념이 아니기 때문에 cell의 메모리가 필요한 때에 잘 해제되는지 확인했었다. 그것 말고는 사용을 해보면서 앱이 크래쉬되는 경우를 찾아야 했다.

Apple Watch에 대응하면서 느낀 점

테스트하면서 개발할 수 있는 것도 아니었으며 기존에 존재하던 디바이스도 아니었기 때문에 Apple Watch 개발 스펙을 정확히 아는 게 무엇보다 중요했다. 문서를 꼼꼼히 읽으려고 노력했는데 어떤 기능이 Apple Watch 스펙으로 인해 구현이 불가능하다고 생각되는 부분은 대부분 포럼을 적극적으로 활용하여 애매한 부분이 없도록 하였다.

첫 번째 SDK이기 때문에 생각보다 할 수 있는 것이 별로 없었다. Apple Watch 내에 화려한 하드웨어가 많이 내장되어 있음에도 불구하고 3rd party의 앱이 접근할 수 없는 것들이 많아서 조금 답답한 면이 있었다. 심지어 Apple Watch 내장 앱에서 사용하고 있는 UI 효과 중에 3rd party 앱은 쓸 수 없는 효과도 있었다. 그러한 부분들은 내가 조사를 하지 않은 부분이 있는 것인지 헷갈려서 매번 확인해야 해서 조금 번거로웠다. 안정적으로 SDK를 조금씩 공개하는 것일꺼라고 생각하면 이해할 것도 같았지만 두 번째 SDK가 정말 많이 기다려지긴 한다.

iOS 개발은 항상 문서가 잘 정리되어 있기 때문에 개발하기에 편한 부분이 있다. 또한 Watch 대응을 하기 전에 위젯을 만들어본 적이 있는데 아이폰과 연동하는 부분은 위젯과 원리가 같았기 때문에 조금 쉽게 적응했던 것 같다. 하지만 성능이나 메모리 테스트 툴이 없어서 열심히 확인을 했음에도 불구하고 실제로 배포가 된 후가 조금 걱정이 된다. WWDC(Worldwide Developers Conference)가 곧 열릴 예정인데 Apple Watch 개발 환경이 많이 개선되었으면 하는 바람이다.