Apple Watch アプリから親アプリの情報を更新する。

Apple Watch -> iPhoneとのデータ情報更新の情報を入手しました。

ソースを眺めているだけでは習得出来ないので「Apple Watch アプリから親アプリの情報を更新する。」このページに記載されている通りに制作して見ました。

写生ですが、動作確認でき勉強になりました。


自分のメモとして公開しておきます。

詳細はリンク先を参照願います。


AppDelegate.swift

import UIKit


// WatchKitをインポート

import WatchKit


/// カウント値が更新されたことを通知します。

let ApplicationUpdateCountNotification = "ApplicationUpdateCountNotification"


@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate {


    var window: UIWindow?

    

    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

    // WatchKit Extension から openParentApplication:reply: が実行されると、このメソッドが呼び出されます。

    func application(application: UIApplication!, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]!, reply: (([NSObject : AnyObject]!) -> Void)!) {

        

        // 適切なカウント値が送られてきたときに通知を送信します。

        if let count = userInfo["count"] as? NSNumber {

            

            NSLog("AppDelegate通知を送信 %d", count)

            

            let nc = NSNotificationCenter.defaultCenter()

            nc.postNotificationName(ApplicationUpdateCountNotification, object: count)

        }

        

        // 今回は常に空の情報を呼び出し元に返します。

        reply([:])

    }

    

    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

 

}

ViewController.swift

import UIKit


class ViewController: UIViewController {


    // カウントラベル

    @IBOutlet weak var countLabel: 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 applicationUpdateCountNotification(notification:NSNotification) {

        

        // 受け取ったカウント値をラベルに反映

        let count = notification.object as! NSNumber

        

        NSLog("受け取ったカウント値 %d", count)

        self.countLabel.text = count.description

    }

    

    /// ビューの表示直前に通知を受け取れる準備をします。

    override func viewWillAppear(animated: Bool) {

        

        super.viewWillAppear(animated)

        

        let nc = NSNotificationCenter.defaultCenter()

        nc.addObserver(self, selector: Selector("applicationUpdateCountNotification:"), name: ApplicationUpdateCountNotification, object: nil)

    }

    

    // ビューが非表示にされるときに通知を受け取らないようにしておきます。

    override func viewWillDisappear(animated: Bool) {

        

        NSNotificationCenter.defaultCenter().removeObserver(self)

        

        super.viewWillDisappear(animated)

    }

}

InterfaceController.swift

import WatchKit

import Foundation



class InterfaceController: WKInterfaceController {


    // スライダー表示ラベル

    @IBOutlet weak var countLabel: WKInterfaceLabel!

    // スライダー

    @IBOutlet weak var countSlider: WKInterfaceSlider!

    

    // スライダー数値がラベルに反映

    // 現在のカウントを保存するインスタンス変数を保存型プロパティで定義

    // プロパティにはdidSet、値が設定 -> ラベル (countLabel) に反映

    var count:Int32 = 0 {

        

        didSet {

            

            self.countLabel.setText(String(self.count))

            

            // カウント情報が更新されたときに、親アプリにカウントを通知するメソッドを呼び出します。

            self.updateParentCount()

        }

    }


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

    // スライダーの初期値を設定

    override func awakeWithContext(context: AnyObject?) {

        super.awakeWithContext(context)

        

        // 初期値

        self.count = 100

        self.countSlider.setValue(Float(self.count))

        

        // Configure interface objects here.

        

    }

    

    // スライダーを操作したときに、それが示す値をカウントに反映

    @IBAction func countSliderAction(value: Float) {

        self.count = Int32(value)

    }

    

    // 親アプリへカウント値を送信

    func updateParentCount() {

        

        // ディクショナリに "count" をキーにしてカウント値を渡す

              // userInfo key:content 値:count

        // NSObject を継承した値を指定する必要があるので、カウント値をNSNumber型 に包んで渡す

        let userInfo = ["count" : NSNumber(int:self.count)]

        

        //println("親アプリカウント送信")

        

        // openParentApplication:reply:メソッドを呼び出すことで

        // 任意のディクショナリを親の iPhone アプリ側へ渡す

        WKInterfaceController.openParentApplication(userInfo) {

            

            // 親の iPhone アプリで用意した任意の情報と、

            // エラー情報とを受け取って処理するクロージャーを指定します。

            // 何もしないクロージャーを渡しておくことにしました。

            (reply, error) -> Void in

        }

        

        NSLog("%d", count)

    }

    


    // ユーザーに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()

    }


}

 

ESStudyAppleWatch

  

目 次