为啥从 WatchKit 扩展向 iOS 发送消息并得到回复如此缓慢?

Posted

技术标签:

【中文标题】为啥从 WatchKit 扩展向 iOS 发送消息并得到回复如此缓慢?【英文标题】:Why sending message from WatchKit extension to iOS and getting back a reply is so slow?为什么从 WatchKit 扩展向 iOS 发送消息并得到回复如此缓慢? 【发布时间】:2015-09-20 10:55:41 【问题描述】:

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

问题

    为什么这么慢? 应该这么慢吗? 有没有办法让它更快?

观察:根据我之前在 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

【问题讨论】:

【参考方案1】:

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

此目录将通过蓝牙同步到其他设备,例如其他 iCloud Drive App 或 Drop Box。因为这种方式不需要为 iOS 和 watchOS App 运行 App 而传输完成。

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

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

sendMessageWCSession 提供的其他通信API 更昂贵。 iOS 无法使用它,直到手表 App 运行在前台,并且使用 watchOS 中的sendMessage 应该必须唤醒 iPhone 并在后台启动 iOS 应用程序。处理完发送的消息后,iOS 可能会终止在后台运行的目标应用程序以获取内存。

所以,IMO 没有理由说它应该很快。

【讨论】:

【参考方案2】:

在我的情况下,在设备上即时刷新我的 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
     

   

【讨论】:

以上是关于为啥从 WatchKit 扩展向 iOS 发送消息并得到回复如此缓慢?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iPhone 应用程序和 WatchKit 应用程序之间发送消息?

从网页向 chrome 扩展发送消息

WatchKit 扩展配置文件?

WatchKit Complication:从扩展委托获取复杂数据

从 iOS 打开 WatchKit 应用程序

尝试从扩展包中的 html 窗口向内容脚本发送消息