Добавление виджетов для iOS и macOS #17

Open
opened 2026-09-01 09:08:36 +00:00 by wt · 0 comments
Owner

**Задача: Добавление виджетов для iOS, macOS и watchOS **

1. Цель

Интегрировать поддержку виджетов (WidgetKit) в приложение Luma для всех целевых платформ: iOS, macOS и watchOS. Виджеты должны предоставлять быстрый доступ к последним чатам, количеству непрочитанных сообщений и выполнять глубокие ссылки, используя актуальную архитектуру ветки develop и новейшие API систем 26-й версии.

2. Требования

  • Платформы: iOS 26.0+, macOS 26.0+, watchOS 26.0+.
  • Функциональность:
    • Отображение списка последних чатов (аватар, имя, текст последнего сообщения, время) — для iOS и macOS.
    • Для watchOS — компактное отображение количества непрочитанных или последнего сообщения в виде осложнений (Complication) или виджета в Smart Stack.
    • Отображение количества непрочитанных сообщений (на всех платформах).
    • Быстрое действие (глубокая ссылка) для открытия конкретного чата или списка чатов.
    • Поддержка всех доступных размеров виджетов (включая новые, которые появятся в 26-х версиях).
    • Интерактивные виджеты (если API позволяет) — например, возможность отметить сообщение как прочитанное прямо из виджета.
  • Безопасность и приватность:
    • Виджеты не должны отображать содержимое сообщений, если приложение заблокировано (App Lock) или пользователь не настроил это явно.
    • Использование App Groups для общего доступа к данным.
  • Производительность:
    • Виджеты должны быть легковесными и быстро обновляться.
    • Использовать TimelineProvider с эффективным планированием обновлений, учитывая энергопотребление на watchOS.

3. Технические шаги

3.0. Предварительная проверка
  • Убедиться, что в develop нет начатой работы над виджетами.
  • Проверить, настроены ли App Groups в Config/Luma.entitlements для всех целей. Если нет — добавить.
  • Изучить новые возможности WidgetKit для версий 26 (интерактивность, новые семейства, улучшенная работа с SwiftData).
3.1. Создание целей виджетов

Добавить отдельные цели в project.yml для каждой платформы (или одну мультиплатформенную, если это поддерживается):

  • LumaWidget (iOS) — deploymentTarget: 26.0.
  • LumaWidgetMac (macOS) — deploymentTarget: 26.0.
  • LumaWidgetWatch (watchOS) — deploymentTarget: 26.0.
    Каждая цель должна подключать Sources/Shared и иметь собственный Info.plist с указанием поддерживаемых семейств и размеров.
3.2. Общий доступ к данным (SwiftData + App Groups)
  1. Настроить App Groups в entitlements для всех целей (приложение и виджеты).
  2. Создать общий ModelContainer для SwiftData с URL в общей группе:
    let container = try ModelContainer(
        for: Chat.self, Message.self,
        configurations: ModelConfiguration(
            url: sharedContainerURL.appendingPathComponent("Luma.sqlite")
        )
    )
    
  3. Создать WidgetDataProvider, который будет читать данные из общего контейнера (только чтение). Для watchOS данные должны быть максимально сжатыми (например, только количество непрочитанных и идентификаторы чатов).
  4. Определить простые Codable-структуры для передачи в виджет (например, WidgetChatEntry).
3.3. Реализация виджетов
  1. Создать TimelineProvider для каждой платформы (можно общий, но с учётом особенностей watchOS). Провайдер должен:
    • Загружать данные через WidgetDataProvider.
    • Формировать записи с нужной информацией.
    • Устанавливать политику обновления (например, обновлять при получении новых сообщений через WidgetCenter.shared.reloadTimelines из основного приложения; на watchOS обновления могут быть реже).
  2. Создать SwiftUI-представления для разных размеров и семейств:
    • iOS/macOS: .systemSmall, .systemMedium, .systemLarge, а также новые размеры, доступные в 26-й версии.
    • watchOS: использовать Complication (через CLKComplicationDescriptor) и/или виджеты в Smart Stack (через Widget с подходящим семейством, например, .accessoryRectangular).
  3. Добавить Link для глубоких ссылок (URL-схема должна быть зарегистрирована в приложении для всех платформ).
  4. Для интерактивности (если поддерживается) реализовать AppIntent для выполнения действий (например, прочитать сообщение).
3.4. Интеграция с приложением
  1. В основном приложении при обновлении данных вызывать WidgetCenter.shared.reloadAllTimelines() (или точечно для конкретных виджетов).
  2. Добавить обработку URL из виджета в LumaApp.swift через onOpenURL или в AppDelegate.
  3. На watchOS обрабатывать нажатия на осложнения через Handoff или глубокие ссылки.
