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

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值