[WatchKit][AppleWatch和iPhone通信][方法2]App Delegate

現在WatchKit開發的中文資料好少啊,發現了一個網址,有一些有用的信息,共享給大家:
http://www.infoq.com/cn/articles/watch-app-development

迴歸正題,上回書說到,可以使用App Group方式,異步的共享數據,本文將告訴大家怎樣通過app delegate方式同步的共享數據。如果大家還有其他方法,請回帖,咱們一起交流進步

此同步方式的原理是,手錶App的InterfaceController調用如下方法:

+ (BOOL)openParentApplication:(NSDictionary *)userInfo reply:
(void(^)(NSDictionary *replyInfo, NSError *error)) reply;

調用此方法後,手機App的AppDelegate會響應。
此方法包含兩個參數,一個是userInfo,這個是傳給手機App的字典,我們自己約定格式
另一個是一個閉包(oc中叫block),當手機App返回數據的時候,會被調用,
此閉包同樣有兩個參數,一個是返回的字典數據,同樣自己約定格式,另一個是錯誤信息。

我們在手錶App的按鍵action中添加如下調用:

    @IBAction func syncData() {
        WKInterfaceController.openParentApplication(["update":"string"], reply: {(replyInfo, error) -> Void in
            if let dic = replyInfo{
                if let value: AnyObject = dic["string"]{
                    self.lable.setText("\(value)")
                }
            }
        })
    }

可以看到,我們請求給手機App的數據是字典[“update”:”string”]
返回的數據將是[“string”:”<數據>”]
數據內容非常靈活

當我們按下手錶App按鍵的時候,手機App的AppDelegate類中的方法會被調用:

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

該方法包括三個參數,第一個是單例模式的UIApplication實例,第二個是從手錶App傳過來的數據,第三個是一個閉包函數,當我們處理完數據的時候,調用該閉包,給手錶App反饋數據,參數是一個字典類型,沒有返回值

我們的在手機App的ViewController添加一個類成員shareData:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!

    static var shareData = ""

    override func viewDidLoad() {
        super.viewDidLoad()
        ViewController.shareData = textField.text
        // Do any additional setup after loading the view, typically from a nib.
    }


    @IBAction func syncData(sender: UIButton) {

        ViewController.shareData = textField.text

    }

}

當我們在手機上按下同步按鍵的時候,類成員shareData就會被更新,然後我們在AppDelegate的代理方法中添加如下內容

    func application(application: UIApplication, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]?, reply: (([NSObject : AnyObject]!) -> Void)!) {
        for key in userInfo!.keys{
            let command = key as! NSString
            let value = userInfo![key] as! NSString
            if command == "update" {
                reply(["string":"\(ViewController.shareData)"])
            }
        }

    }

當手表請求數據的時候,手機App的AppDelegate把shareData的數據傳給手錶,
例如:[“string”:”hello”]

reply以後,手錶InterfaceController中的剛剛添加的reply閉包會被調用,手錶的label會被更新

這裏寫圖片描述

發佈了31 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章