我使用sendMessage
方法从WatchKit扩展发送消息到iOS应用程序。平均230 ms左右接收回复。这个时间并不取决于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
AFAIK,当您发送消息到其他设备时,消息将被归档到本地目录WatchDirectory
的文件中。
此目录将通过蓝牙同步到其他设备,如其他iCloud驱动器应用程序或Drop Box。因为这种方法不需要在iOS和watchOS上运行应用程序,而传输将完成。
当新文件到达目录时,iOS(或watchOS)将调用WCSession相关的API来处理内容。如果需要,iOS(或watchOS)会在发送消息之前在后台唤醒目标应用。
使用watchOS1,手表扩展在iOS上运行,只有远程UI在AppleWatch上运行。所以它需要更简单的进程来通信,只是进程之间的通信。
sendMessage
比WCSession
提供的其他通信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
}
}