为什么从WatchKit扩展发送消息到iOS并得到回复是如此缓慢



我使用sendMessage方法从WatchKit扩展发送消息到iOS应用程序。平均230 ms左右接收回复。这个时间并不取决于iOS应用是在屏幕上还是在后台运行。230毫秒大概是光绕地球一周并返回所需要的时间。但是当我测试的时候,手机距离我的手表30厘米。

:

  1. 为什么这么慢?
  2. 它应该这么慢吗?
  3. 有办法让它更快吗?

观察结果:根据我之前在watchOS 1上的实验,通信要快一点,往返大约需要50毫秒。

从WatchKit扩展发送消息

let session = WCSession.defaultSession()
session.sendMessage(["message from watch":"🌷"], replyHandler: { reply in
  // Getting reply from iOS app here
}, errorHandler: nil)

从iOS应用程序接收消息

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {
  replyHandler(["reply from iOS":"🐱"])
}

演示程序:https://github.com/evgenyneu/WatchKitParentAppBenchmark

iOS: 9.0, watchOS: 2.0

AFAIK,当您发送消息到其他设备时,消息将被归档到本地目录WatchDirectory的文件中。

此目录将通过蓝牙同步到其他设备,如其他iCloud驱动器应用程序或Drop Box。因为这种方法不需要在iOS和watchOS上运行应用程序,而传输将完成。

当新文件到达目录时,iOS(或watchOS)将调用WCSession相关的API来处理内容。如果需要,iOS(或watchOS)会在发送消息之前在后台唤醒目标应用。

使用watchOS1,手表扩展在iOS上运行,只有远程UI在AppleWatch上运行。所以它需要更简单的进程来通信,只是进程之间的通信。

sendMessageWCSession提供的其他通信API要昂贵得多。iOS不能使用它,直到手表应用程序运行前台,使用sendMessage从watchOS应该不得不唤醒iPhone和后台启动iOS应用程序。在分派的消息被处理后,iOS可能会杀死在后台运行的目标应用程序以获得内存。

在我的例子中,在设备上立即刷新我的UI:

   func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) {
     //receive message from watch
     dispatch_async(dispatch_get_main_queue()) {
        self.textLabel.text = message["optionSent"]! as? String
     }
   }

最新更新