LoginSignup
7
7

More than 5 years have passed since last update.

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

Posted at

目次

  • やりたいこと
  • 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に引き継ぐ

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7