Добавить в корзинуПозвонить
Найти в Дзене
Nuances of programming

Как сделать кастомные шорткаты для Siri

Шорткаты в Сири
Это новая эппловская фича для iOS 12. Ее анонсировали во время приветственной речи на WWDC 2018, и вот уже этой осенью ею можно будет пользоваться… Знаете, стоит обновить свои приложения так, чтобы ваши будущие клиенты-пользователи могли работать с новой системной функцией. Чем быстрее, тем лучше.
Оглавление

Источник: Nuances of Programming

Шорткаты в Сири

Это новая эппловская фича для iOS 12. Ее анонсировали во время приветственной речи на WWDC 2018, и вот уже этой осенью ею можно будет пользоваться… Знаете, стоит обновить свои приложения так, чтобы ваши будущие клиенты-пользователи могли работать с новой системной функцией. Чем быстрее, тем лучше.

Я уверен, что они оценят это, ведь управление голосом на самом деле штука удобная и делает жизнь еще проще, особенно если у вас есть шорткаты, которые будут на виду. Их можно будет вызвать прямо с экрана блокировки, через Поиск или через Siri Watch Face. 

Сири также может предлагать шорткаты сама, когда использует информацию типа местонахождения, времени дня или вида передвижения (ходьба, бег, вождение). Они появляются на экране блокировки в виде уведомлений, которые можно выбрать и перейти к задаче.

Не стоит беспокоиться о приватности. Вся собираемая информация сохраняется только на вашем устройстве, так что никакие личные данные не могут быть скомпрометированы. 

Еще можно добавлять шорткаты из галереи шаблонов. Они будут доступны в новом приложении Shortcuts, когда пройдёт официальный релиз, или же разработчики сами смогут создавать кастомизированные шорткаты и добавлять их в свои приложения. 

В этой статье я покажу вам, как создавать простой кастомный шорткат — помните, что эта функция все еще на стадии бета, так что реализация, скорее всего, немного поменяется после официального релиза. 

Пример проекта

Я подготовил простой проект, его исходник можете взять с GitHub. Не стесняйтесь использовать его вместо того, чтобы писать код с нуля. Подходит для быстрого тестирования. 

-2

Поехали

Первое, что нужно сделать (допустим, у вас уже есть пустой проект для начала), — добавить новый таргет и в качестве шаблона выбрать Cocoa Touch Framework.

-3

Возьмём этот таргет как контейнер для фрагментов нашей информации API to fetch с GitHub, и фреймворк поможет нам распределить код между приложением и нашим целевым шорткатом. Начнём с создания нового класса. Он понадобится как модель для полученных данных (пользователя и его фолловеров).

-4

Я разделил его на две структуры, потому что нам нужно получить данные в двух разных конечных точках и такой подход явно ускорит путь к результату. Для эффективности кода нужна структура получше, а я фокусировался на создании шортката и написании чего-то “на скорую руку”. Просто помните об этом. 

А теперь давайте создадим API для получения всех данных, которые нам нужны:

-5
-6

Я не буду подробно объяснять код. Думаю, что вы все же знакомы с URLSession или можете найти себе данные где-то еще. Это может быть даже статический метод.

А теперь, создадим новый файл — SiriKit Intent Definition.

-7

Открыв его, вы увидите простой редактор. В нём можно определить кастомные (или модифицировать системные) интенты и их ответы. Нажмите на значок ➕ , чтобы добавить новый интент. 

-8

Что здесь происходит? Сейчас я всё объясню. В качестве категории выберите что угодно, что подходит под ваш интент больше всего. Я выбрал Do. Заголовок и описание говорят сами за себя. Также можете выбрать дефолтное изображение, если вам так хочется или нужно, чтобы ваш интент был подтвержден до выполнения. Проверьте отметку. 

В секции Parameters определите все параметры, которые могут передаваться в ваш интент. У меня он всего один — имя пользователя на GitHub. Если хотите, можете не передавать никакие параметры. 

А теперь давайте определим тип шортката (Shortcut Type). Снова нажмите значок ➕ под третьей секцией. Проверьте ваш параметр, если вы его создавали, и нажмите Add Shortcut Type.

Назовите его и вот вы можете использовать свой параметр здесь, а во время передачи интента он будет заменен полученной строкой. Позже я поясню детали о процессе передачи.

В моём примере я также проверил фоновое исполнение, т.к. хотел, чтобы оно сработало без обращения к текущему приложению.

И вот пришло время определиться с ответом.

-9

Достаточно просто. Список свойств, которые можно передавать в ответ и шаблоны ответов (response templates). Может выглядеть сложно на первый взгляд, но вы всё поймёте, когда начнёте писать код. Теперь вопрос: “Как же нам получить доступ к этим интентам?”

Не стоит беспокоиться, все необходимые классы, схожие с CoreData, будут автоматически сгенерированы для нас. Осталась одна вещь, которую нам нужно сделать на этом этапе, чтобы всё точно работало после создания фреймворка для распределения между таргетами. На картинке ниже видим target membership для файла intentdefinition, который мы только что создали. Нужно сгенерировать классы только для нашего фреймворка и ничего не генерировать для остальных таргетов.

-10

Создаём интент

Итак, мы проделали такую большую работу к этому моменту и у нас всё еще нет результатов… Еще несколько шагов и мы закончим с базовым шорткатом. 

Добавляйте новый таргет — Intent Extension —вы можете так же включить UI Extension, если хотите. Это необязательно, хотя, возможно, пригодится нам попозже.

-11

Помните, что надо слинковать созданный фреймворк с нашими новыми таргетами.

-12

Как только мы создадим таргет интента, появится сгенерированный файл IntentHandler.swift. Давайте откроем его и заменим его реализацию, чтобы вернуть обработчик для кастомного интента. 

-13

Хм, естественно, он не скомпилируется, пока мы не создадим обработчик. Сделаем это:

-14

Что происходит: программа берет имя интента и передает данные этому имени и вызывает завершение блока с ответом, который мы определили раньше. Если вы не хотите получать никакие данные с GitHub, просто передайте некоторые статические параметры в блок завершения. 

Интент UI

Самый простой шаг. Создайте новый таргет для Intent UI , если вы не сделали этого раньше. Мы можем создать кастомный View для ответа нашему шорткату и сконфигурировать его здесь. Он будет отображаться на экране Siri.

-15
-16

Передача интента

Я сделал простой View с текстовым полем, где могу ввести имя пользователя и кнопку, которая будет передавать интент:

-17

  • Создаёт объект для нашего интента.
  • Это необязательно, но мы можем установить фразу вызова для нашего интента и, если мы определили какие-либо параметры, то нужно обязательно их здесь заполнить.
  • Начинает взаимодействие с нашим интентом.
  • Передает интент. Первоочередный вызов INPreferences.requestSiriAuthorization для передачи может потребоваться при выполнении на текущем устройстве.

Это всё?

Да. Запустите приложение и поставьте триггер на передачу интента. А теперь откройте системные Настройки->Сири и добавьте шорткат к только что переданному интенту. Если всё прошло успешно, то он будет доступен здесь.

-18

И вот мы готовы проверить всё, что мы сделали, в действии.

-19

Заключение

Существует гораздо больше вещей, которые можно сделать с новой фичей. Например, собрать пользовательскую активность, что также может вполне стать шорткатом.

Спасибо за внимание.

Читайте также:

Читайте нас в телеграмме и vk

Перевод статьи Artur Rymarz: How to Create Custom Siri ShortcutsB