Siri快捷方式使用自定义意图和WCSession

6
我们的应用还包含一个手表扩展功能。该应用程序的一部分是在任一设备上启动或停止进程,并通过发送事件以及发生日期通知其对应方。现在,我们也想使用自定义意图的Siri快捷方式来完成此操作。目前,我们没有运行watchOS 5的手表,因此只能在模拟器中测试。

借鉴苹果公司SoupChef示例应用程序,我们成功地让快捷方式在两个设备上运行,并在后台执行所需的任务。但是,在激活WCSession以将消息发送到其他设备时,会出现错误

[WC] -[WCXPCManager onqueue_reconnect]_block_invoke error reconnecting to daemon due to NSXPCConnectionInterrupted

反复调用。

在尝试将消息发送到IntentHandler的其他设备之前,

func handle(intent: OurIntent, completion: @escaping (OurIntentResponse) -> Void)

我们正在尝试在会话开始时立即激活该会话。
func confirm(intent: OurIntent, completion: @escaping (OurIntentResponse) -> Void) {
    let _ = Communicator.sharedInstance

    // ...
}

Communicator被实现为一个单例,在其init方法中尝试激活会话,如下所示:

if WCSession.isSupported() {
  let session = WCSession.default
  session.delegate = self
  session.activate() // fails with error mentioned above
}

我们知道在苹果的 文档 中提到了App扩展中可用API的限制,但这似乎不是问题所在,因为我们通过了WCSession.isSupported()的测试。
当然,将快捷方式运行在打开应用程序而不是后台可能会解决问题,但在我们的情况下,这将使快捷方式变得相当无用。
有人知道我们是否遗漏了使用WCSession的前提条件,还是根本不可能使用它?就像之前所说,我们目前只能在模拟器上进行测试。这可能是问题吗?
非常感谢任何帮助。

你好。你解决了你的问题吗?我可能有类似的问题。我设法在快捷方式执行后从我的处理方法中激活会话,并在那里执行我的逻辑。但是在此之后,当我启动正常的手表应用程序时,它不再按预期工作。似乎会话出现了某些问题,因为它无法正确发送消息。 - Phil_G
嘿@Thorsten,我也遇到了同样的问题。尝试在原始意图处理程序的handler方法中更早地激活会话,但是我遇到了与您相同的错误。您有任何更新吗? - croX
1个回答

0
由于优先级的改变,我们最近才继续处理Siri快捷方式。因为我们没有找到解决方案,反而在自定义IntentResponses中遇到了一个问题,所以我们决定在我们的应用程序/手表扩展中处理所有逻辑。 因此,现在在我们的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
        }
    }
// ...

watch ExtensionDelegate 的等效方法是

func handle(_ userActivity: NSUserActivity)

在识别意图之前,我们首先检查应用程序是否处于处理该意图的状态,例如,在使用StartIntent时进程尚未运行。这以前是我们打算用IntentHandler的confirm方法来完成的任务,并为这些情况实现了自定义IntentResponses。但是,如果用户点击推荐的快捷方式并收到解释为什么不能处理此意图,则此方法仅在这种情况下有效。对于口头快捷方式,我们的IntentResponses被忽略了。Siri的答案总是:“很抱歉,应用程序出了问题。” 在我们的情况下,另一个虽然较小但也存在的问题是上述手表ExtensionDelegate方法由于某种原因总是被调用两次。同时,here中也描述了可能的解决方案,通过传递时间戳来解决。

我希望这可以帮助某些人。

Thorsten


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接