//
// CarShortcuts.swift
// sample
//
// Created by Kirin on 2025/8/2.
//
import SwiftUI
import AppIntents
// 车辆控制快捷指令
struct CarControlIntent: AppIntent {
static var title: LocalizedStringResource = "车辆控制"
static var description: IntentDescription = IntentDescription("控制您的车辆各项功能")
@Parameter(title: "操作", description: "要执行的车辆操作")
var action: CarActionEnum
static var parameterSummary: some ParameterSummary {
Summary("\(\.$action)")
}
func perform() async throws -> some IntentResult & ProvidesDialog {
// 模拟车辆控制逻辑
let success = await controlVehicle(action: action)
if success {
let successMessage = action.successMessage
return .result(dialog: IntentDialog("操作成功"))
} else {
return .result(dialog: IntentDialog("操作失败,请稍后再试"))
}
}
// 模拟车辆控制逻辑
private func controlVehicle(action: CarActionEnum) async -> Bool {
// 记录操作日志
print("执行操作:\(action.displayName)")
// 模拟操作延迟
try? await Task.sleep(nanoseconds: 500_000_000) // 0.5秒延迟
// 95%的成功率
return Double.random(in: 0...1) < 0.95
}
}
// 快捷指令提供者
struct CarShortcutsProvider: AppShortcutsProvider {
static var appShortcuts: [AppShortcut] {
return [
AppShortcut(
intent: CarControlIntent(),
phrases: [
"使用(.applicationName)(.$action)",
"用(.applicationName)(.$action)",
"通过(.applicationName)(.$action)",
"(.applicationName)(.$action)",
"(.applicationName)帮我(.$action)",
"(.applicationName)我要(.$action)",
"(.applicationName)请(.$action)",
"打开(.applicationName)(.$action)"
],
systemImageName: "car.fill"
)
]
}
}
// 车辆操作枚举(合并了组件和操作)
enum CarActionEnum: String, Codable, Sendable, CaseIterable {
// 车辆锁相关
case unlockCar = "unlockCar"
case lockCar = "lockCar"
// 后备箱相关
case openTrunk = "openTrunk"
case closeTrunk = "closeTrunk"
// 前备箱相关
case openFrontTrunk = "openFrontTrunk"
case closeFrontTrunk = "closeFrontTrunk"
// 车窗相关
case openWindow = "openWindow"
case closeWindow = "closeWindow"
// 充电口相关
case openChargeHood = "openChargeHood"
case closeChargeHood = "closeChargeHood"
/// 操作的显示名称
var displayName: String {
switch self {
case .unlockCar:
return "解锁车辆"
case .lockCar:
return "闭锁车辆"
case .openTrunk:
return "打开后备箱"
case .closeTrunk:
return "关闭后备箱"
case .openFrontTrunk:
return "打开前备箱"
case .closeFrontTrunk:
return "关闭前备箱"
case .openWindow:
return "打开车窗"
case .closeWindow:
return "关闭车窗"
case .openChargeHood:
return "打开充电口"
case .closeChargeHood:
return "关闭充电口"
}
}
/// 操作成功后的消息
var successMessage: String {
switch self {
case .unlockCar:
return "车辆已解锁"
case .lockCar:
return "车辆已闭锁"
case .openTrunk:
return "后备箱已打开"
case .closeTrunk:
return "后备箱已关闭"
case .openFrontTrunk:
return "前备箱已打开"
case .closeFrontTrunk:
return "前备箱已关闭"
case .openWindow:
return "车窗已打开"
case .closeWindow:
return "车窗已关闭"
case .openChargeHood:
return "充电口已打开"
case .closeChargeHood:
return "充电口已关闭"
}
}
/// 操作对应的图标
var symbol: String {
switch self {
case .unlockCar:
return "lock.open.fill"
case .lockCar:
return "lock.fill"
case .openTrunk:
return "cube.box.fill"
case .closeTrunk:
return "car.rear.fill"
case .openFrontTrunk:
return "tray.fill"
case .closeFrontTrunk:
return "car.front.fill"
case .openWindow:
return "arrow.down.square.fill"
case .closeWindow:
return "car.side.fill"
case .openChargeHood:
return "ev.charger.fill"
case .closeChargeHood:
return "ev.plug.fill"
}
}
/// 获取组件类型
var componentType: ComponentType {
switch self {
case .unlockCar, .lockCar:
return .lock
case .openTrunk, .closeTrunk:
return .trunk
case .openFrontTrunk, .closeFrontTrunk:
return .frontTrunk
case .openWindow, .closeWindow:
return .window
case .openChargeHood, .closeChargeHood:
return .chargeHood
}
}
/// 获取操作类型
var actionType: ActionType {
switch self {
case .unlockCar, .openTrunk, .openFrontTrunk, .openWindow, .openChargeHood:
return .open
case .lockCar, .closeTrunk, .closeFrontTrunk, .closeWindow, .closeChargeHood:
return .close
}
}
}
// 辅助枚举 - 组件类型
enum ComponentType: String, CaseIterable {
case lock, trunk, frontTrunk, window, chargeHood
}
// 辅助枚举 - 操作类型
enum ActionType: String, CaseIterable {
case open, close
}
/// 将CarActionEnum注册为AppEnum,使其可用于AppIntent参数
extension CarActionEnum: AppEnum {
static var typeDisplayRepresentation: TypeDisplayRepresentation {
TypeDisplayRepresentation(
name: LocalizedStringResource("车辆操作"),
numericFormat: LocalizedStringResource("(placeholder: .int) 个操作")
)
}
/// 每个操作的显示表示
static let caseDisplayRepresentations: [CarActionEnum: DisplayRepresentation] = [
.unlockCar: DisplayRepresentation(
title: "解锁车辆",
subtitle: "解锁车门",
image: .init(systemName: "lock.open.fill")
),
.lockCar: DisplayRepresentation(
title: "闭锁车辆",
subtitle: "锁定车门",
image: .init(systemName: "lock.fill")
),
.openTrunk: DisplayRepresentation(
title: "打开后备箱",
subtitle: "打开车辆后备箱",
image: .init(systemName: "cube.box.fill")
),
.closeTrunk: DisplayRepresentation(
title: "关闭后备箱",
subtitle: "关闭车辆后备箱",
image: .init(systemName: "car.rear.fill")
),
.openFrontTrunk: DisplayRepresentation(
title: "打开前备箱",
subtitle: "打开车辆前备箱",
image: .init(systemName: "tray.fill")
),
.closeFrontTrunk: DisplayRepresentation(
title: "关闭前备箱",
subtitle: "关闭车辆前备箱",
image: .init(systemName: "car.front.fill")
),
.openWindow: DisplayRepresentation(
title: "打开车窗",
subtitle: "打开车辆车窗",
image: .init(systemName: "arrow.down.square.fill")
),
.closeWindow: DisplayRepresentation(
title: "关闭车窗",
subtitle: "关闭车辆车窗",
image: .init(systemName: "car.side.fill")
),
.openChargeHood: DisplayRepresentation(
title: "打开充电口",
subtitle: "打开车辆充电口",
image: .init(systemName: "ev.charger.fill")
),
.closeChargeHood: DisplayRepresentation(
title: "关闭充电口",
subtitle: "关闭车辆充电口",
image: .init(systemName: "ev.plug.fill")
)
]
}
// 数组扩展
extension Array where Element == CarActionEnum {
/// 将操作数组转换为本地化字符串数组
var localizedElements: [String] {
return compactMap { action in
CarActionEnum.caseDisplayRepresentations[action]?.title.key
}
}
/// 将操作数组转换为格式化的显示字符串
var formattedDisplayValue: String {
return localizedElements.joined(separator: ", ")
}
}
//
// CarShortcuts.swift
// sample
//
// Created by Kirin on 2025/8/2.
//
import SwiftUI
import AppIntents
// 车辆控制快捷指令
struct CarControlIntent: AppIntent {
static var title: LocalizedStringResource = "车辆控制"
static var description: IntentDescription = IntentDescription("控制您的车辆各项功能")
}
// 快捷指令提供者
struct CarShortcutsProvider: AppShortcutsProvider {
static var appShortcuts: [AppShortcut] {
return [
AppShortcut(
intent: CarControlIntent(),
phrases: [
"使用(.applicationName)(.$action)",
"用(.applicationName)(.$action)",
"通过(.applicationName)(.$action)",
"(.applicationName)(.$action)",
"(.applicationName)帮我(.$action)",
"(.applicationName)我要(.$action)",
"(.applicationName)请(.$action)",
"打开(.applicationName)(.$action)"
],
systemImageName: "car.fill"
)
]
}
}
// 车辆操作枚举(合并了组件和操作)
enum CarActionEnum: String, Codable, Sendable, CaseIterable {
// 车辆锁相关
case unlockCar = "unlockCar"
case lockCar = "lockCar"
}
// 辅助枚举 - 组件类型
enum ComponentType: String, CaseIterable {
case lock, trunk, frontTrunk, window, chargeHood
}
// 辅助枚举 - 操作类型
enum ActionType: String, CaseIterable {
case open, close
}
/// 将CarActionEnum注册为AppEnum,使其可用于AppIntent参数
extension CarActionEnum: AppEnum {
static var typeDisplayRepresentation: TypeDisplayRepresentation {
TypeDisplayRepresentation(
name: LocalizedStringResource("车辆操作"),
numericFormat: LocalizedStringResource("(placeholder: .int) 个操作")
)
}
}
// 数组扩展
extension Array where Element == CarActionEnum {
/// 将操作数组转换为本地化字符串数组
var localizedElements: [String] {
return compactMap { action in
CarActionEnum.caseDisplayRepresentations[action]?.title.key
}
}
}