現在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會被更新