**Задача: Добавление виджетов для 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)
Настроить App Groups в entitlements для всех целей (приложение и виджеты).
Создать общий ModelContainer для SwiftData с URL в общей группе:
Создать WidgetDataProvider, который будет читать данные из общего контейнера (только чтение). Для watchOS данные должны быть максимально сжатыми (например, только количество непрочитанных и идентификаторы чатов).
Определить простые Codable-структуры для передачи в виджет (например, WidgetChatEntry).
3.3. Реализация виджетов
Создать TimelineProvider для каждой платформы (можно общий, но с учётом особенностей watchOS). Провайдер должен:
Загружать данные через WidgetDataProvider.
Формировать записи с нужной информацией.
Устанавливать политику обновления (например, обновлять при получении новых сообщений через WidgetCenter.shared.reloadTimelines из основного приложения; на watchOS обновления могут быть реже).
Создать SwiftUI-представления для разных размеров и семейств:
iOS/macOS: .systemSmall, .systemMedium, .systemLarge, а также новые размеры, доступные в 26-й версии.
watchOS: использовать Complication (через CLKComplicationDescriptor) и/или виджеты в Smart Stack (через Widget с подходящим семейством, например, .accessoryRectangular).
Добавить Link для глубоких ссылок (URL-схема должна быть зарегистрирована в приложении для всех платформ).
Для интерактивности (если поддерживается) реализовать AppIntent для выполнения действий (например, прочитать сообщение).
3.4. Интеграция с приложением
В основном приложении при обновлении данных вызывать WidgetCenter.shared.reloadAllTimelines() (или точечно для конкретных виджетов).
Добавить обработку URL из виджета в LumaApp.swift через onOpenURL или в AppDelegate.
На watchOS обрабатывать нажатия на осложнения через Handoff или глубокие ссылки.
3.5. Тестирование
Проверить на симуляторах и реальных устройствах всех платформ с разными размерами экрана и разрешениями.
Убедиться, что данные обновляются корректно и конфиденциальная информация не отображается при включённом App Lock.
Проверить производительность и энергопотребление на 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).
### **Задача: Добавление виджетов для 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)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
**Задача: Добавление виджетов для iOS, macOS и watchOS **
1. Цель
Интегрировать поддержку виджетов (WidgetKit) в приложение Luma для всех целевых платформ: iOS, macOS и watchOS. Виджеты должны предоставлять быстрый доступ к последним чатам, количеству непрочитанных сообщений и выполнять глубокие ссылки, используя актуальную архитектуру ветки
developи новейшие API систем 26-й версии.2. Требования
TimelineProviderс эффективным планированием обновлений, учитывая энергопотребление на watchOS.3. Технические шаги
3.0. Предварительная проверка
developнет начатой работы над виджетами.Config/Luma.entitlementsдля всех целей. Если нет — добавить.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)
ModelContainerдля SwiftData с URL в общей группе:WidgetDataProvider, который будет читать данные из общего контейнера (только чтение). Для watchOS данные должны быть максимально сжатыми (например, только количество непрочитанных и идентификаторы чатов).Codable-структуры для передачи в виджет (например,WidgetChatEntry).3.3. Реализация виджетов
TimelineProviderдля каждой платформы (можно общий, но с учётом особенностей watchOS). Провайдер должен:WidgetDataProvider.WidgetCenter.shared.reloadTimelinesиз основного приложения; на watchOS обновления могут быть реже)..systemSmall,.systemMedium,.systemLarge, а также новые размеры, доступные в 26-й версии.Complication(черезCLKComplicationDescriptor) и/или виджеты в Smart Stack (черезWidgetс подходящим семейством, например,.accessoryRectangular).Linkдля глубоких ссылок (URL-схема должна быть зарегистрирована в приложении для всех платформ).AppIntentдля выполнения действий (например, прочитать сообщение).3.4. Интеграция с приложением
WidgetCenter.shared.reloadAllTimelines()(или точечно для конкретных виджетов).LumaApp.swiftчерезonOpenURLили вAppDelegate.Handoffили глубокие ссылки.3.5. Тестирование
4. Идеи для виджетов
5. Примечания по ветке develop и версиям 26
@Modelс новыми атрибутами).Sources/Shared.make project).6. Критерии приемки
Docs/ARCHITECTURE.md).7. Связанные документы
Docs/ARCHITECTURE.mdDocs/SECURITY.mdproject.ymlДобавить виджеты для ios,macosto Добавление виджетов для iOS и macOS