2015年

4月

17日

Apple Watch Personアプリ Watch -> iPhone App アプリ 情報更新

WKInterfaceControllerのopenParentApplication:reply:メソッドを使うことでiPhone側の親アプリを起動することができます。現在のところ、親アプリのみ起動が可能。
一つ目の引数に渡したいデータを入れればOK。

iPhone App側の実装
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply

Watch Kit App からiPhone側の親アプリが起動されたとき、application:handleWatchKitExtensionRequest:reply:メソッドが最初に呼ばれます。渡ってきたデータを利用することができます。

URLスキームを設定していれば、特定のページへ遷移させることも可能。


Main.storyboardでUIを作成します。
いつものiOS開発と同じです。Labelを貼り付けます。


Interface.storyboardでUIを作成します。
いつものiOS開発と同じです。LabelとButtonを3つ貼り付けます。

AppDelegate.swift

import UIKit


@UIApplicationMain


class AppDelegate: UIResponder, UIApplicationDelegate {


    var window: UIWindow?


    // rootViewController PersonViewController にする

    var personViewController: PersonViewController {

        return window?.rootViewController as! PersonViewController

    }

    

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        // Override point for customization after application launch.

        return true

    }


    func application(application: UIApplication, handleWatchKitExtensionRequest

        userInfo: [NSObject : AnyObject]?, reply: (([NSObject : AnyObject]!) -> Void)?) {

            

            // userInfo通知のデータを確認

            if let info = userInfo as? [String: String] {

                // personViewController メソッド:showPerson <- userInfo

                personViewController.showPerson(info["personName"]!)

                // 応答 成功

                reply.map { $0(["response" : "success"]) }

            } else {

                // 応答 失敗

                reply.map { $0(["response" : "fail"]) }

            }

    }


    func applicationWillResignActive(application: UIApplication) {


    }


    func applicationDidEnterBackground(application: UIApplication) {


    }


    func applicationWillEnterForeground(application: UIApplication) {


    }


    func applicationDidBecomeActive(application: UIApplication) {


    }


    func applicationWillTerminate(application: UIApplication) {


    }


}



ViewController.swift

import UIKit


// クラスをPersonViewController

class PersonViewController: UIViewController {


    // personNameラベル

    @IBOutlet private weak var personName: UILabel!

    

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

    }


    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }


    // 相撲番付け表示(人)

    func showPerson(name: String) {

        personName.text = name

    }


}



InterfaceController.swift

import WatchKit

import Foundation



class InterfaceController: WKInterfaceController {


    // 最初に呼び出されるメソッド

    override func awakeWithContext(context: AnyObject?) {

        super.awakeWithContext(context)

        

        // Configure interface objects here.

    }


    // ユーザーにUIが表示されたタイミングで呼び出されるメソッド

    override func willActivate() {

        // This method is called when watch view controller is about to be visible to user

        super.willActivate()

    }


    // UIが非表示になったタイミングで呼び出されるメソッド

    override func didDeactivate() {

        // This method is called when watch view controller is no longer visible

        super.didDeactivate()

    }


    

    @IBAction func showYoko() {

        openParent("横綱")

    }

    

    @IBAction func showOuze() {

        openParent("大関")

    }

    

    @IBAction func showSeki() {

        openParent("関脇")

    }

    

    // カウントラベル

    func openParent(person: String) {

        var userInfo = ["personName" : person]

        // openParentApplication:reply:メソッド iPhone側の親アプリを起動

        WKInterfaceController.openParentApplication(userInfo, reply: { (data, error) in

            if let error = error {

                

                // 応答 失敗 ["response" : "fail"]

                println(error)

            }

            if let data = data {

                

                // 応答 成功 [response: success]

                println(data)

            }

        })

    }

}



これでApple Watch側でそれぞれのカウントボタンをタップするとiPhone(親アプリ)が起動し、
Apple Watch側のカウントと親アプリ側のカウントの表示が同期します。

 

GitHub WatchKitCommuni

  

目 次