先週の WWDC15 にて watchOS 2 が発表され、ついに待望のネイティブ動作する Apple Watch アプリがつくれるようになりました。それに伴い、WatchKit には多くの機能が追加され、ClockKit や WatchConnectivity 等の新しいフレームワークも登場しました。さらにいえば、従来フレームワークもウォッチ側で動作するようになったことから、これらもある意味新APIであるといえます。*1
そんなわけで、数が少なすぎてびっくりした 初代 watchOS の発表時とは打って変わって、今回は遥かに多くの「新機能」があります。どんな機能が追加されたのかは既に多くのキーノートのまとめ記事などで紹介されてはいますが、新しいAPIはどう使うのか、実際に何がどこまでできるのか、快適に動作するのか、といった具体的なところが、英語のドキュメントや動画や記事をながめているだけだと正直あまりよくわかりません。やはり実際にコード書いて動かしてみるのが一番わかりやすい、ということで、
watchOS 2 の新機能のサンプルコード集『watchOS-2-Sampler』
をつくりました。オープンソースなのでどなたでも GitHub から clone してお試しいただけます。
※このアプリで、とあるアメリカのハッカソンにて賞をいただきました!それについては最後に。
Contents
今のところ14個のサンプルが入っています。まだまだ少ないですが、随時追加していく予定です。あと今回から Swift で書いています。機能追加のプルリク大歓迎です!
アイコンデザインはいつものように okazu 氏にお願いしました!
※各サンプルのスクリーンショットはAppleの正式リリースまで控えます。代替として、WWDCの動画などAppleによる公開資料からの画像を一部用いています)
Accelerometer
Core Motion を用いて加速度センサの値を取得するサンプル。
Gyroscope
Core Motion を用いてジャイロスコープの値を取得するサンプル。
Pedometer
CMPedometer を用いて歩数や距離、階の昇り降り情報を取得するサンプル。
Heart Rate
HealthKit を用いて心拍数を取得するサンプル。
Table Animations
WKInterfaceTable のセル(row)をアニメーション付きで insert / remove するサンプル。`insertRowsAtIndexes:withRowType:`, `removeRowsAtIndexes:` メソッドを利用。
Animated Properties
`animateWithDuration:animations:` メソッドを利用して、アニメーションで拡大縮小やフェードイン/アウト、移動(実際には Alignment)を行うサンプル。
Audio Rec & Play
`presentAudioRecordingControllerWithOutputURL:preset:maximumDuration:actionTitle:completion:` メソッドを利用して音声を録音する UI を表示し、
(WWDCのセッション動画より)
録音したファイルを `presentMediaPlayerControllerWithURL:options:completion:` メソッドを利用して再生するサンプル。
(WWDCのセッション動画より)
参考記事:watchOS 2 のオーディオ録音、再生機能を利用する - Qiita
Picker Styles
WKInterfacePicker の全スタイル(List, Sequence, Stack)を試せるサンプル。
(WWDCのセッションスライドより)
Taptic Engine
WKInterfaceDevice の `playHaptic` メソッドに指定できる全タイプ(WKHapticType)を試せるサンプル。
ちなみに WKHapticType は次のように定義されています。
enum WKHapticType : Int { case Notification case DirectionUp case DirectionDown case Success case Failure case Retry case Start case Stop case Click }
Alert
`presentAlertControllerWithTitle:message:preferredStyle:actions:` メソッドで指定できる全アラートスタイル(WKAlertControllerStyle)を試せるサンプル。
ちなみに WKAlertControllerStyle は次のように定義されています。
enum WKAlertControllerStyle : Int { case Alert case SideBySideButtonsAlert case ActionSheet }
Animation with Digital Crown
デジタルクラウンの回転に合わせ、WKInterfacePicker にセットしたアニメーションを表示するサンプル。`setCoordinatedAnimations` メソッドを利用。
(WWDCのセッションスライドより)
Interactive Messaging
iPhone と Apple Watch で相互にメッセージをやりとりするサンプル。Watch Connectivity フレームワークを利用。
Open System URL
WKExtension の `openSystemURL:` メソッドを利用して、電話およびSMSアプリを開くサンプル。
Audio File Player
WKAudioFilePlayer を利用してオーディオファイルを再生するサンプル。
参考記事:watchOS 2 のオーディオ録音、再生機能を利用する - Qiita
Known Issues
ハッカソンでガッと仕上げたこともあり、既に入っているサンプルも以下の点がまだ未完成です。
- Audio Rec & Play
- 実機での録音ができない。シミュレータでは可
- 録音音声をshared containerに保存する必要がある。そうするとOSSとして試すハードルが上がってしまうのが悩みどころ。。
- HeartRate
- 完全に未完成。いつかやります
- Open System URL
- Phoneを押しても電話アプリが起動しない
- ドキュメント通りにやってるつもりだけど・・・?
- `sms:` は同様のやり方で動作している
あと、ジャイロは実機でもとれてませんが、実装は正しいと思ってるので一応サンプルとしては成立してるのかなと(実装間違ってたらプルリクください!)
ClockKit、WatchConnectivity は試してサンプルを入れる予定です。(2015.6.16追記:Watch Connectivity はひとつ追加しましたが、引き続きファイル送信等も試して追加する予定)
サンフランシスコで開催された Watch Hackathon で入賞しました!
WWDC会期中にドキュメント読みつつちまちまサンプル実装はしてたのですが、WWDC終了直後の週末に Apple Watch のハッカソン がタイミングよくサンフランシスコで開催されていたので、そこでいったん仕上げて GitHub で公開し、緊張しつつ英語でプレゼンしたところ・・・なんと!賞をいただいてしまいました!!!!
コミュニティへの貢献を評価していただけたようです。英語力はプレゼンター随一の下手さだったと思いますが、ちゃんと伝わったようで、プレゼン直後、いろんな人が寄ってきてくれて「あんた、ナイスだ!」「7、8の頃から見てるよ、会えて嬉しいよ」みたいなことを言っていただけたのがとても嬉しかったです。
こんなときの挨拶用にと iOS Sampler ステッカーをつくって持っていったのが役立ちました。
あと少し残ってるので、欲しい方はお声がけください!(iOS 9 が出るまでしか使えないデザインなのでw)
関連記事:
FAQ: iOS-9-Sampler も出すの?
今回はたまたまハッカソンがあったのと、watchOS 2 のサンプルは基本的なものが多いので、早く出すことにこそ意味があるだろう、ということで即時公開しましたが、iOS-9-Sampler はいつも通り正式リリースに合わせて公開する予定です。
そんなわけで、引き続き watchOS-2-Sampler をよろしくお願いします!
こちらもどうぞ
- iOS 8 の新機能のサンプルコード集『iOS8-Sampler』を公開しました - Over&Out その後
- iOS 7 の新機能のサンプルコード集『iOS7 Sampler』を公開しました。 - Over&Out その後
*1:たとえば watchOS 1 から WatchKit Extension では Core Motion は使えましたが、それは単にiPhone側の機能を利用するだけのものなので「新機能」であるとはいえません。が、watchOS 2 ではウォッチ側で動作するようになったので、watchOS にとっては「新機能」です。実際、WWDC 以降、iOS Developer Library とは別に watchOS Developer Library がオープンし、watchOS 側で利用できるフレームワーク群のドキュメント類が別途管理されるようになっています。(Mac。には以前からあった Core Image が、iOS では 5 から新機能として加わった、みたいなもの。・・・というたとえは余計わかりにくいでしょうか・・・?)