WatchKit のドキュメントに書かれていない事
ドキュメントを読んだ後、実際にコードを書いてみて気付いた事がいくつかあった。
画面読み込み中のインジケーター
完全に静的な画面を表示するだけだとインジケーターは表示されない。
自前の InterfaceController クラスで IBOutlet で何かを接続するとそのコントローラが表示される際にインジケーターが表示される。IBOutlet で接続するだけで値を何も設定しない場合でもインジケータは表示される。
セパレータは縦にも表示できる
WKInterfaceSeparator
自体に縦横を制御するプロパティがあるわけではなく、自動的によしなに縦横が適用される。
WKInterfaceDevice の preferredContentSizeCategory
@property(nonatomic,readonly,copy) NSString *preferredContentSizeCategory;
これを以下のようにログ出力してみたところ
38mm では UICTContentSizeCategoryS
42mm では UICTContentSizeCategoryL
となった。
それぞれ framework で定義されているの定数としては
UIContentSizeCategorySmall
と UIContentSizeCategoryLarge
にあたる。
WKInterfaceObject の interfaceProperty
@property(nonatomic,readonly,copy) NSString *interfaceProperty;
WKInterfaceController
のサブクラスに IBOutlet で接続した際のコントローラ側のプロパティ名が取得できる。
例えば IBOutlet で textLabel
というプロパティ名で接続すれば interfaceProperty
で @"textLabel"
という文字列が取得できる。
これがあるとどういったシーンで便利かはまだ不明。
アニメーション絵文字
WKInterfaceController
の WKTextInputMode
のヘッダのコメント部分を見ると
typedef NS_ENUM(NSInteger, WKTextInputMode) { WKTextInputModePlain, // text (no emoji) from dictation + suggestions WKTextInputModeAllowEmoji, // text plus non-animated emoji from dictation + suggestions WKTextInputModeAllowAnimatedEmoji, // all text, animated emoji (GIF data) };
アニメーション絵文字は GIF を使ってるらしい!
Apple Watch のメッセージアプリで送信したアニメーション絵文字を iPhone の方で見ると元の GIFファイルが簡単に取り出せる。
face-yellow-loop-01.emoji.gif
現状 WatchKit の API ではイメージシーケンスしか扱えないので今後アニメーションGIFも扱えるようになるといいな。
Deployment Target
プロジェクトの Deployment Target が指定されている既存プロジェクトに WatchKit Extension を追加してビルドすると
error: WatchKit apps must have a deployment target equal to iOS 8.2 (was 8.3).
というビルドエラーが出る場合がある。
(WatchKit App が iOS 8.2 以降が必要なのは分かるけど Deployment Target が iOS 8.2 以降ではなくて iOS 8.2 指定じゃないとエラーが起きるというのは何か変な気がする)
ターゲットの WatchKit App の Build Settings > iOS Deployment Target を iOS 8.2 に指定してやるとエラーが解消される。
WatchKit には iOS 8.3 で解消された位置情報取得に関するバグが存在するので
iOS 8.3 Release Notes
もし iOS 8.3 以降のみで動かしたい場合はiOSアプリの Deployment Target を iOS 8.3 にして、WatchKit App の Deployment Target は iOS 8.2 にすると良い。
CFBundleShortVersionString CFBundleVersion
既存プロジェクトに WatchKit App を追加してビルドすると以下の2つのエラーに遭遇する場合がある。
error: The value of CFBundleShortVersionString in your WatchKit app's Info.plist (1.0) does not match the value in your companion app's Info.plist (2.0). These values are required to match.
error: The value of CFBundleVersion in your WatchKit app's Info.plist (1) does not match the value in your companion app's Info.plist (2). These values are required to match.
WatchKit App の CFBundleShortVersionString
と CFBundleVersion
は親アプリのバージョンと合わせておく必要がある。
WatchKit Extensionの CFBundleShortVersionString
と CFBundleVersion
は親アプリのバージョンと異なっていてもビルドは通るし App Store の Validate も通るが、実際に App Store へアプリをサブミットした時に以下の warning が出る。
CFBundleShortVersionString Mismatch - The CFBundleShortVersionString value '1.0' of extension '<AppName>.app/PlugIns/<AppName> WatchKit Extension.appex' does not match the CFBundleShortVersionString value '2.0' of its containing iOS application '<AppName>.app'.
CFBundleVersion Mismatch - The CFBundleVersion value '1' of extension '<AppName>.app/PlugIns/<AppName> WatchKit Extension.appex' does not match the CFBundleVersion value '2' of its containing iOS application '<AppName>.app'.
よって WatchKit Extension の CFBundleShortVersionString
と CFBundleVersion
も親アプリのバージョンと合わせておく必要がある。
UDID
Xcode のオーガナイザで iPhone にペアリングしている Apple Watch の UDID を確認する事ができる。
Apple Watch の設定アプリと iPhone の Apple Watch 設定アプリでは
などが確認できるけど UDID はオーガナイザからしか確認できない。
Watchアプリの開発の際、プロビジョニングの設定周りで Xcode で Fix Issue
をすると Xcode は dev center に Apple Watch の UDID を自動で登録してくれる。もしこれを手動で登録する場合にはオーガナイザで UDID を調べて登録する。