WatchKit AppとAndroid Wear Appのアーキテクチャの違い

[Blogger](http://atnekomachi.blogspot.jp/2014/11/apple-watch-watchkit-appandroid-wear-app.html)に書いた内容をこちらにも転載。

# 2015-09-01追記: この記事の内容はwatchOS2には当てはまりません

watchOS2では、この記事で「iPhoneで動く」としているロジック部分もApple Watchで動作します。
ただしWatch AppとWatchKit Extensionが分かれている状況は維持されます。
以下の内容は、まー昔はこうだったんだなということでご理解ください。

# TL; DR

 　結論からいきますと、
* __Apple Watchではビューのみが動き、ロジックはiPhoneで動く。__
* 対する__Android Wearでは、Androidアプリとほぼ同じコードがガッツリ動く。__
 ということです。

　つまり、スマホ本体を置き忘れたことを時計が感知して知らせる、というようなアプリは、Android Wearならたくさん転がってますがWatchKit Appでは不可能っぽい。

# WatchKit AppはiPhone上で動く

　な・・・何を言ってるかわからねーと思うが（略）という感じですが事実なんです。

　Apple Watchでアプリを動かすためには、まずはiPhoneアプリが必要です。WatchKit Appは、ExtensionとしてiPhoneアプリにくっつけて配布する形になります。
　そしてiPhoneにApple Watchがつながっていると、Extensionの内容の一部がApple Watchにロードされるという仕組みのようです。

![watchkut_extension.png](https://qiita-image-store.s3.amazonaws.com/0/60348/de38945c-7bae-4297-10ac-89471ea54d6b.png)
出典：[WatchKit - Apple Developer](https://developer.apple.com/watchkit/)

　このときApple Watchにロードされるのはビューの部分のみ。Controllerやその他のロジックはiPhoneに残って、Apple Watchからの連絡を待ちます。
　Apple Watchに表示されたビューに対してユーザがなにか操作すると、その情報が無線でiPhoneに伝えられ、Controllerが反応するというわけです。

![app_communication_2x.png](https://qiita-image-store.s3.amazonaws.com/0/60348/801b2d36-944a-658b-2332-f1d23da5e1fe.png)
出典：[WatchKit Programming Guide](https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/WatchKitProgrammingGuide/DesigningaWatchKitApp.html#//apple_ref/doc/uid/TP40014969-CH3-SW1)

　いうなれば、Apple WatchはiPhoneの外部ディスプレイというか、シンクライアントのような動きをするわけですね。
# Android Wear AppはAndroid Wear上で動く

　これはあたりまえといえばあたりまえなのですが。
　Android Wearは、Androidと連携はするのですが、アプリのアーキテクチャ的には独立というか、対等な立場なんですよね。

　そもそもAndroid Wearは、小さいナリをしてますがあれもAndroidの一亜種としてできていて、Android WearアプリはほぼAndroidアプリと同じコードで動きます。
　AndroidアプリとAndroid Wearアプリはそれぞれが独立で動く。で、必要があるときにだけOSのAPIを使ってお互いにメッセージをやりとりする。という世界観になっているわけです。

　とはいえこちらのほうも時計であまりムチャをやることは考えていなくて、ビューとしての機能＋アルファは時計でやりつつ、メインの処理はAndroidの方に投げるという実装方法が推奨されています。
# 開発者がうれしいのはどちらか？

### WatchKit App vs. Android Wear App

 　できることが多いほうがうれしいに決まってんだろ！訴訟！という人はアンドロイダー向きかもしれません。
　少し書きましたが、しっかりした機能を求めるとなるとAndroid Wearの方も結局、重い処理を本体に移譲して結果を受け取るというパターンをとらざるを得なくなります。特にネットワークアクセスが必要な場合はかならずこのパターンになるので。

　そのあたりを隠蔽してしまってロジックの本筋だけ考えればいいようにしてくれるというのは、AppleっぽいというかiOSっぽい考え方だと思います。
　ただここまでスパッと割り切られると、ちょっとぐらい時計側で独立の処理が動く余地を残してくれてもよかったんじゃねえの・・・と思わないでもありません。

　あとは、このアーキテクチャの違いが電池の具合にどれだけ影響するかが見ものですね。

　また、Apple Watchには話題となった心拍センサをはじめいくらかのセンサがついているはずなのですが、そのデータをどうやって取得するのかは謎です。このアーキテクチャを見るに、iPhoneがApple Watchからデータを取ってくるような仕組みになるんですかねぇ・・・？

### WatchKitの通知 vs. Android Wearの通知カード

　Android Wearのいいところの一つに、普通のAndroidの通知を出すと、それがいい感じにAndroid Wear向けの通知カードに変換されて表示されるという点があります。

![notification_phone@2x.png](https://qiita-image-store.s3.amazonaws.com/0/60348/ec1f307a-6b43-69a4-9b93-0e08408842e9.png)
出典：[Android Developers](https://developer.android.com/training/wearables/notifications/index.html)

　WatchKitの仕組みで発表された通知機能のひとつ「Actionable Notification」は、動きかたは通知なのですがWatchKitで実装しないといけないのでひと手間増える感があります。iOSの普通の通知も、おそらくApple Watchにいい感じに表示されるんだろうとは思うのですが、もしそれがない場合は開発者にとってはちょっとめんどくさいですね。

# 雑感：超こまけぇApple Watchとユーザの器用さをなめているAndroid Wear
　アプリのアーキテクチャに関係ない話。

![aw_vs_aw.png](https://qiita-image-store.s3.amazonaws.com/0/60348/a4aece2e-8cd2-4b52-a87b-db1cca395794.png)
（出典：[WatchKit - Apple Developer](https://developer.apple.com/watchkit/)、[Android Developers](https://developer.android.com/training/wearables/notifications/creating.html)）

 　Apple WatchとAndroid Wearの画面を見比べると、Apple Watchには「どんだけユーザに細かい操作を求めんだ」Android Wearには「ユーザをゴリラかなんかと勘違いしとんのか」という正反対の感想が個人的にはでてきますが、みなさまはいかがでしょうか。

# で、どっちが勝つの？

アップルじゃないすかねえ〜？（鼻ほじ）