3.5. Тестирование
  1. Проверить на симуляторах и реальных устройствах всех платформ с разными размерами экрана и разрешениями.
  2. Убедиться, что данные обновляются корректно и конфиденциальная информация не отображается при включённом App Lock.
  3. Проверить производительность и энергопотребление на watchOS.

4. Идеи для виджетов

  • iOS/macOS:
    • «Последние чаты» — список из 3–5 чатов с аватарами, именами и последними сообщениями.
    • «Непрочитанные» — крупная цифра с количеством.
    • «Быстрый доступ» — кнопки для избранных чатов или нового сообщения.
  • watchOS:
    • Осложнение «Непрочитанные» — круговая шкала или цифра на циферблате.
    • Виджет в Smart Stack — последнее сообщение от избранного контакта.
    • Интерактивное осложнение для быстрого ответа (если API позволяет).

5. Примечания по ветке develop и версиям 26

  • SwiftData: использовать последние возможности (например, @Model с новыми атрибутами).
  • App Lock: учтён, виджеты на всех платформах должны скрывать содержимое при заблокированном приложении.
  • Общая кодовая база: максимально переиспользовать Sources/Shared.
  • Новые API версии 26: изучить документацию WidgetKit для iOS/macOS/watchOS 26, чтобы применять последние улучшения (интерактивность, новые семейства, улучшенная производительность).
  • Сборка: через XcodeGen (make project).

6. Критерии приемки

  • Виджеты отображают корректные данные на всех трёх платформах.
  • При нажатии на элемент виджета открывается соответствующий диалог в приложении.
  • Виджеты обновляются при поступлении новых сообщений.
  • Виджеты не отображают конфиденциальную информацию при включённом App Lock.
  • Виджеты корректно работают на iOS 26+, macOS 26+ и watchOS 26+ (включая все поддерживаемые размеры).
  • Код соответствует архитектуре проекта (описана в Docs/ARCHITECTURE.md).

7. Связанные документы

### **Задача: Добавление виджетов для iOS, macOS и watchOS ** #### **1. Цель** Интегрировать поддержку виджетов (WidgetKit) в приложение Luma для всех целевых платформ: **iOS, macOS и watchOS**. Виджеты должны предоставлять быстрый доступ к последним чатам, количеству непрочитанных сообщений и выполнять глубокие ссылки, используя актуальную архитектуру ветки `develop` и новейшие API систем 26-й версии. #### **2. Требования** - **Платформы:** iOS 26.0+, macOS 26.0+, watchOS 26.0+. - **Функциональность:** - Отображение списка последних чатов (аватар, имя, текст последнего сообщения, время) — для iOS и macOS. - Для watchOS — компактное отображение количества непрочитанных или последнего сообщения в виде осложнений (Complication) или виджета в Smart Stack. - Отображение количества непрочитанных сообщений (на всех платформах). - Быстрое действие (глубокая ссылка) для открытия конкретного чата или списка чатов. - Поддержка всех доступных размеров виджетов (включая новые, которые появятся в 26-х версиях). - Интерактивные виджеты (если API позволяет) — например, возможность отметить сообщение как прочитанное прямо из виджета. - **Безопасность и приватность:** - Виджеты не должны отображать содержимое сообщений, если приложение заблокировано (App Lock) или пользователь не настроил это явно. - Использование App Groups для общего доступа к данным. - **Производительность:** - Виджеты должны быть легковесными и быстро обновляться. - Использовать `TimelineProvider` с эффективным планированием обновлений, учитывая энергопотребление на watchOS. #### **3. Технические шаги** ##### **3.0. Предварительная проверка** - Убедиться, что в `develop` нет начатой работы над виджетами. - Проверить, настроены ли App Groups в `Config/Luma.entitlements` для всех целей. Если нет — добавить. - Изучить новые возможности WidgetKit для версий 26 (интерактивность, новые семейства, улучшенная работа с SwiftData). ##### **3.1. Создание целей виджетов** Добавить отдельные цели в `project.yml` для каждой платформы (или одну мультиплатформенную, если это поддерживается): - `LumaWidget` (iOS) — deploymentTarget: 26.0. - `LumaWidgetMac` (macOS) — deploymentTarget: 26.0. - `LumaWidgetWatch` (watchOS) — deploymentTarget: 26.0. Каждая цель должна подключать `Sources/Shared` и иметь собственный `Info.plist` с указанием поддерживаемых семейств и размеров. ##### **3.2. Общий доступ к данным (SwiftData + App Groups)** 1. Настроить App Groups в entitlements для всех целей (приложение и виджеты). 2. Создать общий `ModelContainer` для SwiftData с URL в общей группе: ```swift let container = try ModelContainer( for: Chat.self, Message.self, configurations: ModelConfiguration( url: sharedContainerURL.appendingPathComponent("Luma.sqlite") ) ) ``` 3. Создать `WidgetDataProvider`, который будет читать данные из общего контейнера (только чтение). Для watchOS данные должны быть максимально сжатыми (например, только количество непрочитанных и идентификаторы чатов). 4. Определить простые `Codable`-структуры для передачи в виджет (например, `WidgetChatEntry`). ##### **3.3. Реализация виджетов** 1. Создать `TimelineProvider` для каждой платформы (можно общий, но с учётом особенностей watchOS). Провайдер должен: - Загружать данные через `WidgetDataProvider`. - Формировать записи с нужной информацией. - Устанавливать политику обновления (например, обновлять при получении новых сообщений через `WidgetCenter.shared.reloadTimelines` из основного приложения; на watchOS обновления могут быть реже). 2. Создать SwiftUI-представления для разных размеров и семейств: - iOS/macOS: `.systemSmall`, `.systemMedium`, `.systemLarge`, а также новые размеры, доступные в 26-й версии. - watchOS: использовать `Complication` (через `CLKComplicationDescriptor`) и/или виджеты в Smart Stack (через `Widget` с подходящим семейством, например, `.accessoryRectangular`). 3. Добавить `Link` для глубоких ссылок (URL-схема должна быть зарегистрирована в приложении для всех платформ). 4. Для интерактивности (если поддерживается) реализовать `AppIntent` для выполнения действий (например, прочитать сообщение). ##### **3.4. Интеграция с приложением** 1. В основном приложении при обновлении данных вызывать `WidgetCenter.shared.reloadAllTimelines()` (или точечно для конкретных виджетов). 2. Добавить обработку URL из виджета в `LumaApp.swift` через `onOpenURL` или в `AppDelegate`. 3. На watchOS обрабатывать нажатия на осложнения через `Handoff` или глубокие ссылки. ##### **3.5. Тестирование** 1. Проверить на симуляторах и реальных устройствах всех платформ с разными размерами экрана и разрешениями. 2. Убедиться, что данные обновляются корректно и конфиденциальная информация не отображается при включённом App Lock. 3. Проверить производительность и энергопотребление на watchOS. #### **4. Идеи для виджетов** - **iOS/macOS:** - «Последние чаты» — список из 3–5 чатов с аватарами, именами и последними сообщениями. - «Непрочитанные» — крупная цифра с количеством. - «Быстрый доступ» — кнопки для избранных чатов или нового сообщения. - **watchOS:** - Осложнение «Непрочитанные» — круговая шкала или цифра на циферблате. - Виджет в Smart Stack — последнее сообщение от избранного контакта. - Интерактивное осложнение для быстрого ответа (если API позволяет). #### **5. Примечания по ветке develop и версиям 26** - **SwiftData**: использовать последние возможности (например, `@Model` с новыми атрибутами). - **App Lock**: учтён, виджеты на всех платформах должны скрывать содержимое при заблокированном приложении. - **Общая кодовая база**: максимально переиспользовать `Sources/Shared`. - **Новые API версии 26**: изучить документацию WidgetKit для iOS/macOS/watchOS 26, чтобы применять последние улучшения (интерактивность, новые семейства, улучшенная производительность). - **Сборка**: через XcodeGen (`make project`). #### **6. Критерии приемки** - Виджеты отображают корректные данные на всех трёх платформах. - При нажатии на элемент виджета открывается соответствующий диалог в приложении. - Виджеты обновляются при поступлении новых сообщений. - Виджеты не отображают конфиденциальную информацию при включённом App Lock. - Виджеты корректно работают на iOS 26+, macOS 26+ и watchOS 26+ (включая все поддерживаемые размеры). - Код соответствует архитектуре проекта (описана в `Docs/ARCHITECTURE.md`). #### **7. Связанные документы** - [`Docs/ARCHITECTURE.md`](https://github.com/TolaMironcenko/Luma/blob/develop/Docs/ARCHITECTURE.md) - [`Docs/SECURITY.md`](https://github.com/TolaMironcenko/Luma/blob/develop/Docs/SECURITY.md) - [`project.yml`](https://github.com/TolaMironcenko/Luma/blob/develop/project.yml)
wt added the Kind/Feature
Priority
Low
4
labels 2026-09-01 09:08:36 +00:00
wt self-assigned this 2026-09-01 09:08:36 +00:00
wt changed title from Добавить виджеты для ios,macos to Добавление виджетов для iOS и macOS 2026-09-01 09:11:36 +00:00
Sign in to join this conversation.