{"id":4557,"url":"https://github.com/zoontek/react-native-permissions","last_synced_at":"2026-02-11T13:03:43.945Z","repository":{"id":38178218,"uuid":"54657328","full_name":"zoontek/react-native-permissions","owner":"zoontek","description":"An unified permissions API for React Native on iOS, Android and Windows.","archived":false,"fork":false,"pushed_at":"2025-04-27T09:51:06.000Z","size":7376,"stargazers_count":4215,"open_issues_count":9,"forks_count":845,"subscribers_count":36,"default_branch":"master","last_synced_at":"2025-05-03T22:39:09.666Z","etag":null,"topics":["authorization","permissions","react","react-native"],"latest_commit_sha":null,"homepage":"","language":"Objective-C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zoontek.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":["zoontek"]}},"created_at":"2016-03-24T16:33:42.000Z","updated_at":"2025-05-03T14:34:47.000Z","dependencies_parsed_at":"2024-06-09T10:46:43.434Z","dependency_job_id":"798c6e84-0d3b-4dde-864f-4c6cdc442a0d","html_url":"https://github.com/zoontek/react-native-permissions","commit_stats":{"total_commits":629,"total_committers":126,"mean_commits":4.992063492063492,"dds":"0.38314785373608906","last_synced_commit":"e380b10ebecdd021398ecabc0680a35f7d54e916"},"previous_names":["yonahforst/react-native-permissions","react-native-community/react-native-permissions","joshblour/react-native-permissions"],"tags_count":82,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoontek%2Freact-native-permissions","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoontek%2Freact-native-permissions/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoontek%2Freact-native-permissions/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoontek%2Freact-native-permissions/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zoontek","download_url":"https://codeload.github.com/zoontek/react-native-permissions/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252577020,"owners_count":21770721,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["authorization","permissions","react","react-native"],"created_at":"2024-01-05T20:17:16.201Z","updated_at":"2026-02-11T13:03:43.937Z","avatar_url":"https://github.com/zoontek.png","language":"Objective-C++","funding_links":["https://github.com/sponsors/zoontek"],"categories":["Components","Objective-C++"],"sub_categories":["System"],"readme":"# ☝🏼 react-native-permissions\n\nAn unified permissions API for React Native on iOS, Android and Windows.\u003cbr\u003e\n(For Windows only builds 18362 and later are supported)\n\n[![mit licence](https://img.shields.io/dub/l/vibe-d.svg?style=for-the-badge)](https://github.com/zoontek/react-native-permissions/blob/main/LICENSE)\n[![npm version](https://img.shields.io/npm/v/react-native-permissions?style=for-the-badge)](https://www.npmjs.org/package/react-native-permissions)\n[![npm downloads](https://img.shields.io/npm/dt/react-native-permissions.svg?label=downloads\u0026style=for-the-badge)](https://www.npmjs.org/package/react-native-permissions)\n\u003cbr /\u003e\n[![platform - android](https://img.shields.io/badge/platform-Android-3ddc84.svg?logo=android\u0026style=for-the-badge)](https://www.android.com)\n[![platform - ios](https://img.shields.io/badge/platform-iOS-000.svg?logo=apple\u0026style=for-the-badge)](https://developer.apple.com/ios)\n[![platform - windows](https://img.shields.io/badge/platform-Windows-0067b8.svg?logo=windows\u0026style=for-the-badge)](https://www.microsoft.com/en-us/windows)\n\n## Support\n\nThis library follows the React Native [releases support policy](https://github.com/reactwg/react-native-releases/blob/main/docs/support.md).\u003cbr\u003e\nIt is supporting the **latest version**, and the **two previous minor series**.\n\n## Setup\n\n```bash\n$ npm i -S react-native-permissions\n# --- or ---\n$ yarn add react-native-permissions\n```\n\n### iOS\n\n1. By default, no permissions are available. First, require the `setup` script in your `Podfile`:\n\n```diff\n# Transform this into a `node_require` generic function:\n- # Resolve react_native_pods.rb with node to allow for hoisting\n- require Pod::Executable.execute_command('node', ['-p',\n-   'require.resolve(\n-     \"react-native/scripts/react_native_pods.rb\",\n-     {paths: [process.argv[1]]},\n-   )', __dir__]).strip\n\n+ def node_require(script)\n+   # Resolve script with node to allow for hoisting\n+   require Pod::Executable.execute_command('node', ['-p',\n+     \"require.resolve(\n+       '#{script}',\n+       {paths: [process.argv[1]]},\n+     )\", __dir__]).strip\n+ end\n\n# Use it to require both react-native's and this package's scripts:\n+ node_require('react-native/scripts/react_native_pods.rb')\n+ node_require('react-native-permissions/scripts/setup.rb')\n```\n\n2. In the same `Podfile`, call `setup_permissions` with the permissions you need. Only the permissions specified here will be added:\n\n```ruby\n# …\n\nplatform :ios, min_ios_version_supported\nprepare_react_native_project!\n\n# ⬇️ uncomment the permissions you need\nsetup_permissions([\n  # 'AppTrackingTransparency',\n  # 'Bluetooth',\n  # 'Calendars',\n  # 'CalendarsWriteOnly',\n  # 'Camera',\n  # 'Contacts',\n  # 'FaceID',\n  # 'LocationAccuracy',\n  # 'LocationAlways',\n  # 'LocationWhenInUse',\n  # 'MediaLibrary',\n  # 'Microphone',\n  # 'Motion',\n  # 'Notifications',\n  # 'PhotoLibrary',\n  # 'PhotoLibraryAddOnly',\n  # 'Reminders',\n  # 'Siri',\n  # 'SpeechRecognition',\n  # 'StoreKit',\n])\n\n# …\n```\n\n3. Then execute `pod install` in your `ios` directory _(📌  Note that it must be re-executed each time you update this config)_.\n4. Finally, add the corresponding permissions usage descriptions to your `Info.plist`. For example:\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003c!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\"\u003e\n\u003cplist version=\"1.0\"\u003e\n\u003cdict\u003e\n\n  \u003c!-- 🚨 Keep only the permissions specified in `setup_permissions` 🚨 --\u003e\n\n  \u003ckey\u003eNSAppleMusicUsageDescription\u003c/key\u003e\n  \u003cstring\u003e[REASON]\u003c/string\u003e\n  \u003ckey\u003eNSBluetoothAlwaysUsageDescription\u003c/key\u003e\n  \u003cstring\u003e[REASON]\u003c/string\u003e\n  \u003ckey\u003eNSBluetoothPeripheralUsageDescription\u003c/key\u003e\n  \u003cstring\u003e[REASON]\u003c/string\u003e\n  \u003ckey\u003eNSCalendarsFullAccessUsageDescription\u003c/key\u003e\n  \u003cstring\u003e[REASON]\u003c/string\u003e\n  \u003ckey\u003eNSCalendarsWriteOnlyAccessUsageDescription\u003c/key\u003e\n  \u003cstring\u003e[REASON]\u003c/string\u003e\n  \u003ckey\u003eNSCameraUsageDescription\u003c/key\u003e\n  \u003cstring\u003e[REASON]\u003c/string\u003e\n  \u003ckey\u003eNSContactsUsageDescription\u003c/key\u003e\n  \u003cstring\u003e[REASON]\u003c/string\u003e\n  \u003ckey\u003eNSFaceIDUsageDescription\u003c/key\u003e\n  \u003cstring\u003e[REASON]\u003c/string\u003e\n  \u003ckey\u003eNSLocationAlwaysAndWhenInUseUsageDescription\u003c/key\u003e\n  \u003cstring\u003e[REASON]\u003c/string\u003e\n  \u003ckey\u003eNSLocationTemporaryUsageDescriptionDictionary\u003c/key\u003e\n  \u003cdict\u003e\n    \u003ckey\u003eYOUR-PURPOSE-KEY\u003c/key\u003e\n    \u003cstring\u003e[REASON]\u003c/string\u003e\n  \u003c/dict\u003e\n  \u003ckey\u003eNSLocationWhenInUseUsageDescription\u003c/key\u003e\n  \u003cstring\u003e[REASON]\u003c/string\u003e\n  \u003ckey\u003eNSMicrophoneUsageDescription\u003c/key\u003e\n  \u003cstring\u003e[REASON]\u003c/string\u003e\n  \u003ckey\u003eNSMotionUsageDescription\u003c/key\u003e\n  \u003cstring\u003e[REASON]\u003c/string\u003e\n  \u003ckey\u003eNSPhotoLibraryUsageDescription\u003c/key\u003e\n  \u003cstring\u003e[REASON]\u003c/string\u003e\n  \u003ckey\u003eNSPhotoLibraryAddUsageDescription\u003c/key\u003e\n  \u003cstring\u003e[REASON]\u003c/string\u003e\n  \u003ckey\u003eNSRemindersFullAccessUsageDescription\u003c/key\u003e\n  \u003cstring\u003e[REASON]\u003c/string\u003e\n  \u003ckey\u003eNSSpeechRecognitionUsageDescription\u003c/key\u003e\n  \u003cstring\u003e[REASON]\u003c/string\u003e\n  \u003ckey\u003eNSSiriUsageDescription\u003c/key\u003e\n  \u003cstring\u003e[REASON]\u003c/string\u003e\n  \u003ckey\u003eNSUserTrackingUsageDescription\u003c/key\u003e\n  \u003cstring\u003e[REASON]\u003c/string\u003e\n\n  \u003c!-- … --\u003e\n\n\u003c/dict\u003e\n\u003c/plist\u003e\n```\n\n### Android\n\nAdd all wanted permissions to your app `android/app/src/main/AndroidManifest.xml` file:\n\n```xml\n\u003cmanifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\u003e\n\n  \u003c!-- 🚨 Keep only the permissions used in your app 🚨 --\u003e\n\n  \u003cuses-permission android:name=\"android.permission.ACCEPT_HANDOVER\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.ACCESS_BACKGROUND_LOCATION\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.ACCESS_MEDIA_LOCATION\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.ACTIVITY_RECOGNITION\" /\u003e\n  \u003cuses-permission android:name=\"com.android.voicemail.permission.ADD_VOICEMAIL\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.ANSWER_PHONE_CALLS\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.BLUETOOTH_ADVERTISE\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.BLUETOOTH_CONNECT\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.BLUETOOTH_SCAN\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.BODY_SENSORS\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.BODY_SENSORS_BACKGROUND\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.CALL_PHONE\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.CAMERA\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.GET_ACCOUNTS\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.NEARBY_WIFI_DEVICES\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.POST_NOTIFICATIONS\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.PROCESS_OUTGOING_CALLS\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.READ_CALENDAR\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.READ_CALL_LOG\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.READ_CONTACTS\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.READ_MEDIA_AUDIO\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.READ_MEDIA_IMAGES\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.READ_MEDIA_VIDEO\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.READ_MEDIA_VISUAL_USER_SELECTED\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.READ_PHONE_NUMBERS\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.READ_PHONE_STATE\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.READ_SMS\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.RECEIVE_MMS\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.RECEIVE_SMS\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.RECEIVE_WAP_PUSH\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.RECORD_AUDIO\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.SCHEDULE_EXACT_ALARM\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.SEND_SMS\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.USE_FULL_SCREEN_INTENT\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.USE_SIP\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.UWB_RANGING\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.WRITE_CALENDAR\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.WRITE_CALL_LOG\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.WRITE_CONTACTS\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" /\u003e\n\n  \u003c!-- … --\u003e\n\n\u003c/manifest\u003e\n```\n\n### Expo\n\nIf you use Expo, the previous sections don't apply. Instead just update your `app.json` file with the corresponding values, but using the syntax exemplified below:\n\n```js\n{\n  \"expo\": {\n    \"name\": \"Awesome app\",\n    \"plugins\": [\n      [\n        \"react-native-permissions\",\n        {\n          // Add setup_permissions to your Podfile (see iOS setup - steps 1, 2 and 3)\n          \"iosPermissions\": [\n            \"Camera\",\n            \"Microphone\"\n          ]\n        }\n      ]\n    ],\n    \"ios\": {\n      // Add descriptions to your Info.plist (see iOS setup - step 4)\n      \"infoPlist\": {\n        \"NSCameraUsageDescription\": \"[REASON]\",\n        \"NSMicrophoneUsageDescription\": \"[REASON]\"\n      }\n    },\n    \"android\": {\n      // Add permissions to your AndroidManifest.xml (see Android setup)\n      \"permissions\": [\n        \"android.permission.CAMERA\",\n        \"android.permission.RECORD_AUDIO\"\n      ]\n    }\n  }\n}\n```\n\n### Windows\n\nOpen the project solution file from the `windows` folder. In the app project open `Package.appxmanifest` file. From there you can select which capabilites you want your app to support.\n\n## 🆘 Manual linking\n\nBecause this package targets recent React Native versions, you probably don't need to link it manually. But if you have a special case, follow these additional instructions:\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003e👀 See manual linking instructions\u003c/b\u003e\u003c/summary\u003e\n\n### iOS\n\nAdd this line to your `ios/Podfile` file, then run `pod install`.\n\n```bash\ntarget 'YourAwesomeProject' do\n  # …\n  pod 'RNPermissions', :path =\u003e '../node_modules/react-native-permissions'\nend\n```\n\n### Android\n\n1. Add the following lines to `android/settings.gradle`:\n\n```gradle\ninclude ':react-native-permissions'\nproject(':react-native-permissions').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-permissions/android')\n```\n\n2. Add the implementation line to the dependencies in `android/app/build.gradle`:\n\n```gradle\ndependencies {\n  // ...\n  implementation project(':react-native-permissions')\n}\n```\n\n3. Add the import and link the package in `MainApplication.java`:\n\n```java\nimport com.zoontek.rnpermissions.RNPermissionsPackage; // \u003c- add the RNPermissionsPackage import\n\npublic class MainApplication extends Application implements ReactApplication {\n\n  // …\n\n  @Override\n  protected List\u003cReactPackage\u003e getPackages() {\n    @SuppressWarnings(\"UnnecessaryLocalVariable\")\n    List\u003cReactPackage\u003e packages = new PackageList(this).getPackages();\n    // …\n    packages.add(new RNPermissionsPackage());\n    return packages;\n  }\n\n  // …\n}\n```\n\n### Windows\n\n1. In `windows/myapp.sln` add the `RNCConfig` project to your solution:\n\n- Open the solution in Visual Studio 2019\n- Right-click Solution icon in Solution Explorer \u003e Add \u003e Existing Project\n- Select `node_modules\\react-native-permissions\\windows\\RNPermissions\\RNPermissions.vcxproj`\n\n2. In `windows/myapp/myapp.vcxproj` ad a reference to `RNPermissions` to your main application project. From Visual Studio 2019:\n\n- Right-click main application project \u003e Add \u003e Reference...\n- Check `RNPermissions` from Solution Projects.\n\n3. In `pch.h` add `#include \"winrt/RNPermissions.h\"`.\n\n4. In `app.cpp` add `PackageProviders().Append(winrt::RNPermissions::ReactPackageProvider());` before `InitializeComponent();`.\n\n\u003c/details\u003e\n\n## Understanding permission flow\n\nAs permissions are not handled in the same way on iOS, Android and Windows, this library provides an abstraction over the three platforms behaviors. To understand it a little better, take a look to this flowchart:\n\n```\n ┏━━━━━━━━━━━━━━━━━━━━━━━━┓\n ┃ check(PERMISSIONS.X.Y) ┃\n ┗━━━━━━━━━━━━━━━━━━━━━━━━┛\n              │                                ┌─────────────────────┐\n  Is the feature available ───────── NO ─────▶ │ RESULTS.UNAVAILABLE │\n      on this device ?                         └─────────────────────┘\n              │\n             YES\n              │                                ┌───────────────────────────┐\n      Is the permission ─────────── YES ─────▶ │ RESULTS.GRANTED / LIMITED │\n      already granted ?                        └───────────────────────────┘\n              │\n              NO\n              │                                ┌─────────────────┐\nIs the permission requestable, ───── NO ─────▶ │ RESULTS.BLOCKED │\n or is the platform Android ?                  └─────────────────┘\n              │\n             YES\n              │\n              ▼\n     ┌────────────────┐\n     │ RESULTS.DENIED │\n     └────────────────┘\n              │\n              ▼\n ┏━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n ┃ request(PERMISSIONS.X.Y) ┃◀─────────────────────────┐\n ┗━━━━━━━━━━━━━━━━━━━━━━━━━━┛                          │\n              │                                       YES\n              │                                        │\n    Did the user see and ──────── NO ──────── Is the permission\n    accept the request ?                      still requestable ?\n              │                                        │\n             YES                                       NO\n              │                                        │\n              ▼                                        ▼\n┌───────────────────────────┐                 ┌─────────────────┐\n│ RESULTS.GRANTED / LIMITED │                 │ RESULTS.BLOCKED │\n└───────────────────────────┘                 └─────────────────┘\n```\n\nThis can be implemented as follows:\n\n- `check` the permission status\n- If `granted`, use the feature\n- If `blocked`, display a screen prompting the user to go to settings (using `openSettings`) _(This will not be shown on Android)_\n- If `denied`, display a button to `request` permission:\n  - If `granted`, use the feature\n  - If `blocked`, display an alert prompting the user to go to settings (using `openSettings`)\n\nThe user experience (UX) is excellent on iOS and acceptable on Android, considering the platform's limitations.\n\n\u003e [!IMPORTANT]\n\u003e _One-time permissions on Android 11+_\n\u003e\n\u003e When a user grants a one-time permission (such as for location, camera, or microphone), Android treats the session as active while the app is in use — even if it's backgrounded or reopened shortly after being closed.\n\u003e\n\u003e The system will revoke the permission automatically within **30 to 60 seconds** if:\n\u003e\n\u003e - The app is terminated (e.g. swiped away or force-closed).\n\u003e - The app is backgrounded and unused.\n\u003e\n\u003e The exact timing may vary depending on the Android version and device. For more informations, see the official [Android 11 permissions documentation](https://developer.android.com/about/versions/11/privacy/permissions#one-time-permission).\n\n## API\n\n### Supported permissions\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eAndroid permissions\u003c/b\u003e\u003c/summary\u003e\n\n```js\nimport {PERMISSIONS} from 'react-native-permissions';\n\nPERMISSIONS.ANDROID.ACCEPT_HANDOVER;\nPERMISSIONS.ANDROID.ACCESS_BACKGROUND_LOCATION;\nPERMISSIONS.ANDROID.ACCESS_COARSE_LOCATION;\nPERMISSIONS.ANDROID.ACCESS_FINE_LOCATION;\nPERMISSIONS.ANDROID.ACCESS_MEDIA_LOCATION;\nPERMISSIONS.ANDROID.ACTIVITY_RECOGNITION;\nPERMISSIONS.ANDROID.ADD_VOICEMAIL;\nPERMISSIONS.ANDROID.ANSWER_PHONE_CALLS;\nPERMISSIONS.ANDROID.BLUETOOTH_ADVERTISE;\nPERMISSIONS.ANDROID.BLUETOOTH_CONNECT;\nPERMISSIONS.ANDROID.BLUETOOTH_SCAN;\nPERMISSIONS.ANDROID.BODY_SENSORS;\nPERMISSIONS.ANDROID.BODY_SENSORS_BACKGROUND;\nPERMISSIONS.ANDROID.CALL_PHONE;\nPERMISSIONS.ANDROID.CAMERA;\nPERMISSIONS.ANDROID.GET_ACCOUNTS;\nPERMISSIONS.ANDROID.NEARBY_WIFI_DEVICES;\nPERMISSIONS.ANDROID.POST_NOTIFICATIONS;\nPERMISSIONS.ANDROID.PROCESS_OUTGOING_CALLS;\nPERMISSIONS.ANDROID.READ_CALENDAR;\nPERMISSIONS.ANDROID.READ_CALL_LOG;\nPERMISSIONS.ANDROID.READ_CONTACTS;\nPERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE;\nPERMISSIONS.ANDROID.READ_MEDIA_AUDIO;\nPERMISSIONS.ANDROID.READ_MEDIA_IMAGES;\nPERMISSIONS.ANDROID.READ_MEDIA_VIDEO;\nPERMISSIONS.ANDROID.READ_MEDIA_VISUAL_USER_SELECTED;\nPERMISSIONS.ANDROID.READ_PHONE_NUMBERS;\nPERMISSIONS.ANDROID.READ_PHONE_STATE;\nPERMISSIONS.ANDROID.READ_SMS;\nPERMISSIONS.ANDROID.RECEIVE_MMS;\nPERMISSIONS.ANDROID.RECEIVE_SMS;\nPERMISSIONS.ANDROID.RECEIVE_WAP_PUSH;\nPERMISSIONS.ANDROID.RECORD_AUDIO;\nPERMISSIONS.ANDROID.SEND_SMS;\nPERMISSIONS.ANDROID.USE_SIP;\nPERMISSIONS.ANDROID.UWB_RANGING;\nPERMISSIONS.ANDROID.WRITE_CALENDAR;\nPERMISSIONS.ANDROID.WRITE_CALL_LOG;\nPERMISSIONS.ANDROID.WRITE_CONTACTS;\nPERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE;\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eiOS permissions\u003c/b\u003e\u003c/summary\u003e\n\n```js\nimport {PERMISSIONS} from 'react-native-permissions';\n\nPERMISSIONS.IOS.APP_TRACKING_TRANSPARENCY;\nPERMISSIONS.IOS.BLUETOOTH;\nPERMISSIONS.IOS.CALENDARS;\nPERMISSIONS.IOS.CALENDARS_WRITE_ONLY;\nPERMISSIONS.IOS.CAMERA;\nPERMISSIONS.IOS.CONTACTS;\nPERMISSIONS.IOS.FACE_ID;\nPERMISSIONS.IOS.LOCATION_ALWAYS;\nPERMISSIONS.IOS.LOCATION_WHEN_IN_USE;\nPERMISSIONS.IOS.MEDIA_LIBRARY;\nPERMISSIONS.IOS.MICROPHONE;\nPERMISSIONS.IOS.MOTION;\nPERMISSIONS.IOS.PHOTO_LIBRARY;\nPERMISSIONS.IOS.PHOTO_LIBRARY_ADD_ONLY;\nPERMISSIONS.IOS.REMINDERS;\nPERMISSIONS.IOS.SIRI;\nPERMISSIONS.IOS.SPEECH_RECOGNITION;\nPERMISSIONS.IOS.STOREKIT;\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eWindows permissions\u003c/b\u003e\u003c/summary\u003e\n\n```js\nimport {PERMISSIONS} from 'react-native-permissions';\n\nPERMISSIONS.WINDOWS.ACCESSORY_MANAGER;\nPERMISSIONS.WINDOWS.ACTIVITY;\nPERMISSIONS.WINDOWS.ALLOW_ELEVATION;\nPERMISSIONS.WINDOWS.ALL_APP_MODS;\nPERMISSIONS.WINDOWS.ALL_JOYN;\nPERMISSIONS.WINDOWS.APPOINTMENTS;\nPERMISSIONS.WINDOWS.APPOINTMENTS_SYSTEM;\nPERMISSIONS.WINDOWS.APP_BROADCAST_SERVICES;\nPERMISSIONS.WINDOWS.APP_CAPTURE_SERVICES;\nPERMISSIONS.WINDOWS.APP_CAPTURE_SETTINGS;\nPERMISSIONS.WINDOWS.APP_DIAGNOSTICS;\nPERMISSIONS.WINDOWS.APP_LICENSING;\nPERMISSIONS.WINDOWS.AUDIO_DEVICE_CONFIGURATION;\nPERMISSIONS.WINDOWS.BACKGROUND_MEDIA_PLAYBACK;\nPERMISSIONS.WINDOWS.BACKGROUND_MEDIA_RECORDING;\nPERMISSIONS.WINDOWS.BACKGROUND_SPATIAL_PERCEPTION;\nPERMISSIONS.WINDOWS.BACKGROUND_VOIP;\nPERMISSIONS.WINDOWS.BLOCKED_CHAT_MESSAGES;\nPERMISSIONS.WINDOWS.BLUETOOTH;\nPERMISSIONS.WINDOWS.BROAD_FILE_SYSTEM_ACCESS;\nPERMISSIONS.WINDOWS.CAMERA_PROCESSING_EXTENSION;\nPERMISSIONS.WINDOWS.CELLULAR_DEVICE_CONTROL;\nPERMISSIONS.WINDOWS.CELLULAR_DEVICE_IDENTITY;\nPERMISSIONS.WINDOWS.CELLULAR_MESSAGING;\nPERMISSIONS.WINDOWS.CHAT_SYSTEM;\nPERMISSIONS.WINDOWS.CODE_GENERATION;\nPERMISSIONS.WINDOWS.CONFIRM_APP_CLOSE;\nPERMISSIONS.WINDOWS.CONTACTS;\nPERMISSIONS.WINDOWS.CONTACTS_SYSTEM;\nPERMISSIONS.WINDOWS.CORTANA_PERMISSIONS;\nPERMISSIONS.WINDOWS.CORTANA_SPEECH_ACCESSORY;\nPERMISSIONS.WINDOWS.CUSTOM_INSTALL_ACTIONS;\nPERMISSIONS.WINDOWS.DEVELOPMENT_MODE_NETWORK;\nPERMISSIONS.WINDOWS.DEVICE_MANAGEMENT_DM_ACCOUNT;\nPERMISSIONS.WINDOWS.DEVICE_MANAGEMENT_EMAIL_ACCOUNT;\nPERMISSIONS.WINDOWS.DEVICE_MANAGEMENT_FOUNDATION;\nPERMISSIONS.WINDOWS.DEVICE_MANAGEMENT_WAP_SECURITY_POLICIES;\nPERMISSIONS.WINDOWS.DEVICE_PORTAL_PROVIDER;\nPERMISSIONS.WINDOWS.DEVICE_UNLOCK;\nPERMISSIONS.WINDOWS.DOCUMENTS_LIBRARY;\nPERMISSIONS.WINDOWS.DUAL_SIM_TILES;\nPERMISSIONS.WINDOWS.EMAIL;\nPERMISSIONS.WINDOWS.EMAIL_SYSTEM;\nPERMISSIONS.WINDOWS.ENTERPRISE_AUTHENTICATION;\nPERMISSIONS.WINDOWS.ENTERPRISE_CLOUD_S_S_O;\nPERMISSIONS.WINDOWS.ENTERPRISE_DATA_POLICY;\nPERMISSIONS.WINDOWS.ENTERPRISE_DEVICE_LOCKDOWN;\nPERMISSIONS.WINDOWS.EXPANDED_RESOURCES;\nPERMISSIONS.WINDOWS.EXTENDED_BACKGROUND_TASK_TIME;\nPERMISSIONS.WINDOWS.EXTENDED_EXECUTION_BACKGROUND_AUDIO;\nPERMISSIONS.WINDOWS.EXTENDED_EXECUTION_CRITICAL;\nPERMISSIONS.WINDOWS.EXTENDED_EXECUTION_UNCONSTRAINED;\nPERMISSIONS.WINDOWS.FIRST_SIGN_IN_SETTINGS;\nPERMISSIONS.WINDOWS.GAME_BAR_SERVICES;\nPERMISSIONS.WINDOWS.GAME_LIST;\nPERMISSIONS.WINDOWS.GAME_MONITOR;\nPERMISSIONS.WINDOWS.GAZE_INPUT;\nPERMISSIONS.WINDOWS.GLOBAL_MEDIA_CONTROL;\nPERMISSIONS.WINDOWS.HUMANINTERFACEDEVICE;\nPERMISSIONS.WINDOWS.INPUT_FOREGROUND_OBSERVATION;\nPERMISSIONS.WINDOWS.INPUT_INJECTION_BROKERED;\nPERMISSIONS.WINDOWS.INPUT_OBSERVATION;\nPERMISSIONS.WINDOWS.INPUT_SUPPRESSION;\nPERMISSIONS.WINDOWS.INTERNET_CLIENT;\nPERMISSIONS.WINDOWS.INTERNET_CLIENT_SERVER;\nPERMISSIONS.WINDOWS.INTEROP_SERVICES;\nPERMISSIONS.WINDOWS.IOT;\nPERMISSIONS.WINDOWS.LOCAL_SYSTEM_SERVICES;\nPERMISSIONS.WINDOWS.LOCATION;\nPERMISSIONS.WINDOWS.LOCATION_HISTORY;\nPERMISSIONS.WINDOWS.LOCATION_SYSTEM;\nPERMISSIONS.WINDOWS.LOW_LEVEL;\nPERMISSIONS.WINDOWS.LOW_LEVEL_DEVICES;\nPERMISSIONS.WINDOWS.MICROPHONE;\nPERMISSIONS.WINDOWS.MOBILE;\nPERMISSIONS.WINDOWS.MODIFIABLE_APP;\nPERMISSIONS.WINDOWS.MUSIC_LIBRARY;\nPERMISSIONS.WINDOWS.NETWORKING_VPN_PROVIDER;\nPERMISSIONS.WINDOWS.NETWORK_CONNECTION_MANAGER_PROVISIONING;\nPERMISSIONS.WINDOWS.NETWORK_DATA_PLAN_PROVISIONING;\nPERMISSIONS.WINDOWS.NETWORK_DATA_USAGE_MANAGEMENT;\nPERMISSIONS.WINDOWS.OEM_DEPLOYMENT;\nPERMISSIONS.WINDOWS.OEM_PUBLIC_DIRECTORY;\nPERMISSIONS.WINDOWS.ONE_PROCESS_VOIP;\nPERMISSIONS.WINDOWS.OPTICAL;\nPERMISSIONS.WINDOWS.PACKAGED_SERVICES;\nPERMISSIONS.WINDOWS.PACKAGES_SERVICES;\nPERMISSIONS.WINDOWS.PACKAGE_MANAGEMENT;\nPERMISSIONS.WINDOWS.PACKAGE_POLICY_SYSTEM;\nPERMISSIONS.WINDOWS.PACKAGE_QUERY;\nPERMISSIONS.WINDOWS.PACKAGE_WRITE_REDIRECTION_COMPATIBILITY_SHIM;\nPERMISSIONS.WINDOWS.PHONE_CALL;\nPERMISSIONS.WINDOWS.PHONE_CALL_HISTORY;\nPERMISSIONS.WINDOWS.PHONE_CALL_HISTORY_SYSTEM;\nPERMISSIONS.WINDOWS.PHONE_LINE_TRANSPORT_MANAGEMENT;\nPERMISSIONS.WINDOWS.PICTURES_LIBRARY;\nPERMISSIONS.WINDOWS.POINT_OF_SERVICE;\nPERMISSIONS.WINDOWS.PREVIEW_INK_WORKSPACE;\nPERMISSIONS.WINDOWS.PREVIEW_PEN_WORKSPACE;\nPERMISSIONS.WINDOWS.PREVIEW_STORE;\nPERMISSIONS.WINDOWS.PREVIEW_UI_COMPOSITION;\nPERMISSIONS.WINDOWS.PRIVATE_NETWORK_CLIENT_SERVER;\nPERMISSIONS.WINDOWS.PROTECTED_APP;\nPERMISSIONS.WINDOWS.PROXIMITY;\nPERMISSIONS.WINDOWS.RADIOS;\nPERMISSIONS.WINDOWS.RECORDED_CALLS_FOLDER;\nPERMISSIONS.WINDOWS.REMOTE_PASSPORT_AUTHENTICATION;\nPERMISSIONS.WINDOWS.REMOTE_SYSTEM;\nPERMISSIONS.WINDOWS.REMOVABLE_STORAGE;\nPERMISSIONS.WINDOWS.RESCAP;\nPERMISSIONS.WINDOWS.RUN_FULL_TRUST;\nPERMISSIONS.WINDOWS.SCREEN_DUPLICATION;\nPERMISSIONS.WINDOWS.SECONDARY_AUTHENTICATION_FACTOR;\nPERMISSIONS.WINDOWS.SECURE_ASSESSMENT;\nPERMISSIONS.WINDOWS.SERIALCOMMUNICATION;\nPERMISSIONS.WINDOWS.SHARED_USER_CERTIFICATES;\nPERMISSIONS.WINDOWS.SLAPI_QUERY_LICENSE_VALUE;\nPERMISSIONS.WINDOWS.SMBIOS;\nPERMISSIONS.WINDOWS.SMS_SEND;\nPERMISSIONS.WINDOWS.SPATIAL_PERCEPTION;\nPERMISSIONS.WINDOWS.START_SCREEN_MANAGEMENT;\nPERMISSIONS.WINDOWS.STORE_LICENSE_MANAGEMENT;\nPERMISSIONS.WINDOWS.SYSTEM_MANAGEMENT;\nPERMISSIONS.WINDOWS.TARGETED_CONTENT;\nPERMISSIONS.WINDOWS.TEAM_EDITION_DEVICE_CREDENTIAL;\nPERMISSIONS.WINDOWS.TEAM_EDITION_EXPERIENCE;\nPERMISSIONS.WINDOWS.TEAM_EDITION_VIEW;\nPERMISSIONS.WINDOWS.UAP;\nPERMISSIONS.WINDOWS.UI_AUTOMATION;\nPERMISSIONS.WINDOWS.UNVIRTUALIZED_RESOURCES;\nPERMISSIONS.WINDOWS.USB;\nPERMISSIONS.WINDOWS.USER_ACCOUNT_INFORMATION;\nPERMISSIONS.WINDOWS.USER_DATA_ACCOUNTS_PROVIDER;\nPERMISSIONS.WINDOWS.USER_DATA_SYSTEM;\nPERMISSIONS.WINDOWS.USER_PRINCIPAL_NAME;\nPERMISSIONS.WINDOWS.USER_SYSTEM_ID;\nPERMISSIONS.WINDOWS.VIDEOS_LIBRARY;\nPERMISSIONS.WINDOWS.VOIP_CALL;\nPERMISSIONS.WINDOWS.WALLET_SYSTEM;\nPERMISSIONS.WINDOWS.WEBCAM;\nPERMISSIONS.WINDOWS.WIFI_CONTROL;\nPERMISSIONS.WINDOWS.XBOX_ACCESSORY_MANAGEMENT;\n```\n\n\u003c/details\u003e\n\n### Permissions statuses\n\nPermission checks and requests resolve into one of these statuses:\n\n| Return value          | Notes                                                                                                                                  |\n| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |\n| `RESULTS.UNAVAILABLE` | This feature is not available (on this device / in this context)                                                                       |\n| `RESULTS.DENIED`      | The permission has not been requested / is denied but requestable                                                                      |\n| `RESULTS.BLOCKED`     | The permission is denied and not requestable                                                                                           |\n| `RESULTS.GRANTED`     | The permission is granted                                                                                                              |\n| `RESULTS.LIMITED`     | The permission is granted but with limitations\u003cbr\u003e_Only for iOS `Contacts`, `PhotoLibrary`, `PhotoLibraryAddOnly` and `Notifications`_ |\n\n### Types\n\n```ts\ntype ValueOf\u003cT\u003e = T[keyof T];\n\ntype Permission =\n  | ValueOf\u003ctypeof PERMISSIONS.ANDROID\u003e\n  | ValueOf\u003ctypeof PERMISSIONS.IOS\u003e\n  | ValueOf\u003ctypeof PERMISSIONS.WINDOWS\u003e;\n\ntype PermissionStatus = ValueOf\u003ctypeof RESULTS\u003e;\n\ntype RationaleObject = {\n  title: string;\n  message: string;\n  buttonPositive: string;\n  buttonNegative?: string;\n};\n\ntype Rationale = RationaleObject | (() =\u003e Promise\u003cboolean\u003e);\n\ntype NotificationOption =\n  | 'alert'\n  | 'badge'\n  | 'sound'\n  | 'carPlay'\n  | 'criticalAlert'\n  | 'provisional'\n  | 'providesAppSettings';\n\ntype NotificationSettings = {\n  // unavailable settings will not be included in the response object\n  alert?: boolean;\n  badge?: boolean;\n  sound?: boolean;\n  carPlay?: boolean;\n  criticalAlert?: boolean;\n  provisional?: boolean;\n  providesAppSettings?: boolean;\n  lockScreen?: boolean;\n  notificationCenter?: boolean;\n};\n\ntype NotificationsResponse = {\n  status: PermissionStatus;\n  settings: NotificationSettings;\n};\n\ntype LocationAccuracy = 'full' | 'reduced';\ntype LocationAccuracyOptions = {purposeKey: string};\n```\n\n### Methods\n\n#### check\n\nCheck one permission status.\n\n\u003e [!IMPORTANT]  \n\u003e On Android, the `check` function will never return a `blocked` status. You need to call `request` to obtain that information.\n\n```ts\nfunction check(permission: Permission): Promise\u003cPermissionStatus\u003e;\n```\n\n```ts\ncheck(PERMISSIONS.IOS.CAMERA).then((status) =\u003e {\n  switch (status) {\n    case RESULTS.UNAVAILABLE:\n      return console.log('This feature is not available (on this device / in this context)');\n    case RESULTS.DENIED:\n      return console.log('The permission has not been requested / is denied but requestable');\n    case RESULTS.BLOCKED:\n      return console.log('The permission is denied and not requestable');\n    case RESULTS.GRANTED:\n      return console.log('The permission is granted');\n    case RESULTS.LIMITED:\n      return console.log('The permission is granted but with limitations');\n  }\n});\n```\n\n#### request\n\nRequest one permission.\n\nThe `rationale` is only available and used on Android. It can be a native alert (a `RationaleObject`) or a custom implementation (that resolves with a `boolean`).\n\n```ts\nfunction request(permission: Permission, rationale?: Rationale): Promise\u003cPermissionStatus\u003e;\n```\n\n```ts\nimport {request, PERMISSIONS} from 'react-native-permissions';\n\nrequest(PERMISSIONS.IOS.CAMERA).then((status) =\u003e {\n  // …\n});\n```\n\n#### checkNotifications\n\nCheck notifications permission status and get notifications settings values.\n\n\u003e [!IMPORTANT]  \n\u003e On Android 13+, the `checkNotifications` function will never return a `blocked` status. You need to call `requestNotifications` to obtain that information.\n\n```ts\nfunction checkNotifications(): Promise\u003cNotificationsResponse\u003e;\n```\n\n```ts\nimport {checkNotifications} from 'react-native-permissions';\n\ncheckNotifications().then(({status, settings}) =\u003e {\n  // …\n});\n```\n\n#### requestNotifications\n\nRequest notifications permission status and get notifications settings values.\n\n- You have to [target at least SDK 33](https://github.com/zoontek/react-native-permissions/releases/tag/3.5.0) to perform a runtime request on Android 13+.\n- You cannot request notifications permissions on Windows. Disabling / enabling them can only be done through the app settings.\n\nThe `rationale` is only available and used on Android. It can be a native alert (a `RationaleObject`) or a custom implementation (that resolves with a `boolean`).\n\n```ts\nfunction requestNotifications(\n  options?: NotificationOption[], // only used by iOS\n  rationale?: Rationale,\n): Promise\u003cNotificationsResponse\u003e;\n```\n\n```ts\nimport {requestNotifications} from 'react-native-permissions';\n\nrequestNotifications(['alert', 'sound']).then(({status, settings}) =\u003e {\n  // …\n});\n```\n\n#### checkMultiple\n\nCheck multiples permissions in parallel.\n\n\u003e [!IMPORTANT]  \n\u003e On Android, the `checkMultiple` function will never return a `blocked` status. You need to call `requestMultiple` to obtain that information.\n\n```ts\nfunction checkMultiple\u003cP extends Permission[]\u003e(\n  permissions: P,\n): Promise\u003cRecord\u003cP[number], PermissionStatus\u003e\u003e;\n```\n\n```ts\nimport {checkMultiple, PERMISSIONS} from 'react-native-permissions';\n\ncheckMultiple([PERMISSIONS.IOS.CAMERA, PERMISSIONS.IOS.FACE_ID]).then((statuses) =\u003e {\n  console.log('Camera', statuses[PERMISSIONS.IOS.CAMERA]);\n  console.log('FaceID', statuses[PERMISSIONS.IOS.FACE_ID]);\n});\n```\n\n#### requestMultiple\n\nRequest multiple permissions in sequence.\n\n```ts\nfunction requestMultiple\u003cP extends Permission[]\u003e(\n  permissions: P,\n): Promise\u003cRecord\u003cP[number], PermissionStatus\u003e\u003e;\n```\n\n```ts\nimport {requestMultiple, PERMISSIONS} from 'react-native-permissions';\n\nrequestMultiple([PERMISSIONS.IOS.CAMERA, PERMISSIONS.IOS.FACE_ID]).then((statuses) =\u003e {\n  console.log('Camera', statuses[PERMISSIONS.IOS.CAMERA]);\n  console.log('FaceID', statuses[PERMISSIONS.IOS.FACE_ID]);\n});\n```\n\n#### openSettings\n\nOpen application / alarms / notifications / fullscreen settings (default to `application`).\n\n\u003e [!NOTE]\n\u003e\n\u003e - `notifications` settings are only available on Android 8+ and iOS 15.4+\n\u003e - `alarms` settings are only available on Android 12+\n\u003e - `fullscreen` settings are only available on Android 14+\n\u003e - If a choice is not available, it fallbacks to `application` settings\n\n```ts\nfunction openSettings(\n  type?: 'application' | 'alarms' | 'fullscreen' | 'notifications',\n): Promise\u003cvoid\u003e;\n```\n\n```ts\nimport {openSettings} from 'react-native-permissions';\n\nopenSettings('application').catch(() =\u003e console.warn('Cannot open app settings'));\n```\n\n#### canScheduleExactAlarms (Android)\n\nCheck if your app can schedule exact alarms.\n\n```ts\nfunction canScheduleExactAlarms(): Promise\u003cboolean\u003e;\n```\n\n```ts\nimport {canScheduleExactAlarms} from 'react-native-permissions';\n\ncanScheduleExactAlarms()\n  .then((value) =\u003e console.log(`Can schedule exact alarms: ${value}`))\n  .catch(() =\u003e console.warn('Cannot check exact alarms scheduling setting'));\n```\n\n#### canUseFullScreenIntent (Android)\n\nCheck if your app can use full screen intent.\n\n```ts\nfunction canUseFullScreenIntent(): Promise\u003cboolean\u003e;\n```\n\n```ts\nimport {canUseFullScreenIntent} from 'react-native-permissions';\n\ncanUseFullScreenIntent()\n  .then((value) =\u003e console.log(`Can use full screen intent: ${value}`))\n  .catch(() =\u003e console.warn('Cannot check full screen intent using setting'));\n```\n\n#### openPhotoPicker (iOS 14+)\n\nOpen a picker to update the photo selection when `PhotoLibrary` permission is `limited`. This will reject if unsupported or if full permission is already `granted`.\n\n```ts\nfunction openPhotoPicker(): Promise\u003cvoid\u003e;\n```\n\n```ts\nimport {openPhotoPicker} from 'react-native-permissions';\n\nopenPhotoPicker().catch(() =\u003e console.warn('Cannot open photo library picker'));\n```\n\n#### checkLocationAccuracy (iOS 14+)\n\nWhen `LocationAlways` or `LocationWhenInUse` is `granted`, allow checking if the user share his precise location.\n\n```ts\nfunction checkLocationAccuracy(): Promise\u003cLocationAccuracy\u003e;\n```\n\n```ts\nimport {checkLocationAccuracy} from 'react-native-permissions';\n\ncheckLocationAccuracy()\n  .then((accuracy) =\u003e console.log(`Location accuracy is: ${accuracy}`))\n  .catch(() =\u003e console.warn('Cannot check location accuracy'));\n```\n\n#### requestLocationAccuracy (iOS 14+)\n\nWhen `LocationAlways` or `LocationWhenInUse` is `granted`, allow requesting the user for his precise location. Will resolve immediately if `full` accuracy is already authorized.\n\n```ts\nfunction requestLocationAccuracy(options: LocationAccuracyOptions): Promise\u003cLocationAccuracy\u003e;\n```\n\n```js\nimport {requestLocationAccuracy} from 'react-native-permissions';\n\nrequestLocationAccuracy({purposeKey: 'YOUR-PURPOSE-KEY'})\n  .then((accuracy) =\u003e console.log(`Location accuracy is: ${accuracy}`))\n  .catch(() =\u003e console.warn('Cannot request location accuracy'));\n```\n\n### About iOS `LOCATION_ALWAYS` permission\n\nOn iOS, background location permission can be requested in two different ways ([Apple Developer Docs 📘](https://developer.apple.com/documentation/corelocation/cllocationmanager/1620551-requestalwaysauthorization#3578736)).\n\n#### Request `LOCATION_ALWAYS` after `LOCATION_WHEN_IN_USE`\n\nIf the user chooses _Allow While Using App_ when calling `request(PERMISSIONS.IOS.LOCATION_WHEN_IN_USE)`, then calling `request(PERMISSIONS.IOS.LOCATION_ALWAYS)` afterward will immediately prompt the user:\n\n\u003cimg width=\"250\" src=\"./docs/location_always_upgrade.png\" alt=\"Location upgrade\"\u003e\n\n| Option                 | `LOCATION_ALWAYS` status | `LOCATION_WHEN_IN_USE` status |\n| ---------------------- | ------------------------ | ----------------------------- |\n| Keep Only While Using  | `RESULTS.BLOCKED`        | `RESULTS.GRANTED`             |\n| Change to Always Allow | `RESULTS.GRANTED`        | `RESULTS.GRANTED`             |\n\n---\n\n#### Request `LOCATION_ALWAYS` directly\n\nThe user is immediately prompted:\n\n\u003cimg width=\"250\" src=\"./docs/location_always_first_prompt.png\" alt=\"Location first prompt\"\u003e\n\n| Option                | `LOCATION_ALWAYS` status | `LOCATION_WHEN_IN_USE` status |\n| --------------------- | ------------------------ | ----------------------------- |\n| Allow Once            | `RESULTS.BLOCKED`        | `RESULTS.GRANTED`             |\n| Allow While Using App | `RESULTS.GRANTED`        | `RESULTS.GRANTED`             |\n| Don’t Allow           | `RESULTS.BLOCKED`        | `RESULTS.BLOCKED`             |\n\nIn this scenario, if the user chooses `Allow While Using App`, they will see `While Using` in the app settings and will later be informed that your app is using their location in background with the option to confirm / change it:\n\n\u003cimg width=\"250\" src=\"./docs/location_always_second_prompt.png\" alt=\"Location second prompt\"\u003e\n\n### Testing with Jest\n\nIf you don't already have a Jest setup file configured, please add the following to your Jest configuration file and create the new `jest.setup.js` file in project root:\n\n```js\nsetupFiles: ['\u003crootDir\u003e/jest.setup.js'];\n```\n\nYou can then add the following line to that setup file to mock the `NativeModule.RNPermissions`:\n\n```js\njest.mock('react-native-permissions', () =\u003e require('react-native-permissions/mock'));\n```\n\n## Sponsors\n\nThis module is provided **as is**, I work on it in my free time.\n\nIf you or your company uses it in a production app, consider sponsoring this project 💰. You also can contact me for **premium** enterprise support: help with issues, prioritize bugfixes, feature requests, etc.\n\n\u003ca href=\"https://github.com/sponsors/zoontek\"\u003e\u003cimg align=\"center\" alt=\"Sponsors list\" src=\"https://raw.githubusercontent.com/zoontek/sponsors/main/sponsorkit/sponsors.svg\"\u003e\u003c/a\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzoontek%2Freact-native-permissions","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzoontek%2Freact-native-permissions","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzoontek%2Freact-native-permissions/lists"}