iWatch与iphone之间的数据交互

在watch OS2中使用的是WCSession来进行数据的接收与发送。
iwatch端:
在InterfaceController头文件中导入WatchConnectivity/WatchConnectivity.h,并添加WCSessionDelegate代理:

#import <WatchKit/WatchKit.h>
#import <Foundation/Foundation.h>
#import <WatchConnectivity/WatchConnectivity.h>

@interface InterfaceController : WKInterfaceController <WCSessionDelegate>

在.m文件的- (void)willActivate中添加代码:

if([WCSession isSupported]){
        WCSession *session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];
    }

建立一个WCSession。

使用WCSession中的sendMessage发送数据:

- (IBAction)tapBtn {
    
    WCSession *session = [WCSession defaultSession];
    
    NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:@"大神仙",@"Message", nil];
    
    [session sendMessage:dic replyHandler:^(NSDictionary<NSString *,id> * _Nonnull replyMessage) {
        NSLog(@"replay: %@", replyMessage);
        
    } errorHandler:^(NSError * _Nonnull error) {
        NSLog(@"Error: %@", error);
    }];
}

通过定义一个NSDictionary作为数据对象,发送给iphone。
接收数据是通过WCSessionDelegate的代理实现:

#pragma mark WCSessionDelegate

- (void)session:(WCSession *)session activationDidCompleteWithState:(WCSessionActivationState)activationState error:(nullable NSError *)error __IOS_AVAILABLE(9.3) __WATCHOS_AVAILABLE(2.2){
    
}

- (void)sessionDidBecomeInactive:(WCSession *)session __IOS_AVAILABLE(9.3) __WATCHOS_UNAVAILABLE{
    
}

- (void)sessionDidDeactivate:(WCSession *)session __IOS_AVAILABLE(9.3) __WATCHOS_UNAVAILABLE{
    
}

- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *, id> *)message replyHandler:(void(^)(NSDictionary<NSString *, id> *replyMessage))replyHandler{
    NSString *str = [message objectForKey:@"Message"];
    [_nameLabel setText:str];
}

iOS端:
同样,在iphone端也需要导入WatchConnectivity/WatchConnectivity.h,并添加WCSessionDelegate代理。
在ViewController中导入WatchConnectivity.h,添加WCSessionDelegate。

#import <WatchConnectivity/WatchConnectivity.h>

@interface ViewController ()<WCSessionDelegate>

在ViewController.m的viewDidLoad中添加代码:

if([WCSession isSupported]){
        WCSession *session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];
    }

同样调用sendMessage方法发送数据给iwatch

- (IBAction)tap:(UIButton *)sender {
    
    NSString *text = _textField.text;
    NSLog(@"++++%@++++", text);
    
    [self sendText:_textField.text];
}


-(void)sendText:(NSString *)text
{
    WCSession *session = [WCSession defaultSession];
    
    NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:text,@"Message", nil];
    
    [session sendMessage:dic replyHandler:^(NSDictionary<NSString *,id> * _Nonnull replyMessage) {
        NSLog(@"replay: %@", replyMessage);
        
    } errorHandler:^(NSError * _Nonnull error) {
        NSLog(@"Error: %@", error);
    }];
}

和iwatch一样,需要实现相同的代理方法来接收数据,如果收到数据后需要更新UI,必须切换到主线程执行,否则会报错。

#pragma mark delegate
- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *, id> *)message replyHandler:(void(^)(NSDictionary<NSString *, id> *replyMessage))replyHandler{
    
    dispatch_async(dispatch_get_main_queue(), ^{
        //回调或者说是通知主线程刷新,
        [_textField setText:[message objectForKey:@"Message"]];
       
    });
    
    NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:_textField.text,@"Message", nil];
    
    replyHandler(dic);
    
    
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AGI阅读 16,012评论 3 119
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,613评论 8 265
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,969评论 19 139
  • 1.明确坚定的态度 有效的抱怨不仅能让我们的压抑的心情得到释放,还可以解决问题。那怎样才算有效的抱怨呢? 首先要找...
    咿呀作语阅读 227评论 2 2
  • 前言 如果你要开发一个复杂的产品,那么肯定少不了使用面向对象机制,当然也避不开 Javascript 里面的继承,...
    lifeColder阅读 750评论 0 1