iOS 17中带参数的App Shortcut在Spotlight显示异常求助
解决iOS 17 App Shortcuts参数化快捷方式显示异常问题
针对你遇到的带视图参数的App Shortcut在Spotlight无图标标题、Shortcuts应用内仅显示旧版条目的问题,可通过以下步骤修复:
1. 拆分参数化与非参数化App Shortcut实例
iOS 17对包含动态参数的短语需要单独定义AppShortcut实例,不能将带参数和不带参数的短语合并在同一个实例中。修改AppShortcuts代码:
struct AppShortcuts: AppShortcutsProvider { static var shortcutTileColor: ShortcutTileColor = .grape static var appShortcuts: [AppShortcut] { // 无参数:直接打开应用 AppShortcut( intent: OpenAppIntent(), phrases: ["Open \(.applicationName)"], shortTitle: "Open", systemImageName: "arrow.up.forward.app" ) // 带视图参数:打开指定标签页 AppShortcut( intent: OpenAppIntent(), phrases: ["Open \(\.$view) in \(.applicationName)"], shortTitle: "Open \(\.$view)", systemImageName: "\(\.$view.systemImageName)" ) // 其他App Shortcuts … } }
为了让参数化快捷方式能正确引用对应图标,给AppView添加计算属性获取图标名称:
extension AppView { var systemImageName: String { switch self { case .insights: return "chart.xyaxis.line" case .events: return "calendar" case .meters: return "barometer" } } }
2. 完善Intent的参数摘要与元数据
确保OpenAppIntent的元数据完整,特别是参数摘要,让系统能正确识别参数化操作的显示逻辑:
struct OpenAppIntent: AppIntent { static let openAppWhenRun: Bool = true @Parameter(title: "View", description: "The view inside the app.", default: .insights, requestValueDialog: IntentDialog("Where would you like to navigate to?")) var view: AppView static var title: LocalizedStringResource { "Open App View" } static var description: IntentDescription { IntentDescription("Opens the app to a specific view.") } static var parameterSummary: some ParameterSummary { Summary("Open \(\.$view) in \(.applicationName)") } func perform() async throws -> some IntentResult { // 实现导航到指定view的逻辑 return .result() } }
3. 验证本地化资源与系统缓存
- 检查
Shortcuts.strings本地化文件,确保所有AppView对应的标题(如"Insights")都有正确的键值对,避免因本地化缺失导致显示异常。 - 卸载应用、重启设备后重新安装,清除系统缓存的旧快捷方式数据。
- 在Shortcuts应用中下拉刷新"我的快捷方式"列表,确认新的参数化快捷方式正常显示。
4. 检查AppEnum的显示配置
确保AppView的AppEnum扩展中,caseDisplayRepresentations的每个条目都正确关联了标题和图标,且TypeDisplayRepresentation的名称准确:
extension AppView: AppEnum { static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "View") static var caseDisplayRepresentations: [Self : DisplayRepresentation] = [ .insights: DisplayRepresentation(title: LocalizedStringResource("Insights", table: "Shortcuts", comment: "App View Label"), image: .init(systemName: "chart.xyaxis.line")), .events: DisplayRepresentation(title: LocalizedStringResource("Events", table: "Shortcuts", comment: "App View Label"), image: .init(systemName: "calendar")), .meters: DisplayRepresentation(title: LocalizedStringResource("Meters", table: "Shortcuts", comment: "App View Label"), image: .init(systemName: "barometer")) ] }
内容的提问来源于stack exchange,提问作者alexkaessner
相关产品推荐
相关产品推荐

