Сборка и подписание билдов для Meta Quest Store
Сборка под Meta Quest — это не просто Build And Run из Unity с выбранным Android target. У Meta своя цепочка требований: подпись билда, entitlements, настройки манифеста, параметры manifest.json для Horizon Store, требования к target API level и куча нюансов, которые выясняются уже на этапе сабмита, а не раньше.
Где конкретно ломается цепочка подписания
Самая частая проблема — несоответствие keystore между debug и release сборками. Разработчик тестировал приложение месяцами с debug keystore, всё работало. При переходе на release keystore с другим SHA-1 перестают работать entitlements, привязанные к приложению в Horizon Developer Dashboard. Пользователь устанавливает приложение, открывает — получает ошибку авторизации в Platform SDK, потому что OVRPlatform.Initialize() возвращает INVALID_CREDENTIALS.
Второй класс проблем — AndroidManifest.xml. Meta требует набор специфичных permissions и intent-filter: com.oculus.permission.HAND_TRACKING, com.oculus.permission.EYE_TRACKING, com.oculus.intent.category.VR. Если приложение использует passthrough, нужно явно прописать com.oculus.permission.USE_SCENE и horizonos.permission.USE_ANCHOR_API для пространственных якорей. Пропустил один — функция молча не работает, без ошибок в логах, только если включить verbose в adb logcat.
Отдельно стоит quest_categories в manifest.json пакета Horizon Store. Неправильная категория или отсутствующий supported_input_devices — и приложение не пройдёт автоматическую проверку. Meta проверяет соответствие манифеста заявленным функциям приложения.
Процесс сборки релизного билда
Работаем через Oculus Developer Hub или напрямую через командную строку с adb и apksigner из Android SDK Build Tools. Для Unity-проектов — Gradle wrapper, настройки в launcherTemplate.gradle и mainTemplate.gradle.
Ключевые шаги для корректного release-билда:
Keystore генерируется через keytool с параметрами -keyalg RSA -keysize 2048 -validity 10000. Хранится отдельно от репозитория, SHA-1 и SHA-256 сохраняются в защищённом хранилище проекта. В Unity — Player Settings → Publishing Settings → Use Custom Keystore.
target-api-level на момент 2024–2025 должен быть 32 или выше для новых сабмитов. Meta периодически повышает минимальный порог, это нужно проверять в актуальной документации Horizon OS.
Для проверки подписи перед сабмитом: apksigner verify --verbose --print-certs app-release.apk. Убеждаемся, что цепочка сертификатов корректна и fingerprint совпадает с зарегистрированным в Dashboard.
Тестирование подписанного билда на устройстве — через adb install -r app-release.apk. Перед тестом удаляем debug-версию полностью, иначе система может подхватить старые credentials.
Специфика для разных каналов дистрибуции
Meta Quest Store предполагает несколько каналов: App Lab (для ранних тестеров без полного ревью), Horizon Store (публичная публикация с полным ревью), и Side Quest / sideloading для внутреннего тестирования.
Для App Lab и Horizon Store требования к подписи идентичны — разница только в процессе ревью. Для sideloading можно использовать debug keystore, но только для внутренних тестов — это не релизный флоу.
Если в проекте используется Passthrough API или Mixed Reality Utility Kit (MRUK), в manifest.json добавляется секция required_feature с PASSTHROUGH. Без этого приложение не запустится на устройствах с отключённым passthrough.
| Тип сборки | Keystore | Target API | Проверка entitlements |
|---|---|---|---|
| Debug / Dev Mode | Debug keystore | Любой | Опционально |
| App Lab | Release keystore | ≥ 32 | Обязательно |
| Horizon Store | Release keystore | ≥ 32 | Обязательно + ревью Meta |
Как устроен процесс работы
Получаем доступ к Horizon Developer Dashboard организации или работаем через предоставленный app ID. Аудит текущего манифеста и Gradle-конфигурации. Настройка keystore-инфраструктуры, если её нет. Сборка, подписание, тест на устройстве, подготовка пакета для сабмита.
Если проект уже был опубликован и требует update — проверяем совместимость версии keystore и versionCode (Meta не принимает пакет с versionCode ≤ предыдущему).
Сроки: настройка с нуля — 1–2 рабочих дня. Если есть готовый проект с существующим манифестом и требуется только исправление и сабмит — несколько часов. Итерация при отклонении Meta — зависит от причины.
Стоимость определяется после анализа текущего состояния проекта.





