我们的应用程序还包含一个手表扩展。应用程序的部分功能是在任一设备上启动或停止进程,并通过发送事件及其发生日期来通知对方。我们现在还想为此使用带有自定义意图的 Siri 快捷方式。目前我们没有运行 watchOS 5 的手表,所以我们只能在模拟器中进行测试。
遵循 Apples SoupChef示例应用程序,我们设法在两台设备上运行快捷方式,根据需要在后台执行其任务。但是,激活 WCSession 以将消息发送到其他设备失败并显示错误
[WC] -[WCXPCManager onqueue_reconnect]_block_invoke 错误由于 NSXPCConnectionInterrupted 重新连接到守护程序
被反复调用。
在尝试将消息发送到 IntentHandler 中的其他设备之前
func handle(intent: OurIntent, completion: @escaping (OurIntentResponse) -> Void)
Run Code Online (Sandbox Code Playgroud)
我们正在尝试在其最开始的时候激活会话
func confirm(intent: OurIntent, completion: @escaping (OurIntentResponse) -> Void) {
let _ = Communicator.sharedInstance
// ...
}
Run Code Online (Sandbox Code Playgroud)
Communicator 是作为单例实现的,尝试在其 intit 方法中激活会话,如下所示:
if WCSession.isSupported() {
let session = WCSession.default
session.delegate = self
session.activate() // fails with error mentioned above
}
Run Code Online (Sandbox Code Playgroud)
我们知道 Apple文档中提到的 App Extensions 中可用 API 的限制,但这里似乎并非如此,因为我们通过了 WCSession.isSupported()。
不在后台运行快捷方式,而是让它们打开应用程序当然可以解决问题,但这会使快捷方式在我们的情况下变得毫无用处。
有谁知道我们是否错过了在这里使用 WCSession 的任何先决条件,或者根本不可能?如前所述,我们目前只能在模拟器中进行测试。这可能是问题吗?
任何帮助深表感谢
由于优先事项发生变化,我们直到最近才继续使用 Siri 快捷方式。因为我们没有找到问题的解决方案,但我们的自定义 IntentResponses 也遇到了问题,所以我们决定处理 app/watchExtension 中的所有逻辑。因此,现在在 IntentHandler 的句柄方法中,我们只需将 .continueInApp 传递给完成块即可。然后,这会将应用程序带到前台,在那里调用现在实现的可选委托方法。
func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
if let intent = userActivity.interaction?.intent {
// make desired viewController frontmost
// ...
if intent is OurStartIntent {
// check state and send message to watch
}
else if intent is OurStopIntent {
// check state and send message to watch
}
}
// ...
Run Code Online (Sandbox Code Playgroud)
watch ExtensionDelegate 的等效方法是
func handle(_ userActivity: NSUserActivity)
Run Code Online (Sandbox Code Playgroud)
识别意图时,我们首先检查应用程序是否处于处理意图的状态,例如,使用 StartIntent 时进程尚未运行。这以前是我们为 IntentHandler 的确认方法设计的任务,并且我们为这些情况实现了自定义 IntentResponses。然而,只有当用户点击建议的快捷方式并收到无法处理此意图的解释时,这才有效。对于口头快捷方式,我们的 IntentResponses 被忽略。Siris 的回答总是:“抱歉,应用程序出现问题”。在我们的例子中,另一个小问题是上面提到的 watch ExtensionDelegate 方法由于某种原因总是被调用两次。此处还描述了通过传递时间戳的可能解决方案。
我希望这可以帮助某人。
托尔斯滕