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

问题描述 投票:3回答:1

我们的应用程序还包含一个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的任何先决条件,或者根本不可能?如前所述,我们现在只能在模拟器中进行测试。这可能是问题吗?

任何帮助深表感谢

ios watchkit
1个回答
0
投票

由于优先级的改变,我们最近才继续使用Siri快捷方式。因为我们没有找到问题的解决方案,但是我们的自定义IntentResponses也遇到了问题,我们决定处理app / watchExtension中的所有逻辑。所以现在在我们的IntentHandler的handle方法中,我们只需将.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
        }
    }
// ...

手表ExtensionDelegate的等效方法是

func handle(_ userActivity: NSUserActivity)

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

我希望这可以帮助某人。

托尔斯滕

© www.soinside.com 2019 - 2024. All rights reserved.