目次
- やりたいこと
- storyboard
- Glance上のコード
- InterfaceControllerのコード
やりたいこと
WatchKitにはiOSのAppDelegateのように、アプリ全体を管理するクラスがないみたい(認識が間違っていたらご指摘ください)
なので、各Interfaceから他のInterfaceへ情報をどうやって渡すのだろうと思っていたらHandoffの機能を使えばそれが実現できるそうです。
今日はGlanceの情報によってWKInterfaceの画面を切り替える処理を調べてみました。
例えば、カウントダウンタイマーアプリを作りたいとして、
カウントダウン中、カウントダウン終了などのアプリの状態によって、GlanceからWKInterfaceを立ち上げた時のWKInterfaceを切り替えたいときはあるかと思います。
そんなときは、Handoffの機能を使うとGlanceの情報をWKInterfaceに渡せるそうです。
渡した後はWKInterfaceでどのInterfaceを表示するかを切り替えればOK
storyboard
下記のように二つのInterfaceがあるとします。
あとでWKInterfaceで切り替えの指定をするのでstoryboardでIdentifierを指定しておきます。
- firstPage
- secondPage
Glance上のコード
override func awakeWithContext(context: AnyObject?) {
super.awakeWithContext(context)
// Configure interface objects here.
updateUserActivity("com.personal-factory.watchHandoff.sample", userInfo: ["hoge":"test"],webpageURL :nil)
}
Glance上のコードです。WKInterfaceに渡したい情報を
- updateUserActivity:userInfo:webpageURL:
に渡して実行します。今回は["hoge":"test"]という辞書を渡します。
func updateUserActivity(_ type: String,
userInfo userInfo: [NSObject : AnyObject]?,
webpageURL webpageURL: NSURL?)
引数 | |
---|---|
type | アクティビティを受信側で判別するための文字列(activityType)を指定。逆DNS形式。空文字及びnil指定は不可 |
userInfo | 他のデバイスに渡す辞書式の情報。次の型が使用可能。NSArray, NSData, NSDate, NSDictionary, NSNull, NSNumber, NSSet, NSString. |
webpageURL | 活動を継続するためにブラウザにロードするためにWebページを含むURL。 URLのスキームは、HTTPまたはHTTPSでなければなりません。 |
InterfaceControllerのコード
Glanceから渡された情報によってstoryboardのInterfaceを切り替える処理を書いていきます。
override func handleUserActivity(userInfo: [NSObject : AnyObject]!) {
print(userInfo)
if let handleData = userInfo["hoge"] as? String{
if handleData == "test"{
WKInterfaceController.reloadRootControllersWithNames(["secondPage"], contexts: nil)
}else{
WKInterfaceController.reloadRootControllersWithNames(["firstPage"], contexts: nil)
}
}
}
- handleUserActivity:
をoverrideすると- updateUserActivity:userInfo:webpageURL:
で情報が渡されたときに実行される仕組みです。
class func reloadRootControllersWithNames(_ names: [AnyObject],
contexts contexts: [AnyObject]?)
Namesに指定したstoryboardのIdentifierのInterfaceが立ち上がります。