现在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会被更新