Document local Live Activity release and device validation [skip ci]

This commit is contained in:
2026-09-13 11:33:42 +03:00
parent ddd44e8edb
commit fcc66aa328
2 changed files with 80 additions and 9 deletions
+47 -6
View File
@@ -43,8 +43,11 @@ Windows-агент — соседний проект `C:/Users/areso/MusicBridge
- [x] Реализованы понятные ошибки сопряжения по кодам сервера, повтор загрузки обложки после 404 и ручной повтор.
- [x] Иконка приложения и обновлённый интерфейс подключения/плеера.
- [x] Просмотрены снимки 0.4.0: подключение, светлая/тёмная темы, iPhone SE и крупный текст.
- [ ] Проверить новый интерфейс и иконку 0.4.0 на физическом iPhone.
- [ ] Live Activities / Dynamic Island / App Intents — отдельный последующий этап.
- [x] Пользователь подтвердил работу 0.4.0 на iPhone: «всё вроде работает».
- [x] Локальная Live Activity и Dynamic Island: реализация отображения трека в 0.5.0.
- [ ] Проверить Live Activity на экране блокировки и Dynamic Island после подписи через iloader.
- [ ] App Intents: прямые действия из Live Activity и команды Siri.
- [ ] APNs: отдельный проект обновлений при приостановленном приложении, если нужен постоянный актуальный трек в фоне.
Ограничения: хранится один доверенный ПК; адрес при смене IP восстанавливается через
Bonjour, если доступны объявления того же агента. Новый адрес сохраняется только
@@ -93,6 +96,9 @@ Bonjour, если доступны объявления того же агент
- `QRScanner.swift`: камера AVFoundation, доступ, сканирование и жизненный цикл.
- `DiscoveryStore.swift`: Bonjour, разрешение адресов, TXT и безопасный выбор адреса.
- `ConnectionStorage.swift`: доступ к Keychain и подмена хранилища для изолированных тестов жизненного цикла.
- `LiveActivityManager.swift`: запуск, обновление, устаревание и завершение одной локальной Live Activity.
- `Shared/`: ограниченный публичный снимок трека и общие SwiftUI-компоненты карточки.
- `MusicBridgeWidgets/`: расширение WidgetKit, экран блокировки и все представления Dynamic Island.
- `MusicBridgeTests/`: XCTest и пример Windows JSON.
- `tools/`: генератор проекта, структурные проверки, выбор симулятора для CI.
- `.github/workflows/ios.yml`: CI на macOS.
@@ -136,12 +142,47 @@ Bonjour, если доступны объявления того же агент
2. **Интерфейс — версия 0.4.0 (build 5).** Добавлены иконка, компактный экран QR,
раскрываемые ручные поля, крупная play/pause, процент громкости и меню ПК.
Сборка и 23 XCTest прошли; просмотрены темы, компактный экран и крупный текст.
Сценарии QR и ручного подключения сохранены; нужна проверка на телефоне.
3. **Системные интеграции.** Сначала исследовать актуальные ограничения Live Activities,
Dynamic Island, App Intents и локальной связи в фоне; затем реализовать доступные
сценарии. Не имитировать фоновое аудио. Не обещать постоянный WSS при блокировке.
Пользователь подтвердил работу обновления на телефоне перед началом этапа 3.
3. **Системные интеграции — 0.5.0 (build 6).** Локальная Live Activity и Dynamic Island
реализованы; 26 XCTest и Release archive прошли. Карточка показывает последний снимок
с ПК, открывает плеер, помечает устаревшие данные. App Intents и APNs не реализованы.
Не имитировать фоновое аудио. Не обещать постоянный WSS при блокировке.
4. **Несколько сохранённых ПК** — последующее расширение, сейчас сохраняется один.
Изменения третьего этапа — Live Activities 0.5.0:
- Итоговый `ddd44e8`: [Actions 34747772034](https://github.com/polskikh13/musicbridgeios/actions/runs/34747772034)
— 26 XCTest без отказов, сборка приложения и WidgetKit-расширения, успешный Release archive.
IPA скачана в `build/iPhone-0.5.0/MusicBridge-iPhone.ipa`; проверены оба ARM64
iPhoneOS исполняемых файла, структура `.appex`, версии и NSSupportsLiveActivities.
Светлый/тёмный предпросмотр карточки просмотрен: текст и отметка устаревания читаемы.
Установка/регистрация Live Activity на физическом iPhone остаются ручной проверкой.
- ActivityKit без push: старт только кнопкой пользователя при активном приложении
и медиасессии. Восстанавливается существующая активность, дубли завершаются;
после удаления пользователем автоматического пересоздания нет.
- WidgetKit-расширение встроено в приложение. В attributes/content нет адреса ПК,
токена, fingerprint или обложки; только публичные данные трека, ограниченные
по UTF-8 (по 256 байт для названия и исполнителя).
- Обычные позиции объединяются до одного обновления в пять секунд; смена трека,
длительности или состояния воспроизведения отправляется сразу. Прогресс статический,
соответствует последнему снимку. В фоне/без сети помечается устаревшим;
`staleDate` через 15 секунд страхует внезапную остановку приложения.
- Нет медиасессии, отзыв доступа, «Забыть компьютер» или ручное выключение — завершение.
Нажатие карточки открывает `musicbridge://player`, не попадает в импорт QR.
- Новые XCTest: позиция относительно startSeconds, нулевая длительность/пауза,
чрезмерные Unicode-метаданные и размер Codable payload. Проверка IPA требует
встроенную ARM64 iPhoneOS `.appex`, совпадающие версии и поддержку Live Activities.
- CI-предпросмотр общей разметки карточки проверяет светлую/тёмную темы и устаревшие
данные. Это не проверка системной регистрации ActivityKit/Island. На физическом
iPhone проверить старт, блокировку, раскрытие Island, переход в плеер, возврат,
удаление карточки, отсутствие автопересоздания, окончание сессии и отзыв доступа.
- Следующие отдельные задачи: LiveActivityIntent с безопасным выполнением команды
(проверить доступность Keychain/локальной сети при блокировке); Siri; APNs, если
требуются актуальные данные после приостановки приложения. Постоянный WSS в фоне
не реализован и не обещается. Windows-протокол не менялся.
- Основание: [Apple ActivityKit](https://developer.apple.com/documentation/activitykit/displaying-live-data-with-live-activities)
и [WidgetKit extension](https://developer.apple.com/documentation/widgetkit/creating-a-widget-extension).
Изменения второго этапа:
- Итоговый `aa0b0f0`: [Actions 34746477145](https://github.com/polskikh13/musicbridgeios/actions/runs/34746477145)