3

语境

我正在努力将对 Siri Shortcuts (Intents?) 的支持添加到一个重要的应用程序中。我的主要目标是允许用户使用 Shortcuts.app 自动化应用程序中的一些任务。

我已经在目标中定义了MyIntent,与 一起,它具有输出属性。Intents.intentdefinitionIntents ExtensionMyIntentResponsefile: INFile

鉴于应用程序的非平凡性质,我将意图从Intent Extension主应用程序转发:

    func handle(intent: MyIntent, completion: @escaping (MyIntentResponse) -> Void) {
        // Can't handle the intent in the app extension yet, let the main app handle it
        let response = MyIntentResponse(code: .continueInApp, userActivity: nil)

        // TODO: How to update the response (with an output property) if the intent continues in the app?
        completion(response)
    }

问题

一旦意图被转发到应用程序,该AppDelegate.application(_:continue:restorationHandler:)方法就会被一个用户活动调用,该用户活动也具有该属性interaction: INInteraction?集。

从提供的内容中,INInteraction我可以同时获得intent: INIntentresponse: INIntentResponse来相应地处理意图。

然而,缺少的是如何与 Shortcuts.app 就意图的结果进行通信并提供所需的输出属性 ( file: INFile) 的方法。

问题

如果在主应用程序中处理意图,是否有办法提供带有输出属性集的意图响应?

细节

有趣的是,有一种AppDelegate方法可以处理这个用例:

optional func application(_ application: UIApplication, 
                   handle intent: INIntent, 
        completionHandler: @escaping (INIntentResponse) -> Void)

文件说:

带有 Intents 应用扩展的应用可以使用此方法直接处理意图,而不是在应用扩展中处理它。您可以使用此方法来实现无法在扩展中轻松实现的工作流。例如,您可以使用它来开始或管理用户的锻炼会话。如果您的应用程序未运行,SiriKit 会在后台启动您的应用程序,以便 Siri 界面保持活动状态。

更多信息:https ://developer.apple.com/documentation/uikit/uiapplicationdelegate/2887573-application

从理论上讲,应该可以只调用具有正确设置属性completionHandler的新实例化的。MyIntentResponsefile

但是,永远不会调用此方法。相反,上面提到AppDelegate.application(_:continue:restorationHandler:)的被调用。

4

1 回答 1

0

如果您在 Intents 扩展 handle() 函数中使用 .handleInApp 而不是 .continueInApp,则将调用您的应用委托的 handleIntent() 函数而不是 continue:restorationHandler() 函数。这将允许您将 INIntentResponse 传递回 completionHandler 中的扩展。

于 2020-03-10T20:44:35.267 回答