Edited at

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

More than 3 years have passed since last update.

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

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


サンプル実行方法

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

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

[Hardware] > [External Displays]

> [Apple Watch - 38mm] または [Apple Watch - 42mm] を選択

で、Apple Watch サイズの外部ディスプレイシミュレータが起動するので、この状態で WatchKit Extension をアクティベートすると、外部ディスプレイの方にUIが表示されるようになります。


実装手順

テキストを表示するだけの超シンプルアプリを実装してみます。所要時間約1分、プログラミング不要。


1. Extensionターゲット作成

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

[File] > [New] > [Target]

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


2. UIをいじる

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


3. ビルドしてみる

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


全API解説

WatchKit Framework Reference を見てみるとクラスの数はなんとたったの15個。自分はもっと一大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 は以下の3つだけ。

- (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すらなく、実処理はiOSアプリ側に持たせて Watch側はシンプルに表示するだけっていう何ともシンプルなフレームワーク。。これでどんな新しい体験が生み出せるのか正直まだイメージできてませんが、WatchKit のお仕事お待ちしております!