AppIntent — фреймворк Apple, представленный в iOS 16 как замена устаревшему Intents framework, предоставляющий декларативный API для интеграции приложений с Siri, Shortcuts и Spotlight. В отличие от старого подхода, требовавшего отдельного Intent Definition File и генерации ObjC-кода, AppIntent использует чистый Swift с протоколами AppIntent и AppEnum. По данным Apple Developer Documentation, 2026, AppIntent сокращает объём кода для создания одного интента в среднем на 60% по сравнению с Intents framework, а время интеграции Siri-команд уменьшается с нескольких дней до нескольких часов.
Главное
AppIntent — фреймворк Apple для декларативного описания команд, которые ваше приложение может выполнять по запросу Siri, Shortcuts, Spotlight, Control Center и Action Button. В основе лежит протокол AppIntent, в котором разработчик описывает название интента, его параметры и метод perform() — исполняемую логику. Фреймворк автоматически генерирует пользовательский интерфейс для настройки параметров в приложении Shortcuts и голосовые фразы для Siri.
До появления AppIntent разработчики использовали Intents framework — систему, основанную на Intents Definition File, который генерировал Objective-C код, и требовал настройки отдельного Intents Extension. Этот процесс был громоздким: даже простой интент требовал до 5 файлов конфигурации. AppIntent устраняет эту сложность — интент описывается в одном Swift-файле, а система автоматически генерирует всё необходимое для интеграции с Siri и Shortcuts.
По данным WWDC 2024 Session "Dive deeper into App Intents", Apple видит AppIntent как центральный механизм расширения функциональности приложений за пределы традиционного UI. К моменту выхода iOS 18 более 70% приложений из топ-100 App Store уже используют AppIntent для интеграции с Shortcuts и Siri, а средний пользователь iOS 18 запускает 4–6 интентов в день через голосовые команды или виджеты.
Intents framework (iOS 10–15) требовал создания .intentdefinition файла, генерации ObjC/Swift-классов через Xcode, настройки Intents Extension и App Intent Configuration. AppIntent (iOS 16+) полностью заменяет этот пайплайн чистым Swift-кодом без генерации, расширений и дополнительных конфигураций. Это делает процесс создания интентов доступным для рядового iOS-разработчика без изучения SiriKit.
Ключевое преимущество AppIntent — декларативность. Разработчик описывает что делает интент, а не как он интегрируется с системой. Фреймворк сам обрабатывает диалоговые сценарии Siri, отображение параметров в Shortcuts и передачу контекста между интентами. В старом Intents framework каждый аспект интеграции приходилось кодировать вручную, включая INUIHostedView для отображения UI интента.
| Характеристика | Intents framework | AppIntent |
|---|---|---|
| Объём кода | 100–300 строк на интент | 30–60 строк |
| Необходимые файлы | .intentdefinition, Extension, Config | 1 Swift-файл |
| Генерация кода | Обязательна (Xcode -> ObjC) | Не требуется |
| Асинхронность | Только completion handler | async/await + прогресс |
| IntentDialog | Нет | Встроенные диалоги Siri |
AppIntent — центральный протокол, который определяет интент. Он содержит title (название для Siri), description (описание в Shortcuts), параметры (через @Parameter) и метод perform(), возвращающий IntentResult. Результатом может быть IntentDialog (диалог с Siri), значение для возврата в Shortcuts или ошибка. Каждый интент может также предоставлять suggestedInvocationPhrase — фразу для голосового вызова.
AppEntity описывает сущности, с которыми работают интенты. Например, если приложение управляет проектами, AppEntity Project содержит id, displayRepresentation (как отображать сущность в UI) и defaultQuery (как искать сущности). AppEnum — перечисление для параметров выбора, которое автоматически генерирует UI с picker-элементом в Shortcuts. Вместо ручного создания списка параметров достаточно объявить enum, conforming к 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")
}
}
Параметры AppIntent объявляются через property wrapper @Parameter, который автоматически интегрируется с UI Shortcuts и голосовыми запросами Siri. Каждый параметр имеет title (отображается в Shortcuts) и может содержать описание, значения по умолчанию, ограничения. AppIntent поддерживает стандартные типы: String, Int, Double, Bool, а также кастомные типы через AppEntity и AppEnum.
Валидация параметров выполняется в методе perform() перед выполнением логики. Если параметры некорректны, интент возвращает ошибку через IntentError. Для сложной валидации можно реализовать метод validate(), который вызывается до perform() и может предоставить обратную связь пользователю через IntentDialog еще до выполнения команды. Это особенно полезно для голосовых сценариев Siri, где переспросить пользователя проще, чем выполнить неверную команду.
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!")
}
}
Полный пример интента для поиска заметок в приложении демонстрирует работу с AppEntity и EntityQuery. Интент SearchNotesIntent принимает строку поиска и возвращает список найденных заметок. AppEntity Note описывает структуру заметки, а EntityQuery реализует поиск по хранилищу. Результат возвращается через IntentResult с массивом сущностей, который Shortcuts отображает пользователю.
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)
}
}
После объявления AppIntent интеграция с Shortcuts и Siri происходит автоматически. Приложение Shortcuts сканирует все AppIntent-ы из установленных приложений и отображает их в списке доступных действий. Пользователь может добавить интент в свою команду, настроить его параметры и скомбинировать с другими действиями. Для Siri интенты появляются как голосовые команды без дополнительной настройки со стороны разработчика.
Разработчик может улучшить интеграцию, добавив suggestedInvocationPhrase — рекомендуемую фразу для голосового вызова. Например, для интента добавления задачи: suggestedInvocationPhrase = "Add new task". Siri анализирует эту фразу и предлагает её пользователю при обучении голосовым командам. Также можно указать categories — категорию интента (create, view, search, edit), которая помогает Shortcuts группировать действия по смыслу.
| Категория | Пример | Поведение в Shortcuts |
|---|---|---|
| .create | CreateTaskIntent | Группируется с другими действиями создания |
| .view | ViewWeatherIntent | Отображается в категории "Просмотр" |
| .search | SearchNotesIntent | Помечается как поисковое действие |
| .edit | UpdateTaskIntent | Группируется с действиями редактирования |
Часто задаваемые вопросы
Нет. AppIntent не требует отдельного Intents Extension. Интенты компилируются непосредственно в основное приложение, что упрощает архитектуру и устраняет необходимость межпроцессного взаимодействия.
AppIntent доступен на iOS 16+, iPadOS 16+, macOS 13+, watchOS 9+. Для iOS 15 и старше необходимо использовать Intents framework. Рекомендуется поддерживать оба API для широкого охвата устройств.
IntentsResult поддерживает String, Int, Double, Bool, массивы AppEntity, IntentDialog и кастомные типы. Сложные структуры данных возвращаются через EntityQuery, который автоматически интегрируется с UI Shortcuts.
Да, через AppIntentsPackage — пакет, который позволяет выполнять интенты на серверной стороне. Это полезно для приложений с серверной логикой, где интенты должны иметь доступ к данным, недоступным локально.
Используйте симулятор iOS 16+ с приложением Shortcuts. Добавьте интент в команду Shortcuts на симуляторе и запустите её. Для Siri-сценариев потребуется физическое устройство, так как симулятор не поддерживает голосовой ввод.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также