Быстрые команды Siri — как их реализовать?
Опубликовано: 2020-01-16Ярлыки Siri, новая функция, представленная на прошлогодней конференции WWDC, позволяют выполнять определенные функции приложения в фоновом режиме. Нам не нужно включать приложение, чтобы использовать эти функции в приложении, мы можем просто сказать Siri, например, «Время бургера», и система узнает, какому приложению назначен этот ярлык, и закажет для нас бургер.
Что такое ярлыки Siri?
- Удобный способ выполнять задачи с экрана блокировки или из области поиска.
- В Siri также можно добавить ярлыки для запуска с голосовой фразой на iOS, HomePod и watchOS.
- Разработчики добавляют в свои приложения ярлыки, которые позволяют Siri подключаться к этим ярлыкам.
- Использование моделей машинного обучения вашего поведения для анализа общих функций, которые вы выполняете, и автоматического предложения ярлыков.
- iOS 12+
В этой статье мы сосредоточимся на реализации ярлыка заказа, одного из самых популярных приложений Siri Shortcuts. Мы создадим простое приложение, которое позволит вам заказывать бургеры
Как мы можем создавать ярлыки Siri?

- В самом начале мы должны подумать о функциональности, которую пользователь действительно хочет упростить в нашем приложении . Это должна быть функциональность, которую пользователь выполняет часто и требует от пользователя входа в приложение и прохождения в нем длинного пути. Ярлыки позволят сократить этот путь для выполнения функциональности.
- На следующем шаге вам нужно пожертвовать ярлык. Что это значит? Мы должны передать в систему информацию о том, что мы сделали заказ, например один бургер с беконом. Мы предоставляем эту информацию системе, и позже Siri может предложить нам в определенное время сделать этот конкретный заказ.
- Последнее, что нужно сделать, — это обработать этот ярлык, что происходит, когда пользователь говорит Siri команду, определенную ранее , например, «Время бургера», или в случае, когда пользователь нажимает ярлык, предложенный Siri, на экране блокировки.
Хорошо, может быть, мы напишем код? Каковы наши возможности как разработчиков?

NSUserActivity — мы создадим ярлык, который позволит нам запустить экран для создания нового заказа.
- Добавьте ключ в Info.plist
<key>NSUserActivityTypes</key> <массив> <string>com.miquido.SiriShotcutDemo.make-order</string> </массив>
2. Пожертвовать ярлык, когда пользователь входит в экран
пусть orderActivity = NSUserActivity (activityType: "com.miquido.SiriShotcutDemo.make-order") orderActivity.persistentIdentifier = NSUserActivityPersistentIdentifier("com.miquido.SiriShotcutDemo.make-order") orderActivity.isEligibleForSearch = истина orderActivity.isEligibleForPrediction = истина orderActivity.title = "Сделать заказ" orderActivity.suggestedInvocationPhrase = "Время бургеров" атрибуты let = CSSearchableItemAttributeSet (itemContentType: kUTTypeItem as String) attribute.contentDescription = "Вкусные гамбургеры!" attribute.thumbnailData = UIImage(название: «логотип»)?.pngData() orderActivity.contentAttributeSet = атрибуты активность пользователя = активность заказа
3. В AppDelegate
вы должны реализовать делегат continueUserActivity
, который после получения этого конкретного типа будет перенаправлять на данный экран
func application(_ application: UIApplication, продолжить userActivity: NSUserActivity, restoreHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { если userActivity.activityType == "com.miquido.SiriShotcutDemo.make-order" { // обрабатывать открытое приложение на экране заказа вернуть истину } вернуть ложь }

Намерения — Мы реализуем ярлык для выполнения заказов
Профессиональный совет перед внедрением:
Намерения появляются, когда пользователь делает что-то систематически. Однако, если вы хотите протестировать эту функцию, чтобы вы всегда получали предложение от Siri, вы должны включить две опции — « Отображать последние ярлыки » и « Отображать пожертвования на экране блокировки » в «Настройки» -> «Разработчик».

- Создайте файл определения намерения. Лучше всего добавить его в отдельный фреймворк, в моем проекте он будет в
OrderKit
.

2. Выберите категорию, в данном случае «Заказ». В этом файле мы должны выбрать параметры, которые мы будем передавать в систему, и создать комбинации этих параметров.


3. Создайте новую цель с расширением для намерений, при создании выберите «Включить расширение пользовательского интерфейса».



Order.intentdefinition
4. Создайте пользовательский интерфейс для намерения в файле MainInterface.storyboard
.

5. Настройте состояние ready
и success
в IntentViewController
.
func configureView(для параметров: Set<INParameter>, взаимодействия: INInteraction, интерактивное поведение: INUIInteractiveBehavior, контекст: INUIHostedViewContext, завершение: @escaping (Bool, Set<INParameter>, CGSize) -> Void) { охранять пусть намерение = взаимодействие.намерение как? OrderIntent еще { завершение (ложь, Set (), .zero) возвращаться } еслиinteraction.intentHandlingStatus == .ready { установка (с: намерение) waitTime.isHidden = истина завершение (истина, параметры, желаемый размер) } иначе, если взаимодействие.intentHandlingStatus == .success, пусть ответ = взаимодействие.интентОтвет как? ЗаказНамерениеОтвет { установка (с: намерение) waitTime.isHidden = ложь если позволить waitTimeText = response.waitTime { waitTime.text = "Заказ будет готов через \(waitTimeText) минут" } всеIsOkLabel.text = "Нажмите, чтобы показать заказы" завершение (истина, параметры, желаемый размер) } завершение (false, параметры, .zero) } настройка частной функции (с намерением: OrderIntent) { burgerNameLabel.text = намерение.burgerName если пусть количество = намерение.количество?.stringValue { количествоLabel.text = "\(количество) шт." } если позволить дополнения = намерение.дополнения { дополненияLabel.text = дополнения.элементы.toString } }
6. После создания пользовательского интерфейса мы можем перейти к донату нашего намерения. В этом случае лучше всего пожертвовать намерения при оформлении заказа. Мы предоставляем в систему всю информацию, которую мы ранее определили в файле Order.intentdefinition
, т.е. название бургера, количество и дополнения, а также предлагаемую фразу, отображаемую в том случае, когда мы хотели бы сразу добавить этот ярлык в Siri при оформлении заказа. .
частная функция donateInteraction (для заказа: Заказ) { пусть взаимодействие = INInteraction (намерение: order.intent, ответ: ноль) взаимодействие.донат { (ошибка) в если ошибка != ноль { // обработка ошибки } еще { print("Успешно пожертвованное взаимодействие") } } }
общественное расширение Заказать { переменная цель: OrderIntent { пусть orderIntent = OrderIntent() orderIntent.burgerName = имя если пусть intValue = Int(количество) { orderIntent.quantity = NSNumber (значение: intValue) } orderIntent.suggestedInvocationPhrase = "Время бургеров" orderIntent.additions = addions.map { option -> INObject in вернуть INObject (идентификатор: option.rawValue, отображение: option.rawValue) } вернуть заказНамерение } }
7. Теперь мы можем обработать ситуацию, что произойдет в случае, когда пользователь получит предложение ярлыка и нажмет на него, а также в случае, если пользователь вызовет ярлык с помощью Siri.
открытый класс OrderIntentHandler: NSObject, OrderIntentHandling { общедоступная функция подтверждения (намерение: OrderIntent, завершение: @escaping (OrderIntentResponse) -> Void) { завершение (OrderIntentResponse (код: OrderIntentResponseCode.ready, userActivity: nil)) } общедоступный дескриптор функции (намерение: OrderIntent, завершение: @escaping (OrderIntentResponse) -> Void) { охранять let burgerName = намерение.burgerName else { завершение (OrderIntentResponse (код: .failure, userActivity: nil)) возвращаться } Defaults.save (порядок: Порядок (от: намерение)) завершение (OrderIntentResponse.success (burgerName: burgerName, waitTime: "5")) } }

Вот и все, все работает
Вы можете проверить весь проект на моем GitHub здесь
Источники:
- https://developer.apple.com/videos/play/wwdc2018/211/
- https://developer.apple.com/videos/play/wwdc2018/214/
- https://developer.apple.com/documentation/sirikit/donating_shortcuts
- https://developer.apple.com/design/human-interface-guidelines/sirikit/overview/siri-shortcuts/
- https://www.raywenderlich.com/6462-siri-shortcuts-tutorial-in-ios-12