Document local Live Activity release and device validation [skip ci]
This commit is contained in:
@@ -43,8 +43,11 @@ Windows-агент — соседний проект `C:/Users/areso/MusicBridge
|
|||||||
- [x] Реализованы понятные ошибки сопряжения по кодам сервера, повтор загрузки обложки после 404 и ручной повтор.
|
- [x] Реализованы понятные ошибки сопряжения по кодам сервера, повтор загрузки обложки после 404 и ручной повтор.
|
||||||
- [x] Иконка приложения и обновлённый интерфейс подключения/плеера.
|
- [x] Иконка приложения и обновлённый интерфейс подключения/плеера.
|
||||||
- [x] Просмотрены снимки 0.4.0: подключение, светлая/тёмная темы, iPhone SE и крупный текст.
|
- [x] Просмотрены снимки 0.4.0: подключение, светлая/тёмная темы, iPhone SE и крупный текст.
|
||||||
- [ ] Проверить новый интерфейс и иконку 0.4.0 на физическом iPhone.
|
- [x] Пользователь подтвердил работу 0.4.0 на iPhone: «всё вроде работает».
|
||||||
- [ ] Live Activities / Dynamic Island / App Intents — отдельный последующий этап.
|
- [x] Локальная Live Activity и Dynamic Island: реализация отображения трека в 0.5.0.
|
||||||
|
- [ ] Проверить Live Activity на экране блокировки и Dynamic Island после подписи через iloader.
|
||||||
|
- [ ] App Intents: прямые действия из Live Activity и команды Siri.
|
||||||
|
- [ ] APNs: отдельный проект обновлений при приостановленном приложении, если нужен постоянный актуальный трек в фоне.
|
||||||
|
|
||||||
Ограничения: хранится один доверенный ПК; адрес при смене IP восстанавливается через
|
Ограничения: хранится один доверенный ПК; адрес при смене IP восстанавливается через
|
||||||
Bonjour, если доступны объявления того же агента. Новый адрес сохраняется только
|
Bonjour, если доступны объявления того же агента. Новый адрес сохраняется только
|
||||||
@@ -93,6 +96,9 @@ Bonjour, если доступны объявления того же агент
|
|||||||
- `QRScanner.swift`: камера AVFoundation, доступ, сканирование и жизненный цикл.
|
- `QRScanner.swift`: камера AVFoundation, доступ, сканирование и жизненный цикл.
|
||||||
- `DiscoveryStore.swift`: Bonjour, разрешение адресов, TXT и безопасный выбор адреса.
|
- `DiscoveryStore.swift`: Bonjour, разрешение адресов, TXT и безопасный выбор адреса.
|
||||||
- `ConnectionStorage.swift`: доступ к Keychain и подмена хранилища для изолированных тестов жизненного цикла.
|
- `ConnectionStorage.swift`: доступ к Keychain и подмена хранилища для изолированных тестов жизненного цикла.
|
||||||
|
- `LiveActivityManager.swift`: запуск, обновление, устаревание и завершение одной локальной Live Activity.
|
||||||
|
- `Shared/`: ограниченный публичный снимок трека и общие SwiftUI-компоненты карточки.
|
||||||
|
- `MusicBridgeWidgets/`: расширение WidgetKit, экран блокировки и все представления Dynamic Island.
|
||||||
- `MusicBridgeTests/`: XCTest и пример Windows JSON.
|
- `MusicBridgeTests/`: XCTest и пример Windows JSON.
|
||||||
- `tools/`: генератор проекта, структурные проверки, выбор симулятора для CI.
|
- `tools/`: генератор проекта, структурные проверки, выбор симулятора для CI.
|
||||||
- `.github/workflows/ios.yml`: CI на macOS.
|
- `.github/workflows/ios.yml`: CI на macOS.
|
||||||
@@ -136,12 +142,47 @@ Bonjour, если доступны объявления того же агент
|
|||||||
2. **Интерфейс — версия 0.4.0 (build 5).** Добавлены иконка, компактный экран QR,
|
2. **Интерфейс — версия 0.4.0 (build 5).** Добавлены иконка, компактный экран QR,
|
||||||
раскрываемые ручные поля, крупная play/pause, процент громкости и меню ПК.
|
раскрываемые ручные поля, крупная play/pause, процент громкости и меню ПК.
|
||||||
Сборка и 23 XCTest прошли; просмотрены темы, компактный экран и крупный текст.
|
Сборка и 23 XCTest прошли; просмотрены темы, компактный экран и крупный текст.
|
||||||
Сценарии QR и ручного подключения сохранены; нужна проверка на телефоне.
|
Пользователь подтвердил работу обновления на телефоне перед началом этапа 3.
|
||||||
3. **Системные интеграции.** Сначала исследовать актуальные ограничения Live Activities,
|
3. **Системные интеграции — 0.5.0 (build 6).** Локальная Live Activity и Dynamic Island
|
||||||
Dynamic Island, App Intents и локальной связи в фоне; затем реализовать доступные
|
реализованы; 26 XCTest и Release archive прошли. Карточка показывает последний снимок
|
||||||
сценарии. Не имитировать фоновое аудио. Не обещать постоянный WSS при блокировке.
|
с ПК, открывает плеер, помечает устаревшие данные. App Intents и APNs не реализованы.
|
||||||
|
Не имитировать фоновое аудио. Не обещать постоянный WSS при блокировке.
|
||||||
4. **Несколько сохранённых ПК** — последующее расширение, сейчас сохраняется один.
|
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)
|
- Итоговый `aa0b0f0`: [Actions 34746477145](https://github.com/polskikh13/musicbridgeios/actions/runs/34746477145)
|
||||||
|
|||||||
@@ -17,7 +17,8 @@
|
|||||||
|
|
||||||
**Статус:** пользователь подтвердил установку через iloader, рабочий пилот с
|
**Статус:** пользователь подтвердил установку через iloader, рабочий пилот с
|
||||||
Windows-агентом и подключение по QR. В 0.4.0 добавлены иконка и обновлённый
|
Windows-агентом и подключение по QR. В 0.4.0 добавлены иконка и обновлённый
|
||||||
интерфейс. Автоматические проверки включают 23 XCTest и Release archive;
|
интерфейс, в 0.5.0 — локальная Live Activity и Dynamic Island. CI собирает
|
||||||
|
приложение и расширение WidgetKit, выполняет XCTest и Release archive;
|
||||||
полная проверка устойчивости на физических устройствах остаётся в `PLAN.md`.
|
полная проверка устойчивости на физических устройствах остаётся в `PLAN.md`.
|
||||||
|
|
||||||
## Сборка на Mac
|
## Сборка на Mac
|
||||||
@@ -67,8 +68,8 @@ Apple ID и сертификаты для этой проверки не тре
|
|||||||
## Установка на iPhone через Sideloadly
|
## Установка на iPhone через Sideloadly
|
||||||
|
|
||||||
Пользователь также подтвердил установку через iloader. Для повторной установки
|
Пользователь также подтвердил установку через iloader. Для повторной установки
|
||||||
с новым интерфейсом используйте версию **0.4.0 (build 5)**:
|
с Live Activity используйте версию **0.5.0 (build 6)**:
|
||||||
`build/iPhone-0.4.0/MusicBridge-iPhone.ipa`. Выберите этот файл в iloader и
|
`build/iPhone-0.5.0/MusicBridge-iPhone.ipa`. Выберите этот файл в iloader и
|
||||||
подпишите тем же Apple Account, которым установлена первая версия.
|
подпишите тем же Apple Account, которым установлена первая версия.
|
||||||
|
|
||||||
В 0.4.0 добавлены иконка, карточка QR, раскрываемые ручные поля, крупная
|
В 0.4.0 добавлены иконка, карточка QR, раскрываемые ручные поля, крупная
|
||||||
@@ -105,6 +106,35 @@ Sideloadly (в том числе его функцией автоматичес
|
|||||||
[Sideloadly FAQ](https://sideloadly.io/faq) ·
|
[Sideloadly FAQ](https://sideloadly.io/faq) ·
|
||||||
[Apple: режим разработчика](https://developer.apple.com/documentation/Xcode/enabling-developer-mode-on-a-device)
|
[Apple: режим разработчика](https://developer.apple.com/documentation/Xcode/enabling-developer-mode-on-a-device)
|
||||||
|
|
||||||
|
## Live Activity и Dynamic Island
|
||||||
|
|
||||||
|
После подключения к ПК и появления трека нажмите под плеером
|
||||||
|
«Показать на экране блокировки». Та же карточка появится в Dynamic Island
|
||||||
|
на моделях, где он доступен. Долгое нажатие на Island раскрывает представление;
|
||||||
|
нажатие на карточку или «Открыть плеер» возвращает в приложение.
|
||||||
|
Кнопка «Убрать с экрана блокировки» завершает активность. Она также завершается,
|
||||||
|
когда ПК сообщает об отсутствии медиасессии, доступ отозван или компьютер забыт.
|
||||||
|
Удалённая пользователем карточка не создаётся снова автоматически.
|
||||||
|
|
||||||
|
Это **последний снимок состояния ПК**: название, исполнитель, состояние и прогресс.
|
||||||
|
В обычном режиме позиция обновляется не чаще раза в пять секунд; смена трека
|
||||||
|
и play/pause отправляются сразу. Прогресс не выдумывает движение без связи с ПК.
|
||||||
|
При уходе приложения в фон или потере связи отображается отметка устаревших данных;
|
||||||
|
резервный `staleDate` — 15 секунд, если приложение было внезапно остановлено.
|
||||||
|
Для обновления нажмите карточку. Прямых кнопок управления внутри неё пока нет.
|
||||||
|
|
||||||
|
Live Activity не поддерживает постоянный сетевой поток сама по себе. Для обновления
|
||||||
|
при приостановленном приложении нужен отдельный механизм ActivityKit push через
|
||||||
|
APNs. В этой версии нет push-токенов, сервера APNs, фонового аудио и App Intents.
|
||||||
|
[Ограничения и жизненный цикл ActivityKit](https://developer.apple.com/documentation/activitykit/displaying-live-data-with-live-activities).
|
||||||
|
|
||||||
|
В IPA включено расширение `MusicBridgeWidgets.appex`; при установке iloader должен
|
||||||
|
сохранить и подписать его вместе с приложением. Если Live Activity не появилась,
|
||||||
|
проверьте её разрешение в настройках MusicBridge и наличие расширения в логе установки.
|
||||||
|
Автоматические снимки `live-card-*-screen.png` показывают общую SwiftUI-разметку
|
||||||
|
карточки в Debug-предпросмотре: это не доказательство её регистрации на реальном
|
||||||
|
экране блокировки или системного отображения Dynamic Island.
|
||||||
|
|
||||||
## Источники
|
## Источники
|
||||||
|
|
||||||
- [Apple: проверка доверия сервера](https://developer.apple.com/documentation/Foundation/performing-manual-server-trust-authentication)
|
- [Apple: проверка доверия сервера](https://developer.apple.com/documentation/Foundation/performing-manual-server-trust-authentication)
|
||||||
|
|||||||
Reference in New Issue
Block a user