Files
ios/PLAN.md
T

99 lines
9.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MusicBridge iOS — план
Обновлено: 2026-09-12. Пользователь разрешил начать нативное iOS-приложение.
Репозиторий: `C:/Users/areso/iOS MusicBridge`; origin — dev.yukinoki.ru/musicbridge/ios.
Windows-агент — соседний проект `C:/Users/areso/MusicBridge/MusicBridge.Agent`.
## Правила проекта
- SwiftUI, без веб-клиента. Музыка играет на Windows.
- Сверять контракт с Windows PROTOCOL.md; не менять серверный протокол молча.
- Токены только в Keychain, проверка сертификата до сопряжения, запрет redirect.
- Не повторять команды автоматически после потери ответа.
- Не называть проверки Python сборкой Swift или запуском XCTest.
- После этапа обновлять этот файл: реализация, проверки, ограничения, следующий шаг.
## Реализовано в исходниках
- [x] Проект Xcode, shared scheme, iOS 17+, SwiftUI, без внешних зависимостей.
- [x] Модели состояния и команд v1; валидация HTTPS IPv4 домашней сети и QR-строки.
- [x] Ручное сопряжение, импорт приглашения, проверка SHA-256 DER-сертификата.
- [x] Keychain: адрес, отпечаток и bearer-токен; удаление локального сопряжения.
- [x] HTTPS-команды, обложка до 2 МиБ, поток WSS с ограничением размера сообщения.
- [x] Экран трека, возможности кнопок, прогресс, перемотка, громкость, mute.
- [x] Переподключение 1…16 секунд, watchdog потока, отключение в фоне, возврат.
- [x] XCTest исходники: диапазоны адресов, отказ опасным URL, отпечатки,
QR/срок/коды, JSON Windows, расчёт позиции, формат команд.
- [x] GitHub Actions: сборка/тесты симулятора, логи, xcresult и артефакт приложения.
## Проверки и следующие шаги
- [x] Первый успешный xcodebuild + XCTest на macOS: 7 тестов, 0 отказов.
- [x] Подключён GitHub remote polskikh13/musicbridgeios; Actions и чтение логов через gh работают.
- [ ] Интеграционные тесты TLS: верный/чужой/истёкший сертификат, redirect, WSS.
- [ ] Проверить 401 и отзыв устройства, Keychain после переустановки/блокировки.
- [x] Установить на физический iPhone: пользователь подтвердил установку через iloader 2026-09-12.
- [ ] Проверить LAN/плеер/команды/обложку с настоящим Windows-агентом.
- [ ] Камера для QR, системные разрешения и обработка отказа.
- [ ] Bonjour-поиск `_musicbridge._tcp`, список ПК и обновление адреса при смене IP.
- [ ] Улучшить ошибки сопряжения по серверным кодам; повтор загрузки обложки после 404.
- [ ] Иконка приложения, визуальная проверка разных размеров экрана и Dynamic Type.
- [ ] Live Activities / Dynamic Island / App Intents — отдельный последующий этап.
Ограничения: хранится один ПК; при смене его IP пока нужно повторное сопряжение.
Нет фонового воспроизведения, App Store/TestFlight и подписанной IPA.
Потеря ответа на успешное сопряжение может оставить устройство на ПК: удалить его
в окне агента перед повтором. Облачный runner не имеет доступа к домашней LAN.
## Проверка на iPhone 2026-09-12
- Windows GUI запущен с `--tray --lan`, порт TCP 8765 слушает.
- На iPhone первая попытка сопряжения завершилась ошибкой недействительного
сертификата сервера. Установка приложения уже работает; это отдельная TLS-проблема.
- Подготовлены ATS-исключения только для RFC1918 CIDR: `10.0.0.0/8`,
`172.16.0.0/12`, `192.168.0.0/16`. Начиная с iOS 17, для IP нужны явные
исключения. Клиент продолжает требовать HTTPS, точный SHA-256 отпечаток,
действующий сертификат и запрещает redirect. Глобального отключения ATS нет.
- Добавлены настоящие HTTPS/WSS проверки в симуляторе с сертификатом того же
типа, что у агента: RSA 2048, самоподписанный, CA:FALSE, SAN localhost/127.0.0.1,
срок пять лет. Отдельно проверяются чужой отпечаток и истёкший сертификат.
`tools/tls_fixture.py` запускается в CI перед сборкой тестов; закрытые ключи
создаются временно на runner и не включаются в приложение или артефакты.
- Сообщение «непригодные данные» при импорте приглашения пока не разобрано:
пользователь попросил отложить его. Следующий ручной шаг — повторить сопряжение
после установки новой IPA, затем проверить команды, прогресс и обложку.
## Карта
- `MusicBridge/Models.swift`: контракт и проверка входных данных.
- `BridgeClient.swift`: сертификат, HTTPS, WSS, ограничения ответов.
- `KeychainStore.swift`: хранение сопряжения.
- `PlayerStore.swift`: состояние, команды, жизненный цикл и восстановление.
- `ContentView.swift`: подключение и плеер.
- `MusicBridgeTests/`: XCTest и пример Windows JSON.
- `tools/`: генератор проекта, структурные проверки, выбор симулятора для CI.
- `.github/workflows/ios.yml`: CI на macOS.
- `tools/package_ipa.sh`: Release archive для настоящего iPhone и упаковка Payload.
- `tools/verify_ipa.py`: проверка ZIP, Info.plist, ARM64 и платформы Mach-O (iOS, не Simulator).
## Результаты 2026-09-10
- `07322c2`: успешный [Actions run 34445566212](https://github.com/polskikh13/musicbridgeios/actions/runs/34445566212).
Добавлен Release archive и неподписанный IPA для Sideloadly. Скачан в
`build/Sideloadly/MusicBridge-iPhone.ipa` (112334 байта). Локальная проверка ZIP,
Info.plist и Mach-O подтвердила iPhoneOS ARM64, минимум iOS 17.0.
Подпись и установка выполняются пользователем в Sideloadly; на физическом
iPhone ещё не проверено. Инструкция добавлена в README.md.
- `a761431`: успешный [Actions run 34444563869](https://github.com/polskikh13/musicbridgeios/actions/runs/34444563869),
macos-15, Xcode 16.4, Swift 6.1.2, симулятор iOS 18.5; 7 XCTest прошли.
Артефакты: MusicBridge-simulator и ios-test-results (лог и xcresult), хранение 7 дней.
- Первый CI-прогон не дошёл до компиляции: исправлены регистр UDID и выбор runtime
по версии активного SDK. Две регрессионные Python-проверки прошли локально.
- Структурная проверка Python прошла: генератор детерминирован, ссылки проекта,
состав исходников, Info.plist, схема и JSON согласованы.
- В CI есть предупреждения инструментов о подписанных библиотеках XCTest,
отсутствии AppIntents и Node 20 в checkout/upload-artifact v4; тесты прошли.
Миграция Actions на актуальные версии — отдельное небольшое обновление.
- Следующий шаг: интеграционные проверки TLS/WSS и UI, затем сканер QR/Bonjour.
Физический iPhone, Apple-подпись и управление настоящим ПК ещё не проверены.