Section 8/181 menit
8. AppShortcutsProvider: Ekspor Shortcut Otomatis
8. AppShortcutsProvider: Ekspor Shortcut Otomatis
AppShortcutsProvider mendefinisikan shortcut bawaan yang langsung tersedia di Siri tanpa user perlu buka Shortcuts app — disebut App Shortcuts.
swift
import AppIntents
struct TaskManagerShortcuts: AppShortcutsProvider {
// Warna accent di Shortcuts app
static var shortcutTileColor: ShortcutTileColor = .blue
static var appShortcuts: [AppShortcut] {
// Setiap AppShortcut = satu cara user trigger via Siri
AppShortcut(
intent: AddTaskIntent(),
phrases: [
"Tambah tugas di \(.applicationName)",
"Buat tugas baru di \(.applicationName)",
"Ingatkan saya di \(.applicationName)"
],
shortTitle: "Tambah Tugas",
systemImageName: "plus.circle"
)
AppShortcut(
intent: ShowPendingTasksIntent(),
phrases: [
"Tampilkan tugas saya di \(.applicationName)",
"Tugas apa yang belum selesai di \(.applicationName)"
],
shortTitle: "Tugas Saya",
systemImageName: "checklist"
)
AppShortcut(
intent: QuickTimerIntent(),
phrases: [
"Mulai timer fokus di \(.applicationName)",
"Pomodoro di \(.applicationName)"
],
shortTitle: "Timer Fokus",
systemImageName: "timer"
)
}
}
Phrase Variables: Parameter dalam Frasa Siri
swift
AppShortcut(
intent: CompleteTaskIntent(),
phrases: [
// \(.applicationName) — nama app
// \(\.$task) — nama parameter dari intent
"Selesaikan \(\.$task) di \(.applicationName)",
"Tandai \(\.$task) selesai di \(.applicationName)"
],
shortTitle: "Selesaikan Tugas",
systemImageName: "checkmark.circle"
)
Update Donations: Beri Tahu Sistem Data Berubah
swift
// Panggil saat data entity berubah agar Siri/Spotlight tetap sinkron
extension TaskRepository {
func create(title: String, priority: PriorityLevel, dueDate: Date?) async throws -> Task {
let task = Task(id: UUID(), title: title, isCompleted: false,
dueDate: dueDate, priority: priority)
// Simpan ke storage...
// Beritahu App Intents bahwa ada entity baru
await AppShortcuts.updateAppShortcutParameters()
return task
}
func delete(id: UUID) async throws {
// Hapus dari storage...
// Invalidate entity yang dihapus
await AppShortcuts.updateAppShortcutParameters()
}
}