使用 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
,则必须确保在系统尝试调用它时它实际上是可用的。 (可能会发生应用程序调用此函数,在发送回复之前进入后台,然后被系统终止。如果随后调用回复,则线程将崩溃。)。
还有其他类型的数据、文件和复杂性传输,请参阅文档。
现在.isReachable
is handled differently on iOS and watchOS。
iOS:.isReachable
是true
,如果一个配对且处于活动状态的手表在范围内,则对应的 WatchKit 扩展正在运行,WatchKit 扩展的.isReachable
属性为true
。
watchOS:.isReachable
是 true
,如果 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 超时错误
有时无法访问配对手表模拟器上的 WatchConnectivity 会话