Siri Intent — механизм интеграции iOS-приложения с голосовым ассистентом Siri, позволяющий пользователям выполнять действия голосом без открытия приложения. Разработка ведётся на Swift с использованием фреймворков Intents (Intents.framework) и SiriKit. Начиная с iOS 16 появился App Intents — новый, более гибкий фреймворк для создания кастомных голосовых команд. Siri Intent поддерживает 10 доменов (сообщения, звонки, платежи, заметки, тренировки и другие) и позволяет приложению обрабатывать голосовые запросы через IntentHandler. Рассмотрим ключевые понятия, архитектуру и примеры кода.
Главное
Siri Intent — это механизм, позволяющий iOS-приложению обрабатывать голосовые команды, произнесённые пользователем через Siri. Когда пользователь говорит «Siri, отправь сообщение в Telegram Ивану», Siri распознаёт интент (INSendMessageIntent), определяет приложение, которое может его обработать (Telegram), передаёт параметры (контакт «Иван», текст сообщения) и запускает IntentHandler приложения. Весь процесс занимает 0.5–2 секунды и не требует открытия приложения.
Архитектура Siri Intent включает три компонента. Первый — .intentdefinition файл, описывающий структуру интента: параметры (String, Integer, INPerson), фразы-триггеры и ответы. Второй — IntentHandler, реализующий протокол обработки: получает параметры, выполняет действие (например, отправляет сообщение через API приложения) и возвращает INInteraction с кодом результата. Третий — Intents Extension, отдельный target в Xcode, работающий в собственном процессе. Siri запускает Intents Extension при голосовом запросе, передаёт ему данные и получает результат. Extension не имеет UI — он выполняется в фоне и должен завершиться за 5–10 секунд.
Варианты использования Siri Intent: отправка сообщений (INSendMessageIntent), совершение звонков (INStartCallIntent), отправка платежей (INSendPaymentIntent), создание заметок (INCreateNoteIntent), тренировки (INStartWorkoutIntent), фотографии (INSearchForPhotosIntent), бронирование поездок (INBookRestaurantReservationIntent), автомобильные функции (INSetCarLockStatusIntent). Каждый домен имеет строгую схему параметров и ограничения, определённые Apple для безопасности.
SiriKit — фреймворк, представленный Apple в iOS 10 (2016). Он предоставляет готовые домены (Intents) для типовых действий: сообщения, звонки, платежи, заметки, напоминания, фотографии, тренировки, бронирование, автомобильные функции, поиск. Для каждого домена Apple определила набор Intent-классов (INSendMessageIntent, INStartCallIntent), которые приложение реализует через IntentHandler. SiriKit автоматически генерирует UI-подтверждение перед выполнением (для платежей и сообщений подтверждение обязательно).
Домены SiriKit:
Ограничения SiriKit: разработчик не может создавать собственные домены — только использовать предопределённые. Это ограничение решено в iOS 16 с появлением App Intents, который позволяет создавать произвольные голосовые команды для любых действий приложения.
App Intents — фреймворк Apple, представленный в iOS 16 (2022) и значительно расширенный в iOS 17–18. В отличие от SiriKit с фиксированными доменами, App Intents позволяет разработчику определять собственные голосовые команды для любых действий приложения: «Siri, добавь молоко в список покупок в AnyList», «Siri, запиши встречу в Fantastical», «Siri, включи свет в гостиной в Home». Кастомные интенты определяются через протокол AppIntent с указанием параметров, фраз и схемы подтверждения.
Компоненты App Intents:
App Intents vs SiriKit: основное отличие — гибкость. SiriKit ограничен 10 доменами, App Intents позволяет создавать любые команды. SiriKit требует отдельного Intents Extension target, App Intents работает внутри основного приложения. SiriKit использует Intents.framework (Objective-C/Swift), App Intents — новый декларативный Swift-синтаксис с макросами @Intent, @Parameter. По данным Apple, App Intents используется в 70% новых проектов с поддержкой Siri на 2025 год.
Пример создания кастомного App Intent для добавления заметки в приложение. Демонстрирует современный подход с использованием фреймворка App Intents в iOS 16+.
import AppIntents
// 1. Кастомный Intent для добавления заметки
struct AddNoteIntent: AppIntent {
// Название команды (видно в Shortcuts)
static var title: LocalizedStringResource = "Добавить заметку"
// Описание команды
static var description: LocalizedStringResource = "Создаёт новую заметку в приложении"
// Параметры команды
@Parameter(title: "Текст заметки")
var noteContent: String
@Parameter(title: "Категория", default: "Общее")
var category: String
// Выполнение действия
func perform() async throws -> some IntentResult {
// Создаём заметку через локальное хранилище
let note = Note(content: noteContent, category: category)
try await NoteStore.shared.save(note)
// Возвращаем результат с диалогом для Siri
return .result(
dialog: .response("Заметка \"\(noteContent)\" создана")
)
}
}
// 2. App Shortcut Provider — регистрация команд
struct NotesShortcuts: AppShortcutsProvider {
@AppShortcutsBuilder
static var appShortcuts: [AppShortcut] {
AppShortcut(
intent: AddNoteIntent(),
phrases: [
"Добавить заметку в \(.applicationName)",
"Создать заметку с \(\.$noteContent) в \(.applicationName)",
"Запиши \(\.$noteContent) в \(.applicationName)",
]
)
}
}
// 3. SiriKit Intent для сообщений (классический подход)
class MessageIntentHandler: NSObject, INSendMessageIntentHandling {
func resolveRecipients(
for intent: INSendMessageIntent,
completion: @escaping ([INPersonResolutionResult]) -> Void
) {
guard let recipients = intent.recipients else {
completion([.needsRequired()])
return
}
// Разрешаем контакты через Address Book приложения
let results = recipients.map { INPersonResolutionResult.success(with: $0) }
completion(results)
}
func handle(
intent: INSendMessageIntent,
completion: @escaping (INSendMessageIntentResponse) -> Void
) {
// Отправляем сообщение через API приложения
let response = INSendMessageIntentResponse(
code: .success, userActivity: nil
)
completion(response)
}
}
Ключевые моменты: AppIntent — протокол для кастомной голосовой команды; @Parameter — макрос, определяющий параметры команды; perform() — метод, выполняющий действие и возвращающий результат с диалогом для Siri; AppShortcutsProvider — регистрирует команды приложения в Siri и Shortcuts; INSendMessageIntentHandling — протокол SiriKit для обработки домена сообщений. Фразы-триггеры задаются через .applicationName и \.$parameter для вариативности.
Рекомендации по созданию Siri Intent: определяйте понятные фразы-триггеры с вариантами произношения; возвращайте информативный диалог после выполнения (успех/ошибка); обрабатывайте случаи неполных параметров через resolve-методы с запросом уточнения; сохраняйте INInteraction после выполнения для обучения Siri; тестируйте на реальном устройстве (симулятор не поддерживает Siri). Для App Intents используйте @Intent с inAppSearchKeywords для улучшения распознавания.
Ограничения: SiriKit Intents ограничены 10 доменами. Intents Extension выполняется с лимитом 5–10 секунд — при превышении Siri сообщает об ошибке. Siri Intent не имеет UI — весь интерфейс генерируется Siri. App Intents доступны только на iOS 16+ (охват ~85% устройств на 2026). Для поддержки iOS 13–15 необходимо использовать SiriKit. Приватность: Siri не передаёт приложению аудиозапись — только распознанный текст параметров. Для конфиденциальных действий (платежи, сообщения) обязательно подтверждение от пользователя.
| Параметр | SiriKit | App Intents |
|---|---|---|
| Минимальная iOS | iOS 10 | iOS 16 |
| Домены | 10 предопределённых | Произвольные |
| Язык | Objective-C / Swift | Swift (макросы) |
| Target | Intents Extension | Основное приложение |
| UI | Siri UI (генерация) | Siri UI (генерация) |
| Подтверждение | Для платежей/сообщений | Опционально |
| Shortcuts | Вручную | Автоматически |
| Widget интеграция | Нет | WidgetIntent (iOS 17+) |
Производительность и отладка: Intents Extension запускается в отдельном процессе с ограничением памяти 30–50 МБ. Для отладки используйте схему «Intents Extension» в Xcode с аттачем к процессу Siri. Логи выводятся в консоль устройства. App Intents отлаживаются через приложение Shortcuts на устройстве. INInteraction сохраняется локально и используется Siri для предложений — удаляйте устаревшие взаимодействия через INInteraction delete.
Часто задаваемые вопросы
Siri Intent — это голосовая команда, которая запускает определённое действие в приложении без его открытия. Пользователь говорит «Siri, отправь сообщение в WhatsApp» и Siri выполняет действие через IntentHandler приложения WhatsApp.
SiriKit (iOS 10+) — старый фреймворк с предопределёнными доменами (сообщения, звонки, платежи). App Intents (iOS 16+) — новый фреймворк, позволяющий создавать кастомные интенты для любых действий без ограничения доменами.
SiriKit поддерживает 10 доменов: сообщения (INSendMessageIntent), звонки (INStartCallIntent), платежи (INSendPaymentIntent), заметки, напоминания, фотографии, тренировки, бронирование поездок, автомобильные функции и поиск.
Siri распознаёт речь и сопоставляет её с определённым Intent на основе фраз, заданных в .intentdefinition. IntentHandler выполняет действие и возвращает результат. Весь процесс занимает 0.5–2 секунды.
Да, после распознавания интента, но до его выполнения, Siri показывает пользователю подтверждение. Пользователь может отменить выполнение голосом («Отмена») или касанием. Для платежей и сообщений подтверждение обязательно.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также