# MusicBridge iOS — план Обновлено: 2026-09-10. Пользователь разрешил начать нативное 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 после переустановки/блокировки. - [ ] Настроить подпись и установку на физический iPhone. - [ ] Проверить LAN/плеер/команды/обложку с настоящим Windows-агентом. - [ ] Камера для QR, системные разрешения и обработка отказа. - [ ] Bonjour-поиск `_musicbridge._tcp`, список ПК и обновление адреса при смене IP. - [ ] Улучшить ошибки сопряжения по серверным кодам; повтор загрузки обложки после 404. - [ ] Иконка приложения, визуальная проверка разных размеров экрана и Dynamic Type. - [ ] Live Activities / Dynamic Island / App Intents — отдельный последующий этап. Ограничения: хранится один ПК; при смене его IP пока нужно повторное сопряжение. Нет фонового воспроизведения, App Store/TestFlight и подписанной IPA. Потеря ответа на успешное сопряжение может оставить устройство на ПК: удалить его в окне агента перед повтором. Облачный runner не имеет доступа к домашней LAN. ## Карта - `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-подпись и управление настоящим ПК ещё не проверены.