1

如果我发帖不正确,我深表歉意,因为我对在这里发帖有点陌生。我目前正在尝试将 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)

    }

}

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

4

2 回答 2

0

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

从文档

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

• 在私有共享框架中实施您的核心服务。私有共享框架允许您将用于访问服务的代码放在一个代码模块中,并使用来自多个目标的代码。共享框架最大限度地减少了两个可执行文件的大小,并通过确保每个可执行文件使用相同的代码路径来简化测试。

• 使用共享容器来存储公共资源。将相关图像和数据文件放入共享容器中,以便您的应用和应用扩展可以使用它们。您可以在每个目标的 Capabilities 选项卡中启用共享容器支持。

于 2019-12-17T14:18:43.460 回答
0

根据文档

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

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

于 2019-10-03T13:54:22.767 回答