为什么从 WatchKit 扩展程序向 iOS 发送消息并返回回复如此缓慢?
Why sending message from WatchKit extension to iOS and getting back a reply is so slow?
我正在使用 sendMessage
方法从 WatchKit 扩展程序向 iOS 应用程序发送消息。收到回复平均需要 230 毫秒 。该时间不取决于 iOS 应用程序是在屏幕上还是 运行 在后台。 230 毫秒大约是光绕地球一周并返回所需的时间。但是当我测试这个时 phone 离我的手表 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
据我所知,当您向其他设备发送消息时,该消息将被存档到名为 WatchDirectory
.
的本地目录中的文件中
此目录将通过蓝牙同步到其他设备,如其他 iCloud Drive App 或 Drop Box。因为这种方法不需要 App 运行 for iOS 和 watchOS App 而传输将完成。
当新文件到达目录时,iOS(或 watchOS)将调用与 API 相关的 WCSession 来处理内容。如果需要,iOS(或 watchOS)将在发送消息之前在后台唤醒目标应用程序。
对于 watchOS1,手表扩展在 iOS 上运行,只有远程 UI 在 AppleWatch 上运行。所以它需要更简单的进程来通信,只是进程之间的通信。
sendMessage
比 WCSession
提供的其他通信 API 昂贵得多。 iOS 在 watch 应用程序运行在前台之前无法使用它,并且从 watchOS 使用 sendMessage
应该必须唤醒 iPhone 并在后台启动 iOS 应用程序。处理发送的消息后,iOS 可能会终止 运行 在后台运行的目标应用程序以取回内存。
因此,IMO 没有理由认为它应该很快。
就我而言,要在设备上即时刷新我的 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
}
}
我正在使用 sendMessage
方法从 WatchKit 扩展程序向 iOS 应用程序发送消息。收到回复平均需要 230 毫秒 。该时间不取决于 iOS 应用程序是在屏幕上还是 运行 在后台。 230 毫秒大约是光绕地球一周并返回所需的时间。但是当我测试这个时 phone 离我的手表 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
据我所知,当您向其他设备发送消息时,该消息将被存档到名为 WatchDirectory
.
此目录将通过蓝牙同步到其他设备,如其他 iCloud Drive App 或 Drop Box。因为这种方法不需要 App 运行 for iOS 和 watchOS App 而传输将完成。
当新文件到达目录时,iOS(或 watchOS)将调用与 API 相关的 WCSession 来处理内容。如果需要,iOS(或 watchOS)将在发送消息之前在后台唤醒目标应用程序。
对于 watchOS1,手表扩展在 iOS 上运行,只有远程 UI 在 AppleWatch 上运行。所以它需要更简单的进程来通信,只是进程之间的通信。
sendMessage
比 WCSession
提供的其他通信 API 昂贵得多。 iOS 在 watch 应用程序运行在前台之前无法使用它,并且从 watchOS 使用 sendMessage
应该必须唤醒 iPhone 并在后台启动 iOS 应用程序。处理发送的消息后,iOS 可能会终止 运行 在后台运行的目标应用程序以取回内存。
因此,IMO 没有理由认为它应该很快。
就我而言,要在设备上即时刷新我的 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
}
}