使用watchOS2中的WatchConnectivity在iOS和WatchOS之间发送消息

14

我观看了WWDC2015并且发现现在可以在手表上开发本地应用。这开启了很多能力,我想知道如何在我的iOS应用和AppleWatch应用之间发送数据。

我看到有一个叫做WatchConnectivity的新框架。我该如何使用它,并且在来回发送数据时我有哪些选择?


2
你已经回答了自己的问题。正如StackExchange.com的FAQ所说,这是分享知识的好方法。 - Seyed Parsa Neshaei
成就解锁! - GeneCode
1个回答

26

WatchConnectivity

iOS和watchOS之间需要相互通信,首先这两个类需要遵循<WCSessionDelegate>并且引用WatchConnectivity框架。

在发送数据之前,您需要检查设备是否能够发送数据。

if ([WCSession isSupported]) {
      WCSession *session = [WCSession defaultSession];
      session.delegate = self;
      [session activateSession];
      NSLog(@"WCSession is supported");
}

如果您希望使用“交互式消息传递”(sendMessage API),您需要先查看其他设备是否可达:

if ([[WCSession defaultSession] isReachable]) {
    //Here is where you will send you data
}

“后台操作”API不需要在调用WCSession API时对应的设备可达。

在将数据传输到您的应用程序之间,您有几个选项,在苹果文档中描述如下:

  • 使用updateApplicationContext:error:方法仅向对等方通信最近的状态信息。当对等方唤醒时,它可以使用此信息更新自己的状态并保持同步。使用此方法发送新字典会覆盖先前的字典。

  • 使用sendMessage:replyHandler:errorHandler:sendMessageData:replyHandler:errorHandler:方法立即传输数据到对等方。这些方法旨在在iOS应用程序和WatchKit扩展均处于活动状态时进行即时通信。

  • 使用transferUserInfo:方法在后台传输字典数据。您发送的字典排队等待传递给对等方,当当前应用程序挂起或终止时,传输将继续。

  • 使用transferFile:metadata:方法在后台传输文件。在您想要发送更多不只是简单值的情况下使用此方法。例如,使用此方法发送图像或基于文件的文档。

我将给您一个例子,说明如何使用应用程序上下文发送/接收数据

发送数据:

WCSession *session = [WCSession defaultSession];
NSError *error;

[session updateApplicationContext:@{@"firstItem": @"item1", @"secondItem":[NSNumber numberWithInt:2]} error:&error];

接收数据:

- (void) session:(nonnull WCSession *)session didReceiveApplicationContext:(nonnull NSDictionary<NSString *,id> *)applicationContext {

    NSLog(@"%@", applicationContext);


    NSString *item1 = [applicationContext objectForKey:@"firstItem"];
    int item2 = [[applicationContext objectForKey:@"secondItem"] intValue];
}

关于WatchConnectivity的更多信息,我强烈推荐观看WWDC2015会议视频和阅读Apple WatchConnectivity文档


上下文必须是属性类型吗?我有一个自定义类的核心数据实体要发送。但看起来会抛出一个错误。 - Ace Green
1
这里有一个使用sendMessage()的示例代码,位于github上,请查看:https://github.com/JohnGoodstadt/sendMessage - John Goodstadt
@Philip,一旦双向通信结束(例如锻炼完成等),你如何关闭会话?我不想浪费过多的计算能力/电量,但我没有找到任何关闭或停用WCSession的方法。 - Tyler Sheaffer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接