您的位置:首页 > 移动开发

Apple Watch与iPhone数据通信———— Watch Connectivity

2016-02-23 09:41 441 查看
Apple Watch与iPhone数据通信———— Watch Connectivity

Watch Connectivity原理,iOS App与安装在Watch上的Watch Extension(Watch OS 2.0之后Extension不再放到iPhone中,Watch App可以独立进行数据处理)通过WCSession进行数据传输。

第一步初始化WCSession

在通信之前要确保Watch和iOS上的App都初始化了WCSession,接收方控制器要设置delegate—>WCSessionDelegate,同时要激活WCSession,代码如下:

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


第二步校验Counterpart

可以传输的数据格式为字典(NSDictionary)、NSData、文件(NSURL), iOS端在发送信息之前应先检验1.Apple Watch是否与手机相连、2.Apple Watch是否安装了该应用。 Watch端在发送前无需检验是否安装了应用。 检验代码如下:

/** Check if iOS device is paired to a watch */
BOOL        session.paired

/** Check if the user has the Watch app installed */
BOOL        session.watchAppInstalled


watchapp安装成功就会在手表上建立相应app的目录,因此session.watchAppInstalled==false效果等同于watchDirectoryURL != nil。

watchDirectoryURL一般只在需要额外的初始化处理的情况下,比如app重装恢复队列内容、设定初始设置时等情况下会用到。

第三步发送消息

发送方法分为三种:

一.ApplicationContext

- (BOOL)updateApplicationContext:(NSDictionary<NSString *,id> *)applicationContext error:(NSError * _Nullable *)error


只能发送NSDictionary,在对应App被唤醒时系统会将消息发送过去。

接收方App对应的代理方法:

- (void)session:(WCSession *)session didReceiveApplicationContext:(NSDictionary<NSString *,id> *)applicationContext (此处官方文档描述有误)


二.Transfer

分为UserinfoTransfer和FileTransfer,能发送NSDictionary和File

- (WCSessionFileTransfer *)transferFile:(NSURL *)file
metadata:(NSDictionary<NSString *,
id> *)metadata

- (WCSessionFileTransfer *)transferFile:(NSURL *)file
metadata:(NSDictionary<NSString *,
id> *)metadata


接收方App对应的代理方法:

- (void)session:(WCSession *)session didReceiveUserInfo:
(NSDictionary<NSString *, id> *)userInfo;

- (void)session:(WCSession *)session didReceiveFile:(WCSessionFile *)file;


通过后台传输NSDictionary或者File,发送的数据将以队列的形式传递给目标App,即使当前App暂停或终止传输仍然继续。

三.replyHandle

可以发送NSDictionary或NSData, 发送方可以获得接收方响应。

- (void)sendMessage:(NSDictionary<NSString *, id> *)message replyHandler:(void (^)(NSDictionary<NSString *, id> *replyMessage))replyHandler errorHandler:(void (^)(NSError *error))errorHandler

- (void)sendMessageData:(NSData *)data replyHandler:(void (^)(NSData *replyMessageData))replyHandler
errorHandler:(void (^)(NSError *error))errorHandler


实时通讯,传输时要求App必须处于运行时,若iOS App未启动,Watch Extension将会在iOS后台启动App。当iOS为发送方,Watch App未启动时,发送失败。

接收方对应的代理方法:

- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *,id> *)message

- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *,id> *)message replyHandler:(void (^)(NSDictionary<NSString *,id> *_Nonnull))replyHandler

- (void)session:(WCSession *)session didReceiveMessageData:(NSData *)messageData

- (void)session:(WCSession *)session didReceiveMessageData:(NSData *)messageData replyHandler:(void(^)(NSData *replyMessageData))replyHandler
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS Watch WCSession Transfer