React Native permissions generator
Work out what a React Native or Expo app has to declare — no account is needed. Tick the device features your app uses, and get the Android grants and iOS usage descriptions together. You also get:
- an Expo
app.jsonfragment - bare-workflow
AndroidManifest.xmlandInfo.plistentries - the
npx expo installline for the needed libraries
Features that need consent
React Native permissions follow the feature that needs them. Pick a feature and both platforms are declared together — the Android grant and the iOS usage description — because shipping one without the other is an app that works on the device you tested and fails on the other store.
0/13 selected
{
"expo": {
"ios": {},
"android": {},
"plugins": [
"expo-router"
]
}
}
Nothing selected: an app with no declarations still gets the internet, storage inside its own sandbox, and everything else that needs no consent.
Both platforms, together
Android wants a permission string; iOS wants a sentence the user reads in the consent prompt. Every feature here emits both, so one platform is not left out at submission.
Usage descriptions stay TODO
The generated iOS strings are placeholders. They name the reason, but they are not finished copy. App Review rejects boilerplate usage descriptions — a tool that wrote polished-sounding text would just hand you that rejection.
Grants that come in pairs
Some features need more than one Android grant. Calendar is read and write; Bluetooth on Android 12+ splits into scan and connect. Half a pair can fail on a device even when the build passes, so both grants are always emitted.
React Native permissions, answered
The longer version is in the guide React Native permissions that satisfy both stores.
- Where do React Native permissions actually go?
- For Expo app.json permissions, use expo.android.permissions for the Android grant strings and expo.ios.infoPlist for the iOS usage descriptions — prebuild writes them into the native projects. In the bare workflow, you edit the native files by hand: android/app/src/main/AndroidManifest.xml for uses-permission lines, and ios/<App>/Info.plist for the usage keys.
- Why was my app rejected for a permission?
- Most often, it was the iOS usage description. Each NS*UsageDescription string is shown in the consent prompt, and App Review rejects a missing one at once and a vague one often too. The string has to say what your app does with the data, in your own words — that is why every description this tool makes is a visible TODO, not text you can ship as-is.
- Do I need to ask for permission at runtime too?
- Yes. A declaration only makes the request possible — the app still has to call the runtime API the first time the feature is used. Each React Native permission needs both a declaration and a runtime request, and the library for that feature exposes the request step: expo-camera's useCameraPermissions, expo-location's requestForegroundPermissionsAsync, expo-notifications' requestPermissionsAsync. A declared but never requested permission does nothing; a requested but never declared one fails.
- Do I need the react-native-permissions library?
- It depends on your workflow. This tool generates the declaration half — the Android grants and iOS usage descriptions — which every app needs regardless. For the runtime request half, Expo apps mostly use the per-feature libraries (expo-camera, expo-location) and their request APIs. In the bare workflow, the react-native-permissions library is the standard single API for checking and requesting many permissions, and it works alongside these declarations: the library asks, the declaration is what makes asking possible.
- Which React Native permissions need extra review?
- Background location is the strictest. Both stores ask you to justify it, and Android splits it into a separate grant that you can request only after foreground location is allowed. App tracking transparency needs an explicit iOS prompt before any advertising identifier is read. Contacts, calendar, and the photo library are also treated as personal data from someone other than your user.
- Is this React Native permissions generator free?
- Yes. It runs in your browser, needs no account, and nothing you pick is sent anywhere. The same permission terms drive Nodlume's Mobile scaffolding, so the declarations here match what the workspace builds for an Expo Router project.
Scaffold the whole mobile app
In the Nodlume workspace, these declarations come from the app itself: screens drawn on a visual structure canvas become an Expo Router project, and a screen that uses the camera is what adds the camera permission to its app.json. If you also ship desktop apps, the Tauri permissions generator is this page's desktop sibling, and the Manifest V3 generator covers browser extensions.