Skip to content

快捷指令 #1

Description

@kirin233x

//
// 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: ", ")
}

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions