WatchOS2 新增通信功能"WCSession&q

作者: Realank | 来源:发表于2016-01-04 16:56 被阅读1947次

    在watchOS1中,我们使用AppGroup和AppDelegate在手机和手表之前传递数据,
    使用方法可以参考我之前写的CSDN

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

    但是这个方法并不是很好用,所以WatchOS 2 提供了Watch Connectivity Framework来进行 经过配对的Watch和iPhone的数据交换,该框架可以后台传输和前台传输。
    而WatchConnectivity Framework提供了一个WCSession对象,我们要通过WCSession可以进行消息传输。

    本文GitHub是fork自randomize的代码AppleWatchTutorialSeries
    其中Tutorial8就是咱们今天的内容,其它教程也可以顺便学习一下

    启动服务

    使用WCSession发送和接受消息前,需要先在手机和手表的Controller中分别启动Session,并且尽可能的早:

        WCSession* session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];
    

    发送消息

    WCSession* session = [WCSession defaultSession];
    [session sendMessage:@{@"b":@"goodBye"} replyHandler:^(NSDictionary<NSString *,id> * _Nonnull replyMessage) {
            
        } errorHandler:^(NSError * _Nonnull error) {
            
        }];
    

    这里需要注意,即使replyHandler和errorHandler不使用,也不可以设置为nil,否则会造成发送消息不会被接收到,一开始randomize的Objc代码就有这个问题,所以我提交了一次修改,修正了这个问题

    [session sendMessage:@{@"b":@"goodBye"} replyHandler:nil errorHandler:nil];//禁止这样调用
    

    接受消息

    接受消息使用代理的方式,所以我们首先要在手机和手表的Controller中,遵守如下Delegate

    WCSessionDelegate
    

    然后,创建如下方法,接受消息:

    - (void) session:(nonnull WCSession *)session didReceiveMessage:(nonnull NSDictionary<NSString *,id> *)message replyHandler:(nonnull void (^)(NSDictionary<NSString *,id> * __nonnull))replyHandler{
        //message即是对方发送的内容
    }
    

    需要注意的是,在手机侧,这个代码似乎不是在主线程被调用,所以如果在方法中更新UI控件,比如修改UILabel的内容,需要使用GCD在主线程中修改:

    - (void) session:(nonnull WCSession *)session didReceiveMessage:(nonnull NSDictionary<NSString *,id> *)message replyHandler:(nonnull void (^)(NSDictionary<NSString *,id> * __nonnull))replyHandler{
        dispatch_async(dispatch_get_main_queue(), ^{
            self.messageLabel.text = message[@"b"];
            NSLog(@"%@",message);
        });
        
    }
    

    结语

    这个通讯方法很简单,使用起来更佳好用,如果涉及多页面通讯,我们可以使用单例来集中管理信息传递,
    但是值得注意的是,这个方法的传送速度也不快,这主要是受手表硬件限制,毕竟蓝牙速度不快,还要考虑电池续航

    相关文章

      网友评论

      • tp夕阳武士:你好,我正在开发手表的项目,但是在添加group 的时候,手表项目中capabilities 的 group 那里总是报错 Add App Group to your App ID 和 Add The App Group Feature to your App ID
        请问这两个问题要如何解决呢 如果方便的话,可以加我QQ知道一下吗? 462316190
      • linbj:请问 能用上面的方法从手表端唤醒App吗
      • Raybon_lee:不错,明年有望做手表这一块
        tp夕阳武士:@Realank 你好 请问你后来欧没有开发手表这一块呢? 我目前正在弄,但是遇到了点问题,想请教一下
        Realank:@Raybon_lee 加油~

      本文标题:WatchOS2 新增通信功能"WCSession&q

      本文链接:https://www.haomeiwen.com/subject/ubkahttx.html