1分でつくれるAppleWatch対応アプリ & WatchKit 全API解説

Apple Watch の SDK である『WatchKit』がリリースされてたので、さっそくさわってみました。


![watchkit_.jpg](https://qiita-image-store.s3.amazonaws.com/0/3180/6beda573-7a1e-edaf-5176-8bd11f88ad53.jpeg)


※本記事は、Appleによる公開ドキュメント（ログイン不要領域にあるもの）の範囲で書いてあります。


##サンプル実行方法

何はともあれまずはサンプル実行。


iPhone6 シミュレータとかの並びに Apple Watch とかが来るのかなと思ってたので、一瞬サンプルをどう実行してよいのか面食らいましたが、シミュレータメニューから 

```
[Hardware] > [External Displays]
 > [Apple Watch - 38mm] または [Apple Watch - 42mm] を選択
```

で、<span class="deco" style="font-weight:bold;">Apple Watch サイズの外部ディスプレイシミュレータ</span>が起動するので、この状態で WatchKit Extension をアクティベートすると、外部ディスプレイの方にUIが表示されるようになります。


##実装手順

テキストを表示するだけの超シンプルアプリを実装してみます。<span class="deco" style="font-weight:bold;color:#FF0000;">所要時間約1分、プログラミング不要</span>。

###1. Extensionターゲット作成

プロジェクトをつくって、 

```
[File] > [New] > [Target]
```

から、Apple Watch を選択（テンプレートは Watch App のみ）します。


###2. UIをいじる

Interface.storyboard が生成されるので、Interface Controller Scene にとりあえずラベル（WKInterfaceLabel）でも置いてみます。


###3. ビルドしてみる

サンプル実行方法と同じように、実行すると、置いたラベルが表示されます。（スクショ載せられないのがもどかしい）


##全API解説

WatchKit Framework Reference を見てみると<span class="deco" style="color:#FF0000;">クラスの数はなんとたったの15個</span>。自分はもっと一大SDKが来ると思い「iOS8-Sampler」の流れで「WatchKit-Sampler」つくるつもりでいたので拍子抜けですが、せっかくなので全クラスをひと通り見てみます。


###WKInterfaceObject とそのサブクラス

WKInterfaceObject というクラスが全インターフェース系クラスのベースとなっています。（ざっくりいうと UIKit でいうところの UIView みたいなものかと）


以下、そのサブクラスである UIコンポーネント系クラス全11種です。

- WKInterfaceButton : ボタン
- WKInterfaceDate   : 日付 or 時間表示用ラベル
- WKInterfaceGroup  : 他のインターフェースオブジェクトのコンテナとなるクラス
- WKInterfaceImage  : 画像表示。アニメーションAPIも用意されている。
- WKInterfaceLabel  : ラベル
- WKInterfaceMap    : マップ
- WKInterfaceSeparator: セパレータ
- WKInterfaceSlider : スライダー
- WKInterfaceSwitch : スイッチ
- WKInterfaceTable  : テーブル
- WKInterfaceTimer  : カウントダウンタイマー表示用ラベル


それぞれ何ができるかは、上記の一言解説でだいたい想像つくと思いますが、ヘッダみると UIKit や MapKit の同じ位置づけのクラスとできることは結構違います（よりシンプル）。


###WKInterfaceController

インターフェースのコントローラクラス、ざっくり言ってしまえば UIKit でいう UIViewController みたいな位置づけのクラス。


###WKUserNotificationInterfaceController

WKInterfaceController のサブクラスで、追加されている API は以下の３つだけ。

```
- (instancetype)init;
- (void)didReceiveRemoteNotification:(NSDictionary *)remoteNotification withCompletion:(void(^)(WKUserNotificationInterfaceType interface)) completionHandler;
- (void)didReceiveLocalNotification:(UILocalNotification *)localNotification withCompletion:(void(^)(WKUserNotificationInterfaceType interface)) completionHandler;
```


リモート通知、ローカル通知を受け取ったときに呼ばれるメソッドが用意されているようです。


###WKInterfaceDevice

ウォッチ側のデバイス情報を管理するクラス。APIを見ると、

```
+ (WKInterfaceDevice *)currentDevice;

- (void)addCachedImage:(UIImage *)image name:(NSString *)name;
- (void)addCachedImageWithData:(NSData *)imageData name:(NSString *)name;
- (void)removeCachedImageWithName:(NSString *)name;
- (void)removeAllCachedImages;

@property(nonatomic,readonly) CGRect    screenBounds;
@property(nonatomic,readonly) CGFloat   screenScale;
@property(nonatomic,readonly,strong) NSLocale *currentLocale;
@property(nonatomic,readonly,copy)  NSString *preferredContentSizeCategory;
```


キャッシュする画像をここから管理できたり、スクリーンサイズやスケール、言語設定の情報等を取得できるようです。


##おわりに

ウォッチ側のセンサー値を取るAPIすらなく、<b>実処理はiOSアプリ側に持たせて Watch側はシンプルに表示するだけ</b>っていう何ともシンプルなフレームワーク。。これでどんな新しい体験が生み出せるのか正直まだイメージできてませんが、WatchKit のお仕事お待ちしております！

- [独立してから第3四半期目の実績まとめ - Over&Out その後](http://d.hatena.ne.jp/shu223/20141031/1415072499)