启动时,我会让手表向iOS设备发送消息,让应用知道它已准备好接收更新的数据。有时这段代码工作正常,有时却没有。
它经常因以下调试输出而失败:
16:12:15.150|WatchSessionManager|WC Session activated with state: 2 (0 - notActivated, 1 - inactive, 2 - activated)
16:12:15.194|WatchSessionManager|Not reachable
根据我在Apple文档中读取的内容,一旦激活了连接,您就可以发送这样的实时消息。连接激活后为什么会失败?
感谢。
作为参考,在ExtensionDelegate中调用以下代码:
func applicationDidFinishLaunching() {
WatchSessionManager.sharedManager.startSession() //connect to iPhone
}
代码:
func startSession() {
if WCSession.isSupported() {
let session = WCSession.default()
session.delegate = self
session.activate()
}
}
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
if let error = error {
print("WC Session activation failed with error: \(error.localizedDescription)")
return
}
debug.log(tag: "WatchSessionManager", content: "WC Session activated with state: \(activationState.rawValue) (0 - notActivated, 1 - inactive, 2 - activated)")
if WCSession.default().isReachable {
debug.log(tag: "WatchSessionManager", content: "Requesting")
let message = ["request": "masterList"]
WCSession.default().sendMessage(message, replyHandler: { (replyDict) -> Void in
//do stuff
}, errorHandler: { (error) -> Void in
self.debug.log(tag: "WatchSessionManager", content: "Send to iOS app failed with error \(error)")
})
}
else {
debug.log(tag: "WatchSessionManager", content: "Not reachable")
}
}
答案 0 :(得分:2)
对于那些在类似船上的人,我从未找到导致这个问题的原因。但是,作为一种解决方法,我循环启动会话功能,在连接失败时每隔几秒尝试一次新连接,并且需要发送/接收数据。第二次连接尝试每次都基本成功。
答案 1 :(得分:1)
在手表和手机之间发送任何消息之前,您可能需要检查activationState
为active
而isReachable
为true
。正如上面评论检查文档中所述 - https://developer.apple.com/reference/watchconnectivity/wcsession/1615683-isreachable。
答案 2 :(得分:0)
这是即使在激活WCSession的情况下也无法接通电话的原因:它不在手表范围内,蓝牙关闭或电话hasn't been unlocked since its last reboot。
答案 3 :(得分:0)
尝试使用sessionReachabilityDidChange(_ session:WCSession)WCSessionDelegate方法。