有时无法访问配对手表模拟器上的 WatchConnectivity 会话
Posted
技术标签:
【中文标题】有时无法访问配对手表模拟器上的 WatchConnectivity 会话【英文标题】:Sometimes WatchConnectivity session on paired watch simulator is not reachable 【发布时间】:2018-12-31 06:35:12 【问题描述】:我有一个 ios 应用,它使用 WatchConnectivity 与配对的手表进行通信。在大多数情况下,它在模拟器和设备上都可以正常工作。
问题:
在模拟器上的开发过程中,当我尝试使用WCSession.default.sendMessage(_:replyHandler:errorHandler:)
从 iOS 向 watchOS 发送直接消息时,有时会出现以下通信错误:
Error Domain=WCErrorDomain Code=7007
"WatchConnectivity session on paired device is not reachable."
我已阅读this 相关帖子,但不适用于我的情况,因为我的应用程序运行正常。
我的问题:
应用在 iOS 模拟器上运行时手表模拟器无法访问怎么办?
一段时间后重试sendMessage
有意义吗?
有什么解决办法吗?
【问题讨论】:
Beta 版中的连接和模拟器存在很多问题。您可能仍然可以查看发行说明以查看它们。我怀疑你看到一些问题仍然存在......是否重试是一个好问题。如果您可以在硬件上进行测试,我个人不会根据模拟器的行为这样做。 【参考方案1】:作为一种解决方法,我修改了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
【讨论】:
在 IOS15 中使用了您的解决方案。不知道为什么几年后仍然会出现这种零星的 isReachable 消息。 ?以上是关于有时无法访问配对手表模拟器上的 WatchConnectivity 会话的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 13:如何将手表模拟器与 iPhone 模拟器配对