使用 WatchConnectivity 框架的独立手表应用

Posted

技术标签:

【中文标题】使用 WatchConnectivity 框架的独立手表应用【英文标题】:Independent Watch App using the WatchConnectivity framework 【发布时间】:2020-02-20 15:58:46 【问题描述】:

在创建独立 watchOS 应用时是否可以使用 WatchConnectivity 框架?

文档https://developer.apple.com/documentation/watchkit/creating_independent_watchos_apps 指出,“当 ios 设备可用时,独立应用程序可以使用 WatchConnectivity 从其 iOS 配套应用程序传输信息......”

但是我们如何在 iOS 应用和 watchOS 应用之间发送数据呢?在检查 isReachable 属性时,WCSession 对象总是返回 false

感谢您的帮助:)

【问题讨论】:

【参考方案1】:

在您可以使用 WatchConnectivity 之前,必须在 iOS 和 watchOS 上激活 WCSession(Apple suggests 您首先检查设备是否支持 WatchConnectivity)。

激活是异步完成的。完成后,在会话对象的委托中调用func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?)(必须在启动激活时设置)。 如果激活成功,activationState 现在是.activated。只有这样才能启动任何传输。

有several kinds of transfer。有些要求.isReachable 为真,有些则不是。

updateApplicationContext(_:) 向对方设备发送字典。当设备处于活动状态时会收到它。如果在对方设备激活之前多次调用此函数,则只接收最后一个字典。此转移需要.isReachable

transferUserInfo(_:) 也发送一个字典,但如果函数被多次调用,所有字典都会被传递。此转移也不需要需要.isReachable

sendMessage(_:replyHandler:errorHandler:) 也发送一个字典,如果函数被多次调用,所有字典都会再次被传递。此转移确实需要.isReachable。 如果指定了replyHandler,则必须确保在系统尝试调用它时它实际上是可用的。 (可能会发生应用程序调用此函数,在发送回复之前进入后台,然后被系统终止。如果随后调用回复,则线程将崩溃。)。

还有其他类型的数据、文件和复杂性传输,请参阅文档。

现在.isReachableis handled differently on iOS and watchOS。

iOS:.isReachabletrue,如果一个配对且处于活动状态的手表在范围内,则对应的 WatchKit 扩展正在运行,WatchKit 扩展的.isReachable 属性为true

watchOS:.isReachabletrue,如果 WatchKit 扩展在前台运行或在后台以高优先级运行,并且 iOS 设备在范围内。请注意,iOS 应用不是必须处于活动状态。如果手表开始传输并且 iOS 应用程序未处于活动状态,它会启动到后台并可以处理通信。

您提到.isReachable 始终是false。 所以如果这与watchOS应用有关,原因可能是WCSession的激活没有成功完成,或者iOS设备不在范围内。 如果这与iOS应用有关,原因可能是WCSession的激活没有成功完成,手表应用没有在前台运行或者没有在后台以高优先级运行,或者手表没有在范围内。 希望这会有所帮助!

【讨论】:

真的很奇怪,在 WCSession.default 上调用 session.activate() 后,我收到以下错误消息:由于 NSXPCConnectionInterrupted 和委托方法 session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) is never called... 你遇到过这个吗? 另外,isCompanionAppInstalled 属性总是返回 false... NSXPCConnectionInterrupted 错误很奇怪。在here 之前已经报道过模拟器和设备,但没有解决方案。我假设您尝试了通常的操作(清除构建文件夹和派生数据,重新启动模拟器/设备,卸载并重新安装手表应用程序,取消配对并修复手表)。我发现another post 解决了.isCompanionAppInstalled 问题。也许这对你也有帮助?

以上是关于使用 WatchConnectivity 框架的独立手表应用的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 和 Apple Watch 之间的 WatchConnectivity 超时错误

未找到 Apple Watch 连接文件

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

使用WatchConnectivity获取核心数据获取请求

如何使用 WatchConnectivity 从 iOS 应用程序获取数据

如何使用 WatchConnectivity 在我的 iOS 和 Watch 应用程序之间共享信息?