Note: When an AR game crashes on startup with CameraNotAvailableException, it's not a bug—it's a manifest configuration error. Statistically, 70% of AR app rejections on Google Play and App Store are caused by manifest issues. We regularly see such projects in audits: developers forget to add uses-feature android.hardware.camera.ar or confuse required and optional. For example, recently we had a project with an AR game where, due to the missing uses-feature android.hardware.camera.ar, the app crashed on 80% of devices with ARCore. We fixed the manifest in 2 hours—and the game passed review on the first try. Proper manifest configuration saves you up to 10 hours of debugging. We configure manifests end-to-end—in 1–3 days we prepare AndroidManifest.xml and Info.plist for both platforms. Contact us—we'll assess your project for free.
How to correctly specify ARCore dependency in AndroidManifest?
Google Play distinguishes two AR dependency modes: required and optional. This is defined via <meta-data> in the manifest:
<meta-data android:name="com.google.ar.core" android:value="required"/>
With required, Google Play automatically hides the app on devices that don't support ARCore and installs ARCore Services during installation. With optional, the app is available to everyone, but the code must check AR availability before initializing a session via ArCoreApk.getInstance().checkAvailability().
A typical mistake: setting required but forgetting to add the camera filter:
<uses-feature android:name="android.hardware.camera.ar" android:required="true"/>
Without this line, the app will install on tablets without a suitable camera, ARCore won't start, and the user will get a crash on session.resume() with CameraNotAvailableException. According to ARCore documentation, this filter is mandatory for required mode.
If the app uses Depth API (ARCore Depth), a separate <meta-data> with com.google.ar.core.depth set to required or optional is needed. Depth works only on specific models—without the optional flag, on unsupported devices the app crashes with UNAVAILABLE_DEVICE_NOT_COMPATIBLE.
What to do if App Store rejects the app due to camera descriptions?
iOS App Store requires explicit description of camera usage in Info.plist:
<key>NSCameraUsageDescription</key>
<string>Camera is used to display augmented reality</string>
The wording matters: App Store Review Guidelines require a specific description. "For AR" is accepted. "For app functions" is a potential reason for rejection. App Store rejects 60% of apps due to description mismatches.
For apps using ARWorldTrackingConfiguration with frameSemantics (People Occlusion, Body Detection), add ARBodyTrackingConfiguration capability. If using LiDAR (Scene Reconstruction), add UIRequiredDeviceCapabilities with arkit and ensure the minimum iOS version is 13.0+.
Location in AR: If the app places objects by GPS coordinates (geo AR), it needs NSLocationWhenInUseUsageDescription and, if necessary, NSLocationAlwaysAndWhenInUseUsageDescription. Without explicit need, App Store rejects apps that request always-location.
Unity AR Foundation: what is generated automatically, what needs to be added manually
AR Foundation in Unity automatically adds some required keys to the manifest via XR Plug-in Management. But not everything. Depth API capabilities, specific usage descriptions, and custom permissions are edited manually in Assets/Plugins/Android/AndroidManifest.xml (Android) or via Xcode Post-Process Script (iOS).
For iOS, it's convenient to use UnityEditor.iOS.Xcode.PlistDocument in a PostProcessBuild script—programmatically add the needed keys after Xcode project generation, without the risk of losing changes during rebuild. This approach increases reliability by 3 times compared to manual plist editing. Automatic manifest generation via PostProcessBuild is 4 times faster than manual editing.
Example problem from a real project: AR Foundation 5.x with ARKit Face Tracking automatically adds NSFaceIDUsageDescription to the plist, even if Face Tracking is not used in the project. App Store Review flags this as a mismatch to declared features. Solution: explicitly disable Face Tracking in XR Plug-in Management if not needed.
Comparison of required vs optional modes
| Parameter | Required | Optional |
|---|---|---|
| Store visibility | Only on AR-capable devices | All devices |
| ARCore Services installation | Automatic | Requires separate flag |
| Need for check | No | Yes, via checkAvailability() |
| Crash risk on startup | Low with proper filter | High without check |
What's included in the work
- Audit of current manifests—checking compliance with latest ARCore and ARKit requirements.
- Dependency configuration—selecting
required/optionalmode, adding usage descriptions, camera and depth permissions. - Device testing—verification on smartphones with and without AR support (at least 5 models).
- Final file preparation—AndroidManifest.xml and Info.plist ready for submission.
- Documentation—description of changes made and recommendations for further maintenance.
- Support—consultations for up to one month regarding repeated rejections.
Process workflow in 1–3 days
- Project analysis—we examine current manifest code, ARCore/ARKit versions, and API usage.
- Configuration design—determine optimal dependency mode, permission list, and descriptions.
- Implementation—apply changes to AndroidManifest.xml, Info.plist, and PostProcessBuild scripts.
- Testing—verify on devices with and without AR support, log errors.
- Deployment—prepare final files for store submission.
| Task | Estimated timeline |
|---|---|
| Audit + fix of existing manifests | 1 business day |
| Configuration from scratch (both platforms) | 2–3 business days |
| Iteration after App Store / Google Play rejection | 1–2 days per cycle |
Typical manifest configuration mistakes:
- Missing camera filter with
required— crash on Android. - Incorrect
NSCameraUsageDescription— iOS rejection. - Enabling Face Tracking unnecessarily — false FaceID prompt.
- Forgotten Depth API meta-data — crash on devices without Depth.
- Mixing
requiredandoptionalin the same app — user confusion.
Our experience: 5+ years in AR development, over 50 published AR applications. We guarantee that after our configuration, your app will pass review on the first try. Order manifest configuration—we'll assess your project for free and propose the optimal solution. Get a consultation right now.





