有时无法访问配对手表模拟器上的 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 模拟器配对

识别 Apple Watch 名称

苹果手表连接手机为啥显示要更新

苹果手表应用程序上的黑屏页面超过一页

XCode 12.5 无法部署到与手表配对的手机 - 设备“(null)”未在您的开发者帐户中注册

荣耀手表ES升级失败怎么办?