Создание виджета WidgetKit
Создайте виджет для домашнего экрана с временной шкалой.
«Создание виджета WidgetKit» — бесплатный урок Swift Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Что такое виджет
Виджет — это небольшое представление, которое можно быстро просмотреть на экране «Домой», экране блокировки или в режиме StandBy. Это не мини-приложение: он не поддерживает прокрутку и не может выполнять произвольный код. Виджет отображает снимок данных, который система обновляет по расписанию, заданному Вами через WidgetKit.
import WidgetKit
import SwiftUI
// A widget = configuration + timeline of entries
// + a SwiftUI view that renders one entryЦель расширения виджета
Виджеты поставляются в отдельной цели расширения, а не в основном приложении. У расширения есть собственный пакет, и оно работает в отдельном процессе. Добавить его можно с помощью шаблона расширения виджета в Xcode; шаблон создаёт базовую конфигурацию и поставщика.
import WidgetKit
// File > New > Target > Widget Extension
// The extension declares one or more widgets
// in a WidgetBundle if you have several.Тип виджета
Виджет соответствует протоколу Widget и предоставляет body, возвращающий конфигурацию. Конфигурация объединяет идентификатор типа, поставщика временной шкалы и представление, отображающее каждую запись.
import WidgetKit
import SwiftUI
struct WeatherWidget: Widget {
var body: some WidgetConfiguration {
StaticConfiguration(
kind: "WeatherWidget",
provider: WeatherProvider()) { entry in
WeatherView(entry: entry)
}
.configurationDisplayName("Weather")
.description("Shows the current forecast.")
}
}Статическая конфигурация и конфигурация AppIntent
StaticConfiguration предназначена для виджетов без пользовательских параметров. AppIntentConfiguration позволяет пользователям настраивать виджет — например, выбирать город или учётную запись — с помощью AppIntent. Выбирайте статическую конфигурацию для фиксированного содержимого, а конфигурацию на основе действия — для настраиваемых виджетов.
import WidgetKit
// StaticConfiguration -> no user choices
// AppIntentConfiguration -> user-editable parameters
let kinds = "static vs configurable"
_ = kindsЗапись временной шкалы
Каждый момент времени, который может показать виджет, представлен как TimelineEntry — структура с полем date и любыми данными, необходимыми Вашему представлению. Поставщик предоставляет последовательность таких записей.
import WidgetKit
struct WeatherEntry: TimelineEntry {
let date: Date
let temperature: Int
let condition: String
}Представление виджета
Представление написано на обычном SwiftUI, но имеет ограничения: прокрутка недоступна, интерактивность ограничена, а представление должно хорошо выглядеть при нескольких фиксированных размерах. Получите данные entry и создайте аккуратную сводку, которую можно быстро просмотреть.
import SwiftUI
import WidgetKit
struct WeatherView: View {
let entry: WeatherEntry
var body: some View {
VStack {
Text(entry.condition)
Text("\(entry.temperature) degrees")
.font(.title)
}
}
}Поддерживаемые семейства
Объявите поддерживаемые размеры с помощью supportedFamilies: .systemSmall, .systemMedium, .systemLarge, .accessoryRectangular/.accessoryCircular для экрана блокировки и другие. Адаптируйте компоновку для каждого семейства с помощью окружения семейства виджета.
import WidgetKit
import SwiftUI
// .configurationDisplayName(...)
// .supportedFamilies([.systemSmall, .systemMedium,
// .accessoryRectangular])
let families = "declare supported sizes"
_ = familiesАдаптация к семейству
Считайте @Environment(\.widgetFamily) внутри представления, чтобы выбирать разные варианты компоновки — компактный маленький виджет или более информативный средний — без создания отдельных виджетов.
import SwiftUI
import WidgetKit
struct AdaptiveView: View {
@Environment(\.widgetFamily) var family
let entry: WeatherEntry
var body: some View {
if family == .systemSmall {
Text("\(entry.temperature)")
} else {
Text("\(entry.condition) \(entry.temperature)")
}
}
}Фон контейнера
Современные виджеты должны объявлять свой фон с помощью containerBackground(for: .widget), чтобы система могла правильно отображать их в разных контекстах, например в режиме StandBy и на экране блокировки. Без этого виджет могут отклонить или отобразить неправильно.
import SwiftUI
import WidgetKit
struct Bg: View {
var body: some View {
Text("Hi")
.containerBackground(for: .widget) {
Color.blue
}
}
}Обмен данными с приложением
Процесс виджета отделён от процесса приложения, поэтому он не может читать состояние приложения в памяти. Передавайте данные через группу приложений — общий контейнер, доступный обеим целям, — обычно через общую коллекцию UserDefaults или файл в контейнере группы.
import Foundation
let shared = UserDefaults(
suiteName: "group.com.example.app")
// App writes; widget reads the same suite.
_ = sharedОбновление виджета
Когда данные приложения изменяются, сообщите WidgetKit, что виджет нужно обновить, вызвав WidgetCenter.shared.reloadTimelines(ofKind:) или reloadAllTimelines(). Это побуждает систему запросить у Вашего поставщика новую временную шкалу.
import WidgetKit
func refreshWidget() {
WidgetCenter.shared.reloadTimelines(
ofKind: "WeatherWidget")
}Быстрая проверка
Вспомните, как виджет обменивается данными с содержащим его приложением.
Повторение
Вы создали виджет WidgetKit:
- Виджеты находятся в отдельном расширении, соответствуют протоколу
Widgetи возвращаютWidgetConfiguration. - Используйте
StaticConfigurationилиAppIntentConfiguration,TimelineEntryи ограниченное представление SwiftUI. - Объявите
supportedFamilies, адаптируйте представление черезwidgetFamilyи добавьтеcontainerBackground. - Передавайте данные через группу приложений и обновляйте виджеты с помощью
WidgetCenter.reloadTimelines.
Изучай Swift с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 122
- Уроки
- 409
Часто задаваемые вопросы
Урок «Создание виджета WidgetKit» бесплатный?
Да — полный текст урока «Создание виджета WidgetKit» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «Создание виджета WidgetKit»?
Создайте виджет для домашнего экрана с временной шкалой. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Создание виджета WidgetKit»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Создание виджета WidgetKit
- Поставщики временных шкал и снимки
- Обзор расширений приложений
- App Intents и быстрые команды