AppIntent — framework Apple, představený v iOS 16 jako náhrada zastaralého Intents framework, poskytující deklarativní API pro integraci aplikací se Siri, Shortcuts a Spotlight. Na rozdíl od starého přístupu, který vyžadoval samostatný Intent Definition File a generování ObjC kódu, AppIntent používá čistý Swift s protokoly AppIntent a AppEnum. Podle Apple Developer Documentation, 2026, AppIntent snížuje objem kódu pro vytvoření jednoho intentu v průměru o 60% ve srovnání s Intents framework a doba integrace příkazů Siri se zkrátí z několika dní na několik hodin.
Hlavní body
AppIntent — framework Apple pro deklarativní popis příkazů, které může vaše aplikace provádět na požádání Siri, Shortcuts, Spotlight, Control Center a Action Button. V základu je protokol AppIntent, ve kterém vývojář popisuje název intentu, jeho parametry a metodu perform() — prováděnou logiku. Framework automaticky generuje uživatelské rozhraní pro konfiguraci parametrů v aplikaci Shortcuts a hlasové fráze pro Siri.
Před příchodem AppIntent používali vývojáři Intents framework — systém založený na Intents Definition File, který generoval kód Objective-C a vyžadoval konfiguraci samostatného Intents Extension. Tento proces byl komplikovaný: i jednoduchý intent vyžadoval až 5 konfiguračních souborů. AppIntent tuto složitost odstraňuje — intent je popsán v jednom Swift souboru a systém automaticky generuje vše potřebné pro integraci se Siri a Shortcuts.
Podle WWDC 2024 Session „Dive deeper into App Intents“, Apple vidí AppIntent jako centrální mechanismus pro rozšíření funkčnosti aplikací nad rámec tradičního UI. V době vydání iOS 18 více než 70% aplikací z top 100 App Store již používá AppIntent pro integraci s Shortcuts a Siri a průměrný uživatel iOS 18 spouští 4–6 intentů denně pomocí hlasových příkazů nebo widgetů.
Intents framework (iOS 10–15) vyžadoval vytvoření .intentdefinition souboru, generování ObjC/Swift tříd přes Xcode, konfiguraci Intents Extension a App Intent Configuration. AppIntent (iOS 16+) zcela nahrazuje toto potrubí čistým Swift kódem bez generování, rozšíření a dalších konfigurací. To činí proces vytváření intentů dostupným pro běžného iOS vývojáře bez nutnosti učení SiriKit.
Klíčovou výhodou AppIntent je deklarativnost. Vývojář popisuje, co intent dělá, ne jak je integrován se systémem. Framework sám zpracovává dialogové scénáře Siri, zobrazení parametrů v Shortcuts a předávání kontextu mezi intenty. Ve starém Intents framework musel být každý aspekt integrace kódován ručně, včetně INUIHostedView pro zobrazení UI intentu.
| Charakteristika | Intents framework | AppIntent |
|---|---|---|
| Objem kódu | 100–300 řádků na intent | 30–60 řádků |
| Potřebné soubory | .intentdefinition, Extension, Config | 1 Swift soubor |
| Generování kódu | Povinné (Xcode -> ObjC) | Není vyžadováno |
| Asynchronita | Pouze completion handler | async/await + průběh |
| IntentDialog | Ne | Vestavěné dialogy Siri |
AppIntent — centrální protokol, který definuje intent. Obsahuje title (název pro Siri), description (popis v Shortcuts), parametry (přes @Parameter) a metodu perform() vracející IntentResult. Výsledkem může být IntentDialog (dialog se Siri), hodnota pro vrácení do Shortcuts nebo chyba. Každý intent může také poskytovat suggestedInvocationPhrase — frázi pro hlasové volání.
AppEntity popisuje entity, se kterými intenty pracují. Například, pokud aplikace spravuje projekty, AppEntity Project obsahuje id, displayRepresentation (jak zobrazit entitu v UI) a defaultQuery (jak vyhledávat entity). AppEnum — výčet pro parametry výběru, který automaticky generuje UI s prvkem picker v Shortcuts. Místo ručního vytváření seznamu parametrů staāčí deklarovat enum, který je v souladu s AppEnum.
enum TaskPriority: String, AppEnum {
case low, medium, high
static var typeDisplayRepresentation: TypeDisplayRepresentation =
"Priority"
var displayRepresentation: DisplayRepresentation {
switch self {
case .low: "Low"
case .medium: "Medium"
case .high: "High"
}
}
}
struct CreateTaskIntent: AppIntent {
static var title: LocalizedStringResource = "Create Task"
@Parameter(title: "Task Name")
var taskName: String
@Parameter(title: "Priority")
var priority: TaskPriority
func perform() async throws -> some IntentResult {
try await TaskManager.shared
.createTask(name: taskName, priority: priority)
return .result(dialog: "Task created")
}
}
Parametry AppIntent jsou deklarovány prostřednictvím property wrapper @Parameter, který se automaticky integruje s UI Shortcuts a hlasovými požadavky Siri. Každý parametr má title (zobrazený v Shortcuts) a může obsahovat popis, výchozí hodnoty, omezení. AppIntent podporuje standardní typy: String, Int, Double, Bool, stejně jako vlastní typy prostřednictvím AppEntity a AppEnum.
Validace parametrů se provádí v metodě perform() před provedením logiky. Pokud jsou parametry nesprávné, intent vrátí chybu prostřednictvím IntentError. Pro složitou validaci lze implementovat metodu validate(), která je volána před perform() a může poskytnout zpětnou vazbu uživateli prostřednictvím IntentDialog ještě před provedením příkazu. To je zvláště užitečné v hlasových scénářích Siri, kde je snazší znovu se zeptat uživatele než provést nesprávný příkaz.
struct SendMessageIntent: AppIntent {
static var title: LocalizedStringResource = "Send Message"
@Parameter(title: "Recipient")
var recipient: String
@Parameter(title: "Message")
var message: String
func validate() throws {
guard message.count >= 1 else {
throw IntentError.invalidMessage
}
}
func perform() async throws -> some IntentResult {
try await Messenger.shared
.send(recipient: recipient, text: message)
return .result(dialog: "Sent!")
}
}
Úplný příklad intentu pro vyhledávání poznámek v aplikaci demonstruje práci s AppEntity a EntityQuery. Intent SearchNotesIntent přijímá vyhledávací řetězec a vrací seznam nalezených poznámek. AppEntity Note popisuje strukturu poznámky a EntityQuery implementuje vyhledávání v úložišti. Výsledek je vrácen prostřednictvím IntentResult s polem entit, které Shortcuts zobrazí uživateli.
struct Note: AppEntity {
let id: UUID
let title: String
let content: String
static var typeDisplayRepresentation: TypeDisplayRepresentation =
"Note"
var displayRepresentation: DisplayRepresentation {
DisplayRepresentation(title: "(title)")
}
}
struct SearchNotesIntent: AppIntent {
static var title: LocalizedStringResource = "Search Notes"
@Parameter(title: "Query")
var query: String
func perform() async throws -> some IntentResult {
let results = await NoteStore.shared
.search(query)
.map { $0.toEntity() }
return .result(value: results)
}
}
Po deklarování AppIntent probíhá integrace s Shortcuts a Siri automaticky. Aplikace Shortcuts skenuje všechny AppIntent z nainstalovaných aplikací a zobrazuje je v seznamu dostupných akcí. Uživatel může přidat intent do svého příkazu, nakonfigurovat jeho parametry a zkombinovat s jinými akcemi. Pro Siri se intenty objevují jako hlasové příkazy bez další konfigurace ze strany vývojáře.
Vývojář může zlepšit integraci přidáním suggestedInvocationPhrase — doporučené fráze pro hlasové volání. Například pro intent přidání úkolu: suggestedInvocationPhrase = "Add new task". Siri analyzuje tuto frázi a nabídne ji uživateli při učení hlasových příkazů. Také lze určit categories — kategorii intentu (create, view, search, edit), která pomáhá Shortcuts seskupovat akce podle významu.
| Kategorie | Příklad | Chování v Shortcuts |
|---|---|---|
| .create | CreateTaskIntent | Seskupeno s ostatními akcemi vytváření |
| .view | ViewWeatherIntent | Zobrazeno v kategorii „Zobrazení“ |
| .search | SearchNotesIntent | Označeno jako vyhledávací akce |
| .edit | UpdateTaskIntent | Seskupeno s akcemi úprav |
Často kladené otázky
Ne. AppIntent nevyžaduje samostatný Intents Extension. Intenty jsou kompilovány přímo do hlavní aplikace, což zjednodušuje architekturu a odstraňuje potřebu meziprocesové komunikace.
AppIntent je dostupný na iOS 16+, iPadOS 16+, macOS 13+, watchOS 9+. Pro iOS 15 a starší je třeba použít Intents framework. Doporučuje se podpora obou API pro široké pokrytí zařízení.
IntentsResult podporuje String, Int, Double, Bool, pole AppEntity, IntentDialog a vlastní typy. Složité datové struktury jsou vraceny prostřednictvím EntityQuery, který se automaticky integruje s UI Shortcuts.
Ano, prostřednictvím AppIntentsPackage — balíčku, který umožňuje provádění intentů na straně serveru. To je užitečné pro aplikace se serverovou logikou, kde intenty potřebují přístup k datům nedostupným lokálně.
Použijte simulátor iOS 16+ s aplikací Shortcuts. Přidejte intent do příkazu Shortcuts na simulátoru a spusťte jej. Pro scénáře Siri je potřebné fyzické zařízení, protože simulátor nepodporuje hlasový vstup.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také