WatchKit
AppleWatch

【WatchKit】Glanceの情報によってWKInterfaceをかえる

More than 3 years have passed since last update.


目次


  • やりたいこと

  • 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を指定しておきます。


  1. firstPage

  2. secondPage

スクリーンショット 2015-04-19 13.06.51.png

スクリーンショット 2015-04-19 13.09.02.png


Glance上のコード


GlanceController.swift

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を切り替える処理を書いていきます。


InterfaceController.swift

    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が立ち上がります。


参考

WatchKitでHandoff

HandoffをつかってApple Watchの作業をiPhoneに引き継ぐ