为什么从WatchKit扩展到iOS发送消息并获得回复太慢?

我正在使用sendMessage方法将WatchKit扩展的消息发送到iOS应用程序。 平均需要230 ms才能得到答复。 时间不取决于iOS应用是在屏幕上还是在后台运行。 大约230ms是光线通过地球周围返回的时间。 但是当我testing这个时,手机离我的手表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要昂贵得多。 直到手表App运行前台,iOS才能使用它,而使用watchOS的sendMessage则需要唤醒iPhone并在后台启动iOS App。 在处理分派的消息之后,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 } }