ObjecTips

Swift & Objective-C で iOS とか macOS とか

WatchKit のドキュメントに書かれていない事

ドキュメントを読んだ後、実際にコードを書いてみて気付いた事がいくつかあった。

画面読み込み中のインジケーター

f:id:Koze:20150425063204p:plain

完全に静的な画面を表示するだけだとインジケーターは表示されない。
自前の InterfaceController クラスで IBOutlet で何かを接続するとそのコントローラが表示される際にインジケーターが表示される。IBOutlet で接続するだけで値を何も設定しない場合でもインジケータは表示される。

セパレータは縦にも表示できる

f:id:Koze:20150425064139p:plain

WKInterfaceSeparator 自体に縦横を制御するプロパティがあるわけではなく、自動的によしなに縦横が適用される。

WKInterfaceDevice の preferredContentSizeCategory

@property(nonatomic,readonly,copy)  NSString *preferredContentSizeCategory;

これを以下のようにログ出力してみたところ

38mm では UICTContentSizeCategoryS
42mm では UICTContentSizeCategoryL
となった。
それぞれ framework で定義されているの定数としては
UIContentSizeCategorySmallUIContentSizeCategoryLarge
にあたる。

WKInterfaceObject の interfaceProperty

@property(nonatomic,readonly,copy) NSString *interfaceProperty;

WKInterfaceController のサブクラスに IBOutlet で接続した際のコントローラ側のプロパティ名が取得できる。
例えば IBOutlet で textLabel というプロパティ名で接続すれば interfaceProperty@"textLabel" という文字列が取得できる。

これがあるとどういったシーンで便利かはまだ不明。

アニメーション絵文字

WKInterfaceControllerWKTextInputMode のヘッダのコメント部分を見ると

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ファイルが簡単に取り出せる。

f:id:Koze:20150427023829g:plain
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 の CFBundleShortVersionStringCFBundleVersion は親アプリのバージョンと合わせておく必要がある。

WatchKit Extensionの CFBundleShortVersionStringCFBundleVersion は親アプリのバージョンと異なっていてもビルドは通るし 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 の CFBundleShortVersionStringCFBundleVersion も親アプリのバージョンと合わせておく必要がある。

UDID

Xcode のオーガナイザで iPhone にペアリングしている Apple Watch の UDID を確認する事ができる。
Apple Watch の設定アプリと iPhoneApple Watch 設定アプリでは

  • モデル
  • 容量
  • OSバージョン
  • シリアル番号
  • Wi-Fiアドレス
  • Bluetoothアドレス
  • SEID

などが確認できるけど UDID はオーガナイザからしか確認できない。

f:id:Koze:20150429140432p:plain

Watchアプリの開発の際、プロビジョニングの設定周りで XcodeFix Issue をすると Xcode は dev center に Apple Watch の UDID を自動で登録してくれる。もしこれを手動で登録する場合にはオーガナイザで UDID を調べて登録する。