Создание настраиваемого пользователем виджета с помощью SiriKit

Примечание. Это третья и последняя часть моего руководства по виджетам из трех частей. Обязательно заполните часть 1 и часть 2, прежде чем продолжить работу с этой статьей.

Примечание. Для работы с этим руководством вам потребуется Xcode 12 Beta 2 или выше.

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

В этой заключительной части руководства мы будем использовать SiriKit, чтобы добавить новый виджет, который пользователь может настроить для отображения смайлов по своему выбору.

Настраиваемые пользователем виджеты

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

Определение намерения

Для начала нам нужно создать собственное определение намерения; это то, что позволит нам определять настраиваемые свойства для нашего виджета (т.е. эмодзи). Чтобы создать определение намерения, щелкните меню Файл, выберите Новый файл и выберите Файл определения намерения SiriKit; назовите свой файл SelectEmojiIntent.

Теперь, когда файл намерений создан, нам нужно определить наше намерение. Для этого щелкните значок «+» в левом нижнем углу файла намерений и выберите Новое намерение, дайте своему намерению имя SelectEmoji. Установите категорию на Просмотр; убедитесь, что выбрано Намерение подходит для виджетов, а другие параметры не выбраны.

Теперь, когда мы создали наше намерение, нам нужно определить настраиваемые свойства, которые будет обрабатывать наше намерение. Мы определим новый тип INObject (объект намерения) с именем EmojiINO (объект намерения эмодзи). Снова нажмите значок + и выберите Новый тип, дайте ему имя EmojiINO. Вы должны увидеть новый тип, созданный со свойствами identifier и displayString.

Теперь вернитесь к своему SelectEmoji намерению и добавьте новый параметр под названием emoji, изменив тип на EmojiINO. Убедитесь, что выбран параметр «Параметры предоставляются динамически».

Тип EmojiINO описывает смайлы, которые пользователь может выбрать в SelectEmojiIntent. Теперь мы напишем код для динамического предоставления параметров эмодзи.

Расширение намерений

Чтобы динамически предоставлять список поддерживаемых эмодзи, нам нужно добавить расширение намерений. Здесь мы создадим IntentHandler, который создаст список EmojiINO из всех смайлов в нашем EmojiProvider. Чтобы добавить расширение намерений, выберите Файл - ›Создать -› Цель… и выберите Расширение намерений. Нажмите Далее и дайте имя своему расширению (например, Emojibook Intent), убедитесь, что в качестве начальной точки выбрано Нет. Нажмите Готово и активируйте схему намерений, если это будет предложено Xcode.

Перейдите на вкладку Общие цели намерения Emojibook и добавьте SelectEmojiIntent в качестве одного из поддерживаемых намерений, например:

Теперь перейдите к файлу определения намерений и убедитесь, что он является членом приложения Emojibook, виджета и расширения намерений. Сделайте то же самое для файлов EmojiDetails.swift и EmojiProvider.swift.

Теперь мы можем перейти к IntentHandler.swift и реализовать протокол SelectEmojiIntentHandling, чтобы предоставить параметры эмодзи. Наш IntentHandler.swift файл будет выглядеть так:

Здесь мы получаем все варианты смайликов из нашего EmojiProvider и создаем INObjectCollection из EmojiINO. Каждый EmojiINO имеет identifier, чтобы отличать его от других, и отображаемое имя, отображаемое в списке параметров виджета.

Пользовательский виджет Emoji

Прежде чем добавлять собственный виджет эмодзи, давайте внесем некоторые изменения, чтобы лучше организовать наш код. Во-первых, давайте добавим многоразовое представление заполнителя в EmojibookWidgetView.swift, добавив View struct, например:

Теперь переименуйте файл Emojibook_Widget.swift в RandomEmojiWidget.swift. Мы также переименуем структуры внутри этого файла, чтобы они ссылались на RandomEmojiWidget, например:

Наконец-то мы можем работать над нашим пользовательским виджетом эмодзи. Сначала добавьте новый файл Swift с именем CustomEmojiWidget.swift, убедившись, что он является частью цели Emojibook Widget Extension. Подобно TimelineProvider, которое мы определили в нашем RandomEmojiWidget, нам нужно будет определить IntentTimelineProvider для нашего CustomEmojiWidget. IntentTimelineProvider предоставляет записи виджета для настраиваемого пользователем виджета на основе заданного Intent; в нашем случае это SelectEmojiIntent.

Ранее мы использовали статическую конфигурацию виджета, поскольку виджет случайных эмодзи не имеет настраиваемых свойств. Для настраиваемого виджета эмодзи мы будем использовать конфигурацию виджета намерения, поскольку виджет будет настроен на основе SelectEmojiIntent. В итоге наш CustomEmojiWidget будет выглядеть так:

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

Если вы запустите приложение сейчас и попытаетесь добавить CustomEmojiWidget, у вас не получится. Это потому, что нам нужно сообщить системе, что наше приложение теперь поддерживает два типа виджетов: RandomEmojiWidget и CustomEmojiWidget. Для этого нам нужно создать WidgetBundle.

Создайте новый файл с именем EmojiWidgetBundle.swift и добавьте следующий код:

Как вы помните, аннотация @main определяет точку входа в наш виджет. Ранее мы использовали RandomEmojiWidget в качестве точки входа, но поскольку нашей новой точкой входа будет набор виджетов, который мы только что определили, теперь мы должны удалить эту аннотацию из RandomEmojiWidget.swift. После этого мы будем готовы протестировать наш новый виджет.

Давайте запустим наше приложение. Когда вы пытаетесь добавить виджет Emojibook, теперь у вас будет возможность добавить собственный виджет Emoji. После того, как вы добавите его, вы можете отредактировать виджет, чтобы отобразить нужный смайлик!

Спасибо за прочтение! Надеюсь, вам понравилась эта статья и вы нашли ее полезной. Готовое приложение вы можете найти на GitHub.

Чтобы узнать больше о WidgetKit, обязательно ознакомьтесь с замечательными ресурсами Apple: