Привет! С новым
Siri на базе ИИ компания
Apple обещает, что можно будет просто сказать «Найди ту футболку, которую я хотел купить пару месяцев назад» и
Siri найдет ответ. Но как это работает для сторонних приложений? В
iOS 27 обновился
Siri SDK. Теперь приложения могут лучше интегрироваться с голосовым ассистентом. Разберем ключевые улучшения.
AppEntity и IndexedEntity:
Для того чтобы ваши данные могли участвовать в запросах к
Siri, нужно создать легкую версию модели -
AppEntity. Это не сама модель, а ее описание для системы.
struct TeamEntity: AppEntity {
static var defaultQuery = TeamEntityQuery()
let id: String
@Property(title: "Team Name") var name: String
@Property(title: "Roster Size") var rosterSize: Int
}
Если ваши данные можно индексировать, достаточно добавить
IndexedEntity. Система автоматически проиндексирует контент и
Siri сможет его искать.
extension TeamEntity: IndexedEntity {}
С помощью
@Property(indexingKey:) можно указать, какие именно поля должны участвовать в поиске.
App Schemas:
Apple подготовила готовые схемы для популярных типов данных: сообщения, контакты, задачи. Если ваше приложение попадает в одну из этих категорий, нужно просто указать схему через
@AppEntity.
@AppEntity(schema: .messages.message)
struct MessageEntity: IndexedEntity {
@Property(indexingKey: \.textContent) var body: AttributedString?
}
Xcode подсказывает доступные поля.
Apple уже настроила
Siri на понимание этих схем - контекст, уточняющие вопросы и связки между действиями работают почти без дополнительного кода.
Главный вопрос: что делать, если ваше приложение не вписывается в готовые схемы? В документации пока нет четкого ответа.
On-screen Awareness:
Чтобы
Siri могла отвечать на вопросы о том, что сейчас на экране, есть два подхода.
NSUserActivity для одного элемента (например, фотографии).
View annotations для списков (например нескольких сообщений или контактов).
.userActivity("com.example.entity", element: entity.asEntity()) { entity, activity in
activity.title = entity.title
}
Или с помощью модификатора
.appEntityIdentifier.
.appEntityIdentifier(EntityIdentifier(for: Entity.self, identifier: p.id))
Передача данных через Transferable:
Для обмена данными между приложениями через
Siri (например «Отправь это письмо» или «Создай событие») используется
Transferable.
extension TeamEntity: Transferable {
static var transferRepresentation: some TransferRepresentation {
IntentValueRepresentation(
exporting: { entity in
IntentPerson(name: .displayName(entity.name))
},
importing: { person in
ContactEntity(name: person.name.displayString)
}
)
}
}
Важный момент: для работы с
IntentValueRepresentation нужно использовать встроенные типы
Apple (IntentPerson и подобные). Если ваше приложение не использует готовые схемы, непонятно, как правильно организовать обмен данными. В документации этот вопрос пока не раскрыт.
Вывод:
Новый
Siri SDK делает интеграцию с голосовым ассистентом более структурированной.
AppEntity,
IndexedEntity и готовые схемы закрывают большинство сценариев.
On-screen Awareness позволяет приложениям делиться контекстом с
Siri.
Transferable дает возможность передавать данные между приложениями.
Но есть белое пятно: что делать, если приложение не попадает в готовые схемы
Apple? Как использовать весь потенциал нового
Siri в этом случае? Ответа пока нет.
Тем не менее, для большинства приложений подход понятный и достаточно простой. Начать стоит с конформности
IndexedEntity - это самый быстрый способ сделать данные доступными для
Siri без глубокой перестройки архитектуры.