Swift Academy · Урок

Создание виджета WidgetKit

Создайте виджет для домашнего экрана с временной шкалой.

Урок 1 из 413 шагов

«Создание виджета 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 — локальная установка не требуется.

Все уроки этого курса

  1. Создание виджета WidgetKit
  2. Поставщики временных шкал и снимки
  3. Обзор расширений приложений
  4. App Intents и быстрые команды
← Назад к Swift Academy