为啥从 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 上运行。所以它需要更简单的进程来通信,只是进程之间的通信。
sendMessage
比WCSession
提供的其他通信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 应用程序之间发送消息?