Интеграция Siri для голосового управления iOS-приложением
Siri Shortcuts позволяют пользователям запускать функции вашего приложения голосом без ручного открытия. Пользователь говорит «Эй Siri, добавь молоко в список» — и приложение обрабатывает команду в фоне, без показа интерфейса. Это не UIApplicationShortcutItem для 3D Touch — это полноценная NLP-интеграция через SiriKit.
Два подхода: Intents vs NSUserActivity
NSUserActivity + INVoiceShortcut — самый простой путь. Помечаем активность как «поддерживает Siri» и пользователь сам назначает ей фразу в настройках Shortcuts:
let activity = NSUserActivity(activityType: "com.yourapp.openDashboard")
activity.title = "Открыть дашборд"
activity.isEligibleForSearch = true
activity.isEligibleForPrediction = true // важно для Siri Suggestions
activity.suggestedInvocationPhrase = "Открой мой дашборд"
view.userActivity = activity
activity.becomeCurrent()
Когда пользователь произносит назначенную фразу — приложение открывается и получает activity через application(_:continue:restorationHandler:). Минус: не работает в background, требует открытия приложения.
INIntent + INExtension — мощнее. Команда обрабатывается в background через App Extension, не требуя открытия основного приложения. Именно так работает «Включи свет» или «Закажи такси».
Реализация через кастомный Intent
Xcode → File → New → Target → Intents Extension. Создаём .intentdefinition файл с описанием параметров:
Intent: AddItemIntent
Parameters:
- itemName: String (обязательный)
- listName: String (опциональный)
Response:
- success: "Добавлено \(itemName) в \(listName)"
- failure: "Не удалось добавить"
Handler в extension:
class AddItemIntentHandler: NSObject, AddItemIntentHandling {
func handle(intent: AddItemIntent,
completion: @escaping (AddItemIntentResponse) -> Void) {
guard let itemName = intent.itemName else {
completion(AddItemIntentResponse(code: .failure, userActivity: nil))
return
}
// Обращаемся к shared App Group container
let store = ListStore(appGroup: "group.com.yourapp")
store.addItem(itemName, to: intent.listName ?? "Основной список")
let response = AddItemIntentResponse(code: .success, userActivity: nil)
response.itemName = itemName
completion(response)
}
func resolveItemName(for intent: AddItemIntent,
with completion: @escaping (INStringResolutionResult) -> Void) {
if let name = intent.itemName, !name.isEmpty {
completion(.success(with: name))
} else {
completion(.needsValue())
}
}
}
App Groups — обязательны для доступа Extension к данным основного приложения. Extension и основной таргет добавляются в один App Group (group.com.yourapp), SharedFileList/UserDefaults с suite инициализируются через этот идентификатор.
Siri Vocabulary: повышаем точность распознавания
Для предметно-специфичных слов (имена, термины) — INVocabulary.shared().setVocabularyStrings(names, of: .contactGroupName). Для пользовательского контента (названия плейлистов, задач) — файл AppIntentVocabulary.plist в основном бандле с глобальными терминами.
Без этого Siri может транскрибировать «добавь в Inbox» как «добавь в inbox» (строчные) или «добавь в index» — особенно с нестандартными именами.
Тестирование
Симулятор поддерживает тестирование Intents через Xcode: запускаем схему Intents Extension с параметрами из .intentdefinition. Но голосовое распознавание — только на реальном устройстве. Первый прогон Intent-запроса занимает время: Siri обучает свою модель под пользователя.
Инструмент отладки — os_log с subsystem com.apple.siri, плюс стандартный Xcode Console при запущенном extension.
Процесс работы
Анализ функционала приложения: что имеет смысл вызывать голосом, какие параметры.
Выбор подхода: NSUserActivity (простые навигационные shortcuts) или кастомные Intents (действия в фоне).
Разработка: .intentdefinition, Intent Handler, App Groups для shared state.
Регистрация Intent в Info.plist основного приложения и extension.
Тестирование на реальном устройстве, Siri Vocabulary для специфичных терминов.
Ориентиры по срокам
Простые shortcuts через NSUserActivity — 1 день. Кастомный INIntent с App Extension и App Groups — 3–5 дней с учётом тестирования на устройстве и настройки Vocabulary.







