参数化的应用程序意图如何在“首屏下方”显示附加参数?

Sco*_*man 9 ios swift swiftui appintents

我正在使用App Intents 框架将 App Intents 添加到我的 iOS16 应用程序中。

\n

我想要添加的意图之一是打开应用程序数据库中所有事件的列表视图。应用程序中的视图有许多可用的过滤器,我正在尝试在意图中复制其中一些过滤器。

\n

我有几个已编码为 \xe2\x80\x93 的选项,其中一个AppEnum显示时间范围(过去/未来/所有事件),以及一个出版物选择器(每个事件可以有零个或一个出版物)。

\n

按照 WWDC2022 会议“深入了解应用程序意图”中演示的技术,我已经成功实现了:

\n
struct OpenEventsList: AppIntent {\n    static var title: LocalizedStringResource = "Open Events List"\n    static var openAppWhenRun: Bool = true\n\n    @Parameter(title: "Scope")\n    var scope: TimeScope\n\n    @Parameter(title: "Publication")\n    var publication: PublicationEntity?\n\n    static var parameterSummary: some ParameterSummary {\n        Summary("Open \\(\\.$scope) for \\(\\.$publication)")\n    }\n\n    @MainActor\n    func perform() async throws -> some IntentResult {\n        // implementation omitted\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这会产生一个有效的快捷操作:

\n

已填充参数的快捷操作示例

\n

在 WWDC 演讲中,演讲者说道:

\n
\n

您还可以定义哪些参数显示在首屏下方,哪些参数隐藏。这些 API 可以做一些非常酷的事情,例如根据意图的任何参数的实际值改变摘要,使用 When 和 Another API,或者 Switch、Case 和 Default API

\n
\n

...但我找不到任何解释这些 API 的地方。苹果的文档列出了一些涉及的协议,但仅此而已。

\n

我希望能够将出版物选项移到折叠下方,因此默认参数摘要仅包括基于时间的选项,如果操作框展开,则还包括出版物选项(以及我稍后可能添加的其他选项) )被揭露。

\n

小智 12

Booky示例项目对于实现AppIntents 非常有用。您可以在这里找到您想要执行的操作的示例:Booky at AddBook.swift (L43-L48)

因此,您需要通过在括号内添加参数键路径将其转换ParameterSummary为 a :ParameterSummaryBuilder

static var parameterSummary: some ParameterSummary {
    Summary("Open \(\.$scope)") {
        \.$publication
        // you can add as many as you want
    }
}
Run Code Online (Sandbox Code Playgroud)

实现过滤的另一个好方法是通过EntityPropertyQuery.

这将自动创建一个快捷方式,其名称Find <entity name>可以应用所有这些过滤器和排序,并返回您可以操作的 AppEntities 列表。

如果您想查看生产中使用的示例,在Lunar (用于控制显示器的应用程序)中,我实现了一个更复杂的屏幕查询,您可以在这里找到:alin23/Lunar at LunarShortcuts.swift (L150-L385)

以下是 Shortcuts.app 中生成的内容的屏幕截图:

显示在 Lunar 中实现的“查找屏幕”操作的快捷方式应用程序的屏幕截图