诗丽吉意图处理

Posted

技术标签:

【中文标题】诗丽吉意图处理【英文标题】:Sirikit intent handling 【发布时间】:2018-10-15 18:44:26 【问题描述】:

如果我发帖不正确,我深表歉意,因为我对在这里发帖有点陌生。我目前正在尝试将 siri 快捷方式添加到我的应用程序中。我已经创建了意图,并且能够正确处理它并使用虚拟数据创建响应。

但是,尽管将我的应用程序添加到意图处理程序类的目标中,但我无法从应用程序访问我的服务类和其他对象。

class IntentHandler: INExtension, TestIntentHandling 
        @available(ios 12.0, *)

    func confirm(intent: TestIntent, completion: @escaping (TestIntentResponse) -> Void) 
        print("HERE")
        completion(TestIntentResponse.init(code: .ready, userActivity: nil))
    


    @available(iOS 12.0, *)
    func handle(intent: TestIntent, completion: @escaping (TestIntentResponse) -> Void) 
        let response = TestIntentResponse.init(code: .success, userActivity: nil)

        //Trying to reach into service here to get real values

        response.workout = "Bench Press"
        response.weight = 150
        completion(response)

    


我想进入我的应用程序服务以在我的句柄函数中填充我的锻炼和体重字段,但我不断收到错误消息,说我的服务类不存在,希望有人能指出我的正确方向。谢谢!

【问题讨论】:

【参考方案1】:

根据the documentation:

当用户使用 Siri 或地图向您的应用发出请求时,SiriKit 会加载您的 Intents 应用扩展并创建其 INExtension 子类的实例。扩展对象的工作是为 SiriKit 提供用于处理特定意图的处理程序对象。您从扩展对象的 handler(for:) 方法中提供这些对象。

您需要调用handler(for:) 方法并返回适当的处理程序类(这将是您创建的类)。您的意图处理程序类,例如TestIntentHandler,将继承 NSObject 并符合您的 TestIntentHandling 协议。 TestIntentHandler 是您处理意图的地方。

【讨论】:

【参考方案2】:

您需要创建一个应用组并将您需要在应用和意图中使用的任何类和方法移动到两者之间共享的框架中。对于诸如小数据之类的事情,您可以使用 UserDefaults(suiteName: "your.app.group") 来使用共享的 UserDefaults。

From the docs:

如果您的应用和应用扩展共享服务,请考虑按以下方式构建您的代码:

• 在私有共享框架中实施您的核心服务。一种 私有共享框架允许您放置代码以访问您的 在一个代码模块中提供服务,并使用来自多个目标的代码。 共享框架最小化两个可执行文件的大小,并使 通过确保每个可执行文件使用相同的代码,测试更容易 路径。

• 使用共享容器来存储公共资源。把相关 图像和数据文件到一个共享容器中,以便您的应用程序和应用程序 扩展可以使用它们。您在 每个目标的功能选项卡。

【讨论】:

以上是关于诗丽吉意图处理的主要内容,如果未能解决你的问题,请参考以下文章

谷歌地图意图返回错误:没有找到处理意图的活动

多个意图打开错误活动的待处理意图

未找到处理意图的活动

BotBuilder Python - 处理多个对话和意图

如何使用意图传递处理程序

如何选择特定的应用程序来处理意图