WatchConnectivity相互通信
在iOS 9.0+和watchOS 2.0+的时候,WatchConnectivity是可以进行手机和手表之间的双向通信的。而在之前,只能有手表主动发起连接,而手机端是无法向手表端发送回执的。
如何双向通信
看一个例子,在这个例子中,手表端点击发送按钮向手机端发送一条消息,消息通过本地通知的方式展现出来。然后,手机向手表发送一个回执。
Watch端 iPhone端首先需要在手机端和手表端都初始化一个WCSession对象
if([WCSession isSupported])
{
WCSession *session=[WCSession defaultSession];
session.delegate=self;
[session activateSession];
}
前提是先导入WatchConnectivity/WatchConnectivity.h文件并且引用WCSessionDelegate
然后分别在手表端和手机端分别实现代理方法sendMessage:ReplyHandler:方法和didReceiveMessage:ReplyHandler:,其中ReplyHandler方法就是接收完成后发送的回执。
手表端:
if([WCSession defaultSession].isReachable)
{
NSDictionary *msg=@{@"msg":@"你好iPhone,我是Apple Watch"};
[[WCSession defaultSession]sendMessage:msg replyHandler:^(NSDictionary* _Nonnull replyMessage) {
NSString *reply=replyMessage[@"msg"];
[self.ResultLabel setText:reply];
} errorHandler:^(NSError * _Nonnull error) {
}];
}
手机端:
-(void)session:(WCSession *)session didReceiveMessage:(NSDictionary*)message replyHandler:(nonnull void (^)(NSDictionary* _Nonnull))replyHandler
{
NSString *msg=[NSString stringWithFormat:@"%@",message[@"msg"]];
UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
//需创建一个包含待通知内容的 UNMutableNotificationContent 对象,注意不是 UNNotificationContent ,此对象为不可变对象。
UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];
content.title = [NSString localizedUserNotificationStringForKey:@"Hello!" arguments:nil];
content.body = [NSString localizedUserNotificationStringForKey:msg
arguments:nil];
content.sound = [UNNotificationSound defaultSound];
// 在 alertTime 后推送本地推送
UNTimeIntervalNotificationTrigger* trigger = [UNTimeIntervalNotificationTrigger
triggerWithTimeInterval:1 repeats:NO];
UNNotificationRequest* request = [UNNotificationRequest requestWithIdentifier:@"FiveSecond"
content:content trigger:trigger];
//添加推送成功后的处理!
[center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
NSDictionary *replyMSG=@{@"msg":[NSString stringWithFormat:@"你好watch,我是 iPhone,你的消息已收到 %@",[NSDate date].description]};
replyHandler(replyMSG);
}];
}
这样最简单的相互通信就完成了。