有时无法访问配对监视模拟器上的WatchConnectivity会话



我有一个iOS应用程序,它使用WatchConnectivity与配对的手表进行通信。在大多数情况下,它在模拟器和设备上都能正常工作。

问题:

在模拟器的开发过程中,当我尝试使用WCSession.default.sendMessage(_:replyHandler:errorHandler:):从iOS向watchOS发送直接消息时,我不时会遇到以下通信错误

Error Domain=WCErrorDomain Code=7007  
"WatchConnectivity session on paired device is not reachable."

我读过这篇相关的帖子,但它不适用于我的案例,因为我的应用程序确实正常工作。

我的问题:

当应用程序在iOS模拟器上运行时,手表模拟器怎么会无法访问
过一段时间再重试sendMessage有意义吗
有什么变通办法吗?

作为一种变通方法,我修改了sendMessage函数,以便在出现此错误的情况下多次重试传输。从那时起,所有sendMessage传输都被成功执行。

func sendMessage(_ message: [String: AnyObject],
replyHandler: (([String: Any]) -> Void)?,
errorHandler: ((Error) -> Void)?) {
guard let communicationReadySession = communicationReadySession else {
// watchOS: A session is always valid, so it will never come here.
print("Cannot send direct message: No reachable session")
let error = NSError.init(domain: kErrorDomainWatch, 
code: kErrorCodeNoValidAndReachableSession, 
userInfo: nil)
errorHandler?(error)
return
}
/* The following trySendingMessageToWatch sometimews fails with
Error Domain=WCErrorDomain Code=7007 "WatchConnectivity session on paired device is not reachable."
In this case, the transfer is retried a number of times.
*/
let maxNrRetries = 5
var availableRetries = maxNrRetries
func trySendingMessageToWatch(_ message: [String: AnyObject]) {
communicationReadySession.sendMessage(message, 
replyHandler: replyHandler, 
errorHandler: { error in
print("sending message to watch failed: error: (error)")
let nsError = error as NSError
if nsError.domain == "WCErrorDomain" && nsError.code == 7007 && availableRetries > 0 {
availableRetries = availableRetries - 1
let randomDelay = Double.random(min: 0.3, max: 1.0)
DispatchQueue.main.asyncAfter(deadline: .now() + randomDelay, execute: {
trySendingMessageToWatch(message)
})
} else {
errorHandler?(error)
}
})
} // trySendingMessageToWatch
trySendingMessageToWatch(message)
} // sendMessage

最新更新