tags: [vr-ar]
Сборка та підписання білдів для 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 — залежить від причини.
Вартість визначається після аналізу поточного стану проекту.





