Private Music — неофициальный клиент VK Музыки для iPhone, написанный на SwiftUI. Проект развивает decoder-dev.
- вход в VK через изолированное веб-окно и хранение сессии в Keychain;
- главная с историей, рекомендациями, миксами и плейлистами VK;
- единый поиск с предсказуемой навигацией на всех поддерживаемых версиях iOS;
- поиск треков и исполнителей с историей запросов;
- медиатека, плейлисты, очередь и восстановление воспроизведения;
- перестановка следующих треков в очереди и очистка предстоящих треков без остановки текущего; очистка отключает автодобавление до новой очереди;
- поиск по всей медиатеке с догрузкой страниц и повтором при ошибке;
- офлайн-загрузка треков и плейлистов, уже сохранённые локальные файлы воспроизводятся без сети;
- edge-to-edge плеер без системных чёрных полей, фоновое аудио, экран блокировки, AirPlay и Bluetooth;
- companion-пульт для Apple Watch (watchOS 10+): обложка, прогресс, очередь, лайк, пауза/воспроизведение, предыдущий и следующий трек через WatchConnectivity; последнее состояние остаётся на часах, если iPhone временно недоступен;
- пауза при снятии наушников / AirPods по
Responding to audio route changes
(
routeChangeNotification,oldDeviceUnavailable) и Automatic Ear Detection; - тексты песен из VK, LRCLIB и Genius;
- ручная прокрутка текста песни с возвратом к текущей строке и возможностью отключить автопрокрутку;
- 10-полосный эквалайзер и настройки воспроизведения;
- отправка настоящего MP3- или M4A-файла через системное меню «Поделиться» без подмены ссылкой — основной способ сохранить трек в текущей сборке;
- чёрная и белая темы;
- единая панель навигации Liquid Glass и мини-плеер, которые резервируют место над контентом на iOS 17–27;
- интерфейс на русском и английском языках;
- Privacy Manifest без аналитики и отслеживания.
- готовность к сборке на Xcode 27 / iOS 27 SDK: scene lifecycle (TN3187) объявлен в Info.plist и AppDelegate.
Для локальной сборки нужен macOS с Xcode 27 и XcodeGen:
brew install xcodegen
git clone https://github.com/decoder-dev/PrivateMusic2.git
cd PrivateMusic2
bash ./scripts/bootstrap.sh
open PrivateMusic.xcodeprojCI прогоняет unit-тесты и собирает watchOS-пульт на Xcode 26.5, затем
собирает релизный IPA на GitHub-hosted runner xcode-27 с iOS 27 SDK.
Для установки на физический iPhone укажите свою команду разработчика в
Signing & Capabilities. Репозиторий также собирает неподписанный IPA через
GitHub Actions. Такой архив перед установкой необходимо подписать собственным
сертификатом: сначала вложенный Watch bundle, затем приложение iPhone.
Для companion-приложения нужны два App ID и provisioning profile одной команды:
com.dec.privatemusic2.watchkitapp и com.dec.privatemusic2. Сторонний
подписыватель должен сохранить и подписать
PlugIns/PrivateMusicWatch.app; подпись только внешнего iPhone-приложения
установит телефонную версию без версии для часов. При включённой настройке
Watch → «Основные» → «Автоустановка приложений» companion устанавливается
автоматически, иначе он появляется в Watch → «Доступные приложения».
Структурные проверки можно запустить на Windows, Linux или macOS:
python scripts/validate_project.py
python scripts/validate_localizations.pyRelease генерирует dSYM для iPhone и Apple Watch. CI сверяет UUID каждого
бинарника приложения с символами и публикует PrivateMusic-VERSION-SHA-dSYMs.zip
вместе с IPA. В ZIP находится build-manifest.json с коммитом, версиями и UUID.
Выбирайте символы по UUID из отчёта о крэше: одинаковая версия приложения
не гарантирует одинаковую сборку. Архив dSYM не нужно устанавливать на iPhone.
Ручной запуск workflow на main также публикует пререлиз после тестов.
Уже опубликованные версии не перезаписываются: повторная сборка сохраняется
только в Actions artifacts. Для нового выпуска нужно поднять версию в project.yml.
Private Music не содержит паролей, пользовательских токенов или чужих
client_secret. Приватные методы VK Музыки не являются публичным стабильным
API и могут измениться. Используйте только собственную учётную запись и не
публикуйте полученный токен.
Проект не связан с VK и не распространяет музыкальные файлы. Экспорт работает только для потока, доступ к которому уже получен текущей пользовательской сессией. Офлайн-загрузка поддерживает как прямые аудиофайлы, так и HLS через системный загрузчик AVFoundation. HLS-пакет предназначен только для локального воспроизведения: его нельзя простым переименованием превратить в MP3. Поэтому «Поделиться» отправляет прямой MP3 либо экспортирует доступный незашифрованный поток в M4A. Защищённый DRM-поток не обходится и не маскируется под аудиофайл.