【问题标题】:Siri shortcuts with custom intent utilizing WCSession使用 WCSession 的具有自定义意图的 Siri 快捷方式
【发布时间】:2018-10-22 09:41:06
【问题描述】:

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

在 Apples SoupChef 示例应用程序之后,我们设法让快捷方式在两台设备上运行,并根据需要在后台执行任务。但是激活 WCSession 以将消息发送到其他设备失败并出现错误

[WC] -[WCXPCManager onqueue_reconnect]_block_invoke 由于 NSXPCConnectionInterrupted 重新连接到守护进程时出错

被反复调用。

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

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

我们正在尝试在其一开始就激活会话

func confirm(intent: OurIntent, completion: @escaping (OurIntentResponse) -> Void) {
    let _ = Communicator.sharedInstance

    // ...
}

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

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

我们知道 Apple documentation 中提到的 App Extensions 中可用 API 的限制,但这里似乎并非如此,因为我们通过了 WCSession.isSupported()。

不在后台运行快捷方式但让它们打开应用程序当然可以解决问题,但这会使快捷方式在我们的案例中毫无用处。

有谁知道我们是否错过了在这里使用 WCSession 的任何先决条件,还是根本不可能?就像之前说的,我们目前只能在模拟器中测试。会不会是这个问题?

非常感谢任何帮助

【问题讨论】:

  • 嗨。你找到解决问题的方法了吗?我可能有类似的问题。在执行快捷方式后,我设法从我的句柄方法激活会话,并且可以在那里执行我的逻辑。但在那之后,当我启动普通的手表应用程序时,它不再按预期工作。似乎会话以某种方式搞砸了,因为它无法正确发送消息。
  • 嘿@Thorsten 我正在努力解决同样的问题。尝试在原始意图处理程序的 handler 方法中更早地激活会话。但是,我得到与您相同的错误。您对此有任何更新吗?

标签: ios watchkit


【解决方案1】:

由于优先级发生了变化,我们最近才继续使用 Siri 快捷方式。因为我们没有找到解决问题的方法,但我们的自定义 IntentResponses 也遇到了问题,所以我们决定处理我们的应用程序/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
        }
    }
// ...

watch ExtensionDelegate 的等效方法是

func handle(_ userActivity: NSUserActivity)

识别意图我们首先检查应用是否处于处理意图的状态,例如使用 StartIntent 时进程尚未运行。这以前是我们为 IntentHandler 的确认方法准备的任务,我们为这些情况实现了自定义 IntentResponse。但是,这只有在用户点击建议的快捷方式时才能正常工作,并收到解释为什么无法处理此意图。对于口语快捷方式,我们的 IntentResponses 被忽略了。 Siris 的回答总是:“抱歉,应用程序有问题”。 在我们的例子中,另一个小问题是上面提到的 watch ExtensionDelegate 方法由于某种原因总是被调用两次。还描述了here 以及通过传递时间戳的可能解决方案。

我希望这可能对某人有所帮助。

索斯滕

【讨论】:

    猜你喜欢
    • 2019-03-13
    • 2019-04-29
    • 1970-01-01
    • 2019-02-24
    • 2019-02-24
    • 1970-01-01
    • 2019-03-10
    • 2019-03-21
    • 1970-01-01
    相关资源
    最近更新 更多