WatchKitとは
WatchKitとはAppleが来年発売予定のApple Watchのアプリケーションを開発するためのフレームワークです。 まだBeta版としての公開ですが少しさわってみました。
簡単に説明するとApple Watchは単体ではあまり意味がなく、必ずユーザのiPhoneとペアで動く仕組みです。 iOS8からの新機能 App Extensionの1つとして位置づけられています。
Apple Watch側は非常に単純なViewの表示のみを担い、実際の処理のロジックはWatchKit Extension側に実装されます。 公開されているApple Watchの機能一覧を見てもViewに関するものがほとんどです。
実際に動かしてみる
Xcode6.2で新規プロジェクトを作成して、TargetでWatchKit Appを選択して追加します。
これでWatch App側にViewのオブジェクトを配置すればApple Watchに表示されるアプリは動作します。
今回はWatch App側にボタンを配置してWatchKit Extensionを通じてiPhone側の親アプリにカウントを表示するアプリで動作確認します。
Watch App側には「Count Up」「Count Down」ボタンを配置し、カウントを表示するラベルを配置しました。
WatchKit Extension側のコードは以下のようにしています。ちなみに今回はSwiftで実装してみました。
@IBOutlet weak var countLabel: WKInterfaceLabel!
var count = 0
@IBAction func countDown() {
if(count > 0) { count– updateCountLabel() }
}
@IBAction func countUp() { count++ updateCountLabel() }
func updateCountLabel() { countLabel.setText(String(count))
//iPhone側の親アプリに値を連携 WKInterfaceController.openParentApplication([“content”: String(count)], reply: {obj, error in NSLog(“return from %@”, obj[“from”] as String!) })
}
WatchKit は App Extensionの1つなので、データの受け渡しはApp Group によって定義される共有領域「shared container」を使わなければいけないかなと 思っていましたが、
+ openParentApplication:reply:
という値を直接渡して親アプリを起動する関数が用意されていました。
起動される親アプリ側にはApp Delegateに以下の関数を実装します。
– (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply
親アプリ側のコードは以下のようにしています。
func application(application: UIApplication!, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]!, reply: (([NSObject : AnyObject]!) -> Void)!) {
var count: String = userInfo["content"] as String!
var appDelegate = UIApplication.sharedApplication().delegate as AppDelegate var vc:ViewController? = appDelegate.window?.rootViewController as? ViewController vc?.countLabel.text = count
reply([“from”:”watchkitsample”]) }
これでApple Watch側でそれぞれのカウントボタンをタップすると親アプリが起動し、 Apple Watch側のカウントと親アプリ側のカウントの表示が同期します。
今回はWatchKitシリーズ第1回だったのでまず簡単な動作確認をテーマにしてみました。 次回以降もApple Watchの特殊なUIやNotificationなど詳しく学習していくつもりです。
Comments