Apple Watch、新たな地平を拓く。

こんにちは。LINE iOS開発を担当しているRoyです。Apple Watchの公開に足並みを揃え、Apple Watchの機能についての簡単なレビューとApple Watch向けのアプリ開発、そしてLINEでのApple Watch対応について紹介したいと思います。

(注:現在はLINEのApple Watch向けアプリは非公開です)

Apple Watch

Apple Watchは、2014年9月9日の発表会ではじめて公開されました。この日、iPhone6、iPhone6+、Apple Payが次々と紹介され、終盤のOne More Thingで38mm42mmサイズのWatch、Watch Sport、Watch Editionの3種が発表されました。 Apple Watchではユーザーの動きの測定はもちろん、iPhoneで受信した通知も確認できます。また、Apple以外の3rd party企業のためのSDKも公開されました。1

Apple Watchには、タッチスクリーンとデジタルクラウン、サイドボタンがあります。右サイドのデジタルクラウンでは画面をスクロールしたり、ズームイン/ズームアウトでき、そのすぐ下のサイドボタンでは、よく連絡を取る友達を表示することができます。時計の下部にはユーザーがApple Watchを着けているかどうかをチェックしたり、ユーザーのバイオ情報を確認できるセンサーが付着されています。スピーカーと振動センサーが内臓されていて、通知が届くとアラーム音が聞こえたり、振動で感じ取ることができます。 2Apple-Watch-Heart-Rate-Sensor-337x400

Apple Watch向けアプリの開発

Apple Watch向けのアプリを開発するには、iOSアプリでWatch extensionを追加します。extensionの中にはウィジェットのようにひとつの iOSアプリに複数の extensionを生成できるものもありますが、Watch extensionはひとつのiOSアプリにひとつだけ追加できます。Apple Watch extensionを追加すると3つの機能を作成することができます。この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のすべてのコードは、iPhoneで実行されます。Apple Watchはコードを実行させません。Apple Watchでは、iPhoneでコードが実行され描画する内容をApple Watchで表示する役割をしています。なお、Apple WatchではApple Watchで使う画像のリソースやストーリーボードといったものが保存されます。このため、iPhoneから遠く離れていると3rd partyアプリは何も実行されません。この上、Apple Watchでコマンドを実行後にiPhoneとのペアリングが切断された場合は、次の段階が実行されないままになります。このため、Apple WatchはiPhoneのApple Watch関連コードを表示するスクリーンであると言えます。 6

iOSアプリとのデータ共有は、データベースやユーザー設定などのデータ、またはファイルで可能です。また、動的にApple WatchからiOSアプリを立ち上げデータをやり取りすることも可能です。openParentApplicationという関数で本体を立ち上げ、本体にクエリを送ると本体ではその応答をApple Watchに送ることができます。非常に便利な関数ですが、本体を立ち上げなければならないため「遅い」という致命的な欠点があります。Apple Watchは、腕を上げたままずっと見ていなくてはならないため、少しでも遅延が生じると不便だと感じてしまいます。このため、極力使用しないことを推奨します。しかし、スケジュールIssueがあったり、本体と通信しないでApple Watchのコードだけで実装することが非常に困難な状況であれば、最小限で使用すべき状況もあります。

Apple Watchでできること、できないこと

  • ハードウェアに対するコントロールが不可能です。デジタルクラウンや心拍センサー、GPSなどにアクセスできません(デジタルクラウンは、テーブルビューを追加すれば自動的に適用される)。しかし、Apple Watchの基本アプリの中ではこれらのハードウェアにアクセスしているアプリがあります。
  • 音声を認識してテキストを入力することは可能ですが、録音はできません。
  • ビューを重ねて配列することはできません。
  • ジェスチャー認識に対するコントロールが不可能です。
  • Force-Touchに対しては、メニュー表示以外の他の機能は実行できません。
  • ユーザーがApple Watchを着けていて、iPhoneの電源が切れている状態でのみApple Watchで通知を表示します。
  • 特定の通知だけApple Watchで表示するようにはできません。すべての通知は基本的にApple Watchで表示します。

LINEでのApple Watch対応

Apple Watch向けのLINEでの対応箇所は、Custom NotificationとWatch Appです。まずは、Custom Notificationについて紹介しましょう。

Custom Notification

JP_1 ユーザーがテキスト、写真、スタンプ通知を受信した場合に、その内容を通知で表示します。iOSアプリの場合は、スタンプや写真を受信した旨をテキスト通知で受信するため、内容を確認するにはアプリを起動させなければなりませんが、Apple Watchユーザーなら写真やスタンプをすぐに確認できます。その他のメッセージの場合は、テキストメッセージのように表示しました。テキストが長すぎると画面からはみ出てしまうため、テキストの長さも3行に制限しました。

画像表示

payloadの情報だけでスタンプや写真の画像を表示する際には、前述のopenParentApplication関数を使用しました。「遅い」という欠点を知っていながらも、迅速な対応が必要だったため、まずはこの方法で対処し追って改善することにしました。しかしながら、描画速度がひどく遅かったため、Apple Watchがリリースされる直前にこの問題に対する改善を求められました。

返信ボタン

ユーザーのメッセージ受信通知に対応することになり、下の方に返信ボタンを入れようとしましたが、これが思いのほか簡単なものではありませんでした。通知の下部にボタンを入れるには、その通知がボタンを表示すべき通知であるかどうかで分岐処理する必要がありますが、分岐処理のためには通知payloadを修正しなければなりません。そうなると、サーバー側の対応と実サーバーのデプロイが必要になります。また、iPhoneの通知表示にもボタンが表示される可能性があるという問題もありました。これは、Apple WatchユーザーであってもApple Watchが時々iPhoneと遠く離れる場合のための対応だといいます。Apple Watchのための作業が本体に影響を及ぼすため、企画部門の確認をとる必要がありましたが、全体的にプロセスが重く問題もありそうだったため、1.0では返信ボタンを入れないことにしました。デザインや企画部門からも返信ボタンを入れない理由について多くの質問がありましたが、1.1バージョンで対応するとの返信をしていました。

テスト

通知は、特に開発が難しい部分でした。実際のデバイス上でテストができなかったからです。シミュレータでのテスト環境では通知が届いた状況を想定して作業を行いましたが、ホームスクリーンへ進めなかったため、アプリの起動中に通知が届いたり、通知を閲覧中に別の通知が届いたり、通知を閉じたりする状況に対しては確認できませんでした。このため、このような競合条件については実際のデバイスを入手してテストできるようになるまでは対応できませんでした。

Watch App

Watch Appは、下記のように実装しました。 JP_12 Apple WatchでのLINEは上記写真のように未読のメッセージを読み、返信できるようになっています。トップ画面で未読メッセージのあるトークルームリストが表示されます。トークルームに入って未読メッセージを読み、返信ボタンをタップして返信することもできます。返信はスタンプ、またはスタンプアイコンのみ可能ですが、スタンプアイコンを送ってもスタンプバージョンのスタンプアイコンが送信されます。トークルームから出ると、そのトークルームは既読となりトークルームリストから消えます。

トークルームリストの呼び出し(データベース更新)

トークルームリストを呼び出す部分に少し大きな問題がありました。Apple Watchで通知を受信してすぐにトークルームリストに進むと、iOSアプリでトークルームリストのデータベースを更新しなかったため新着のトークルームが表示されない問題です。このため、Apple Watchでトークルームリストに進むとトークルームリストを取得中というメッセージが表示され、このときデータベースを更新します。このときの読み込み画面は、Apple Watchの基本画面とできるだけ同じように構成してユーザーが違和感を感じないようにしました。トークルームリストのデータベース更新は、前述のopenParentApplication関数を使いました。「遅延」問題を承知の上、本体が実行中の場合にもデータベースを一致させる目的もありましたし、何よりもこの部分をApple Watchだけのために新しく実装するのにたっぷりと時間をかけました。読み込み画面を追加したせいか大きな遅延は感じられませんでした。

トークルーム実装

トークルーム内には大きな問題はありませんでしたが、トークルーム内部を実装すること自体にたくさんの時間を費やさなければなりませんでした。トークルームはとても重要な部分であるためたくさんのデザインIssueはあったものの、新しい技術調査などが必要ではありませんでした。iOSアプリのトークルームとは違ってApple Watchではひとりのユーザーが1分以内に連続的にトークを送信した場合にはプロフィール写真やトーク送信時刻、吹きだしのしっぽを省略しました。小さな画面では多くの情報を表示できないため決定したデザインでしたが、結果的に見栄え良く仕上がりましたが、多少のバグがあり、些細なバグではありましたが修正するのに少々時間がかかりました。

スタンプ/スタンプリスト呼び出し

スタンプやスタンプアイコンの送信においても遅延問題がありました。一度に多くのスタンプやスタンプアイコン画像を表示しなければならなかったため、描画の速度が遅すぎました。この問題は、Appleのドキュメントで速度改善のために推奨されている下記の関数を使って解決しました。

[WKInterfaceImage setImageNamed:]

この関数を使用するまでは、[WKInterfaceImage setImage:[UIImage imageNamed:]]関数で画像を設定していましたが、ここには大きな違いがありました。[WKInterfaceImage setImageNamed:]関数を使うとApple Watch内に保存されている画像ならすぐに表示できますが、[UIImage imageNamed:]関数を使うと、すでにApple Watch内に画像が保存されているにも関わらず画像をiPhoneに転送し、それからまたApple Watchに送られてくることになるため、描画速度は著しく遅くなります。この部分を修正して遅延問題を大きく改善することができました。

しかし、改善にも関わらず一度に表示する画像の量が約200件と非常に多かったため、依然として描画速度は遅いままでした。この問題は、一度に呼び出す画像を30件くらいに分け、リストの下の画像は数秒後に呼び出す方法で解決しました。この方法を使うと、ユーザーがスタンプリストへ進み素早くスクロールしたときに画像が少し遅れて表示されるものの、特に違和感を感じることはありませんでした。表示されるまでの待ち時間が短いため、読み込み中のような感じもありました。

性能テストツール

Apple Watchの性能テストツールというものはありませんでした。現状としては開発者が使ってみてどの機能がどれくらいの時間が掛かっているかを計る程度の方法しかないとのことです。メモリチェックもできませんでした。ただ、自分の作成したクラスのメモリがきちんと解除されているかについては、きちんと確認を行いました。特にテーブルビューは、iOSとは違ってcellを再利用する仕組みではないため、cellのメモリが必要なときにきちんと解除されているかを確認しました。その他は、使ってみながらアプリがクラッシュするケースを洗い出すしかありませんでした。

Apple Watchに対応につき感じたこと

テストしながらの開発もできず、以前にはなかったデバイスだったため、Apple Watchの開発仕様を正確に把握することが何よりも大事でした。ドキュメントをこまめに読むように心がけ、気になる点はフォーラムを積極的に活用して曖昧なところがないようにしました。

初回のSDKだったため、思ったよりできることがあまりなかったように思われます。Apple Watch内に多くの強力なハードウェアが搭載されているにも関わらず3rd partyのアプリがアクセスできるものはあまりなかったことが歯がゆくもありました。Apple Watchの基本アプリで使っているUI効果の中では3rd partyアプリでは使えない効果もありました。このような点については、公開している機能なのかどうかを毎回確認しなければならなかったので多少面倒なところもありました。今後安定的にSDKを少しずつ公開するのであろうと考えれば理解できないでもないですが、次回のSDKが本当に待ち遠しいかぎりです。

iOS開発は、いつもドキュメントがきちんとまとまっていて開発する際にとても助かっています。また、Watch対応の作業をする以前にウィジェットを作成した経験がありますが、本体との連携についてはウィジェットと同じ原理だったのでわりとすんなりと適応できたのでは、と思います。性能ツールやメモリテストツールがなかったので懸命に確認をしたにも関わらず、実際のリリース後が少し心配です。WWDC(Worldwide Developers Conference)がまもなく開催される予定ですが、Apple Watch開発環境に多くの改善があることを期待しています。