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()
    }
}