{"id":14277,"url":"\/distributions\/14277\/click?bit=1&hash=17ce698c744183890278e5e72fb5473eaa8dd0a28fac1d357bd91d8537b18c22","title":"\u041e\u0446\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u0442\u0440\u044b \u0431\u0435\u043d\u0437\u0438\u043d\u0430 \u0438\u043b\u0438 \u0437\u043e\u043b\u043e\u0442\u044b\u0435 \u0443\u043a\u0440\u0430\u0448\u0435\u043d\u0438\u044f","buttonText":"\u041a\u0430\u043a?","imageUuid":"771ad34a-9f50-5b0b-bc84-204d36a20025"}

Представляем комплект виджетов iOS 14 с интерфейсом Swift

WWDC 2020 дал нам много усовершенствований и обновлений, но введение WidgetKit, несомненно, выделяется на фоне других.

В iOS 14 был представлен переработанный главный экран с добавлением в него виджетов. Виджеты - это не просто ярлыки пользовательского интерфейса для ваших приложений. Они также помогают время от времени предоставлять пользователю полезную информацию.

В некотором роде они являются более спокойной формой уведомления, которая предоставляет вам последнюю информацию из приложений (если разработчик решил это сделать) без каких-либо вмешательств. Кроме того, в iOS 14 появилась новая функция Smart Stack, группирующая набор виджетов,которые вы можете пролистывать,переключаясь между ними. Smart Stacks, как правило, предоставляют подходящие для вас виджеты в верхней части экрана, используя встроенный интеллект, который учитывает время суток, местоположение и некоторые другие факторы.

WidgetKit построен исключительно с использованием SwiftUI, что открывает бесконечные возможности для построения красивых виджетов. Важно отметить, что WidgetKit не предназначен для построения мини-приложений.

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

Наша цель

1.Понять анатомию WidgetKit. Мы изучим фреймворк и посмотрим, как создаются и обновляются виджеты.

2.Построить виджет "Шутка часа" в SwiftUI.

3.Объедините наше приложение SwiftUI с двумя виджетами с помощью WidgetBuilder.

WidgetKit Framework: Под капотом

Чтобы понять анатомию WidgetKit, создадим новый Xcode 12 SwiftUI-проект и убедимся, что выбран SwiftUI App Lifecycle.

Чтобы создать наш первый виджет, перейдите в "Файл" → "Новый" → "Цель" и выберите шаблон "Расширение виджета". Убедитесь, что вы сняли флажок "Include Configuration Intent", так как в этой статье мы рассмотрим только статические конфигурации.

После добавления Widget Extension Target, вы будете встречены файлом, содержащим кучу SwiftUI кода, который может показаться вам новинкой. Не волнуйтесь, мы пройдёмся по всему этому.

Следующий фрагмент - отправная точка вашего виджета:

Таковы умозаключения, извлеченные из приведенного выше кода:

1.kind - это идентификатор, используемый для отличия виджета от других в WidgetCenter.

2.Внутри WidgetConfiguration мы устанавливаем вид Placeholder, который отображается при загрузке виджета. Содержимое виджета устанавливается внутри FirstWidgetEntryView, который мы вскоре увидим.

3.Provider- это структура типа TimelineProvider, являющаяся ядром виджета. Он отвечает за подпитку виджета данными и установку интервалов обновления данных. Опять же, к этому мы скоро придем.

4.Настройка модификаторов вида configurationDisplayName и описание отображают соответствующую информацию в Галерее виджетов - месте, где размещены все виджеты на вашем устройстве.

Есть еще один новый модификатор для фреймворка WidgetKit (supportedFamilies), внутри которого мы можем передавать виджеты разных размеров, которые нужны для нашего приложения. Например, .supportFamilies([.systemLarge]) позволяет передавать только виджеты большого размера.

Просмотр виджета SwiftUI

Теперь, когда мы разобрались, как работает WidgetKit под капотом, давайте посмотрим на вид SwiftUI, который отобразит виджет на экране.

Вышеуказанная структура заполняет вид виджета с набором данных в Provider.Entry. Provider.Entry является источником данных для представления нашего виджета, и если вы посмотрите на TimelineProvider, то увидите, что в качестве псевдонима типа для Entry была выбрана структура SimpleEntry.

Теперь, когда мы увидели, как работает WidgetKit - от отображения Placeholder до заполнения просмотров виджета записями TimelineProvider - мы готовы построить свой собственный пользовательский виджет: трекер шуток, который обновляется каждый час (вы можете настроить временной интервал)

Построим трекер шуток в iOS 14.

TimelineProvider позволяет нам получать данные из сетевых запросов или базы данных во время отображения PlaceholderView. Подход к извлечению данных из API для виджетов такой же, как и для приложения.

Следующий код использует URLSession с комбинированным питанием для декодирования ответа API и передачи его через блок завершения:

Обратите внимание, что представления виджетов SwiftUI не могут и не должны обновляться с использованием оборачивания свойств, таких как Published или State

Ответ декодируется с помощью следующей кодируемой структуры:

Создание источника данных

Наш виджет будет отображать шутки как строку. Итак, давайте добавим поле в нашу структуру SimpleEntry, как показано ниже:

struct JokesEntry: TimelineEntry {

public let date: Date

public let joke : String

}

Создание провайдера временных рамок

Следующая структура провайдера хронологии получает данные из DataFetcher и устанавливает их в массиве TimelineEntries, сконфигурированном на заданном интервале времени:

Создание виджета SwiftUI View

Следующий кусок кода представляет наше представление SwiftUI с набором структур SimpleEntry в качестве источника данных:

В коде выше, используя SwiftUI @ViewBuilder и используя тип enum widgetFamily в качестве EnvironmentObject, мы установили различные виды SwiftUI для различных форм виджетов.

Наконец, установим WidgetConfiguration и запустим приложение на устройстве под управлением iOS 14:

Вот вывод виджета в действии:

Как видите, у нас есть два виджета разного размера и разной компоновки. Вы можете дополнительно настроить их с помощью своего собственного красивого виджета SwiftUI.

Для демонстрационных целей я установил интервал TimelineProvider на одну секунду (хотя он не идеален в виджетах и может съесть много батареи).

Использование Widget Builder для создания нескольких виджетов.

Мы можем создавать различные виджеты и объединять их вместе с помощью WidgetBundleBuilder:

Заключение

Виджеты удобны и приятны для глаз. Поскольку Apple представила новый фреймворк WidgetKit и виджеты на главном экране iOS, многие приложения будут искать его применение. Тем не менее, будет интересно посмотреть, какое влияние это окажет на конфиденциальность пользователей.

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

На этом всё. Спасибо, что прочитали

Автор:Анупам Чуг

Перевод:Федоров Матвей

Еще больше полезной информации вы можете найти в телеграм-канале по ссылке:

0
2 комментария
Панда Ву

Тематика для Habr’a. Здесь другая аудитория.

Ответить
Развернуть ветку
Ledneva Elena

Как потратить время на xepню. 

Ответить
Развернуть ветку
-1 комментариев
Раскрывать всегда