Mathieu Acthernoene f3d950098d Improve request type doc 5 anni fa
.github Run new prettier config over the codebase 5 anni fa
android Commit new native modules 5 anni fa
example Install RNPermissions/Core 5 anni fa
ios Move podspec file to the project root 5 anni fa
.editorconfig Add .editorconfig 5 anni fa
.flowconfig Commit new native modules 5 anni fa
.gitignore Commit new native modules 5 anni fa
.npmignore Update example to 0.50 7 anni fa
.prettierignore Update project dependencies 5 anni fa
.prettierrc Update project dependencies 5 anni fa
LICENSE first commit 8 anni fa
README.md Improve request type doc 5 anni fa
RNPermissions.podspec Move podspec file to the project root 5 anni fa
index.js Improve exposed methods typings 5 anni fa
package.json Commit new native modules 5 anni fa
yarn.lock Commit new native modules 5 anni fa

README.md

☝🏼 React Native Permissions

npm version npm Platform - Android and iOS MIT styled with prettier

Request user permissions on iOS and Android.

⚠️  Branch WIP 2.0.0 : Go to pull request #291 for feedbacks.

Support

version react-native version
2.0.0+ 0.56.0+
1.1.1 0.40.0 - 0.52.2

Setup

$ npm install --save react-native-permissions
# --- or ---
$ yarn add react-native-permissions

iOS specific

To allow installation of the needed permission handlers for your project (and only them), react-native-permissions uses CocoaPods. Update the following line with your path to node_modules/ and add it to your podfile:

target 'YourAwesomeProject' do

  # …

  pod 'RNPermissions', :path => '../node_modules/react-native-permissions', :subspecs => [
    'Core',
    ## Uncomment needed permissions
    # 'BluetoothPeripheral',
    # 'Calendars',
    # 'Camera',
    # 'Contacts',
    # 'FaceID',
    # 'LocationAlways',
    # 'LocationWhenInUse',
    # 'MediaLibrary',
    # 'Microphone',
    # 'Motion',
    # 'Notifications',
    # 'PhotoLibrary',
    # 'Reminders',
    # 'Siri',
    # 'SpeechRecognition',
    # 'StoreKit',
  ]

end

Android specific

  1. Add the following lines to android/settings.gradle:
include ':react-native-permissions'
project(':react-native-permissions').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-permissions/android')
  1. Add the compile line to the dependencies in android/app/build.gradle:
dependencies {
  // ...
  implementation project(':react-native-permissions')
}
  1. Add the import and link the package in MainApplication.java:
import com.yonahforst.rnpermissions.RNPermissionsPackage; // <-- Add the import

public class MainApplication extends Application implements ReactApplication {

  // …

  @Override
  protected List<ReactPackage> getPackages() {
    return Arrays.<ReactPackage>asList(
      new MainReactPackage(),
      // …
      new RNPermissionsPackage() // <-- Add it to the packages list
    );
  }

  // …
}

📌 Don’t forget to add permissions to AndroidManifest.xml for android and Info.plist for iOS (Xcode >= 8).

API (subject to changes)

Permissions statuses

Promises resolve into one of these statuses:

Return value Notes
RESULTS.UNAVAILABLE This feature is not available on this device.
RESULTS.GRANTED The permission is granted.
RESULTS.DENIED The permission has not been requested / is denied but requestable.
RESULTS.NEVER_ASK_AGAIN The permission is not requestable anymore.

Supported permissions

import { ANDROID_PERMISSIONS, IOS_PERMISSIONS } from "react-native-permissions";

// For Android

// same as PermissionsAndroid
ANDROID_PERMISSIONS.READ_CALENDAR;
ANDROID_PERMISSIONS.WRITE_CALENDAR;
ANDROID_PERMISSIONS.CAMERA;
ANDROID_PERMISSIONS.READ_CONTACTS;
ANDROID_PERMISSIONS.WRITE_CONTACTS;
ANDROID_PERMISSIONS.GET_ACCOUNTS;
ANDROID_PERMISSIONS.ACCESS_FINE_LOCATION;
ANDROID_PERMISSIONS.ACCESS_COARSE_LOCATION;
ANDROID_PERMISSIONS.RECORD_AUDIO;
ANDROID_PERMISSIONS.READ_PHONE_STATE;
ANDROID_PERMISSIONS.CALL_PHONE;
ANDROID_PERMISSIONS.READ_CALL_LOG;
ANDROID_PERMISSIONS.WRITE_CALL_LOG;
ANDROID_PERMISSIONS.ADD_VOICEMAIL;
ANDROID_PERMISSIONS.USE_SIP;
ANDROID_PERMISSIONS.PROCESS_OUTGOING_CALLS;
ANDROID_PERMISSIONS.BODY_SENSORS;
ANDROID_PERMISSIONS.SEND_SMS;
ANDROID_PERMISSIONS.RECEIVE_SMS;
ANDROID_PERMISSIONS.READ_SMS;
ANDROID_PERMISSIONS.RECEIVE_WAP_PUSH;
ANDROID_PERMISSIONS.RECEIVE_MMS;
ANDROID_PERMISSIONS.READ_EXTERNAL_STORAGE;
ANDROID_PERMISSIONS.WRITE_EXTERNAL_STORAGE;

// new ones
ANDROID_PERMISSIONS.ANSWER_PHONE_CALLS;
ANDROID_PERMISSIONS.ACCEPT_HANDOVER;
ANDROID_PERMISSIONS.READ_PHONE_NUMBERS;

// For iOS

IOS_PERMISSIONS.BLUETOOTH_PERIPHERAL;
IOS_PERMISSIONS.CALENDARS;
IOS_PERMISSIONS.CAMERA;
IOS_PERMISSIONS.CONTACTS;
IOS_PERMISSIONS.FACE_ID;
IOS_PERMISSIONS.LOCATION_ALWAYS;
IOS_PERMISSIONS.LOCATION_WHEN_IN_USE;
IOS_PERMISSIONS.MEDIA_LIBRARY;
IOS_PERMISSIONS.MICROPHONE;
IOS_PERMISSIONS.MOTION;
IOS_PERMISSIONS.NOTIFICATIONS;
IOS_PERMISSIONS.PHOTO_LIBRARY;
IOS_PERMISSIONS.REMINDERS;
IOS_PERMISSIONS.SIRI;
IOS_PERMISSIONS.SPEECH_RECOGNITION;
IOS_PERMISSIONS.STOREKIT;

Methods

types used in usage examples

type Permission = keyof ANDROID_PERMISSIONS | keyof IOS_PERMISSIONS;

type PermissionStatus =
  | "granted"
  | "denied"
  | "never_ask_again"
  | "unavailable";

check()

Check one permission status.

Method type

function check(permission: Permission): Promise<PermissionStatus>;

Usage example

import { check, IOS_PERMISSIONS, RESULTS } from "react-native-permissions";

check(RNPermissions.IOS_PERMISSIONS.LOCATION_ALWAYS).then(result => {
  switch (result) {
    case RESULTS.UNAVAILABLE:
      console.log("the feature is not available on this device");
      break;
    case RESULTS.GRANTED:
      console.log("permission is granted");
      break;
    case RESULTS.DENIED:
      console.log("permission is denied, but requestable");
      break;
    case RESULTS.NEVER_ASK_AGAIN:
      console.log("permission is denied and not requestable");
      break;
  }
});

checkMultiple()

Check multiples permissions.

Method type

function checkMultiple<P: Permission>(permissions: P[]): Promise<{ [permission: P]: PermissionStatus }>;

Usage example

import { checkMultiple, IOS_PERMISSIONS } from "react-native-permissions";

checkMultiple([
  IOS_PERMISSIONS.LOCATION_ALWAYS,
  IOS_PERMISSIONS.MEDIA_LIBRARY,
]).then(results => {
  // results.LOCATION_ALWAYS
  // results.MEDIA_LIBRARY
});

request()

Request one permission.

Method type

type NotificationOption =
  | "badge"
  | "sound"
  | "alert"
  | "carPlay"
  | "criticalAlert"
  | "provisional";

type Rationale = {
  title: string;
  message: string;
  buttonPositive: string;
  buttonNegative?: string;
  buttonNeutral?: string;
};

function request(
  permission: string,
  config: {
    notificationOptions?: NotificationOption[];
    rationale?: Rationale;
  } = {},
): Promise<PermissionStatus>;

Usage example

import { request, IOS_PERMISSIONS } from "react-native-permissions";

request(IOS_PERMISSIONS.LOCATION_ALWAYS).then(result => {
  // …
});

requestMultiple()

Request multiples permissions.

Method type

function requestMultiple<P: Permission>(permissions: P[]): Promise<{ [permission: P]: PermissionStatus }>;

Usage example

import { requestMultiple, IOS_PERMISSIONS } from "react-native-permissions";

requestMultiple([
  IOS_PERMISSIONS.LOCATION_ALWAYS,
  IOS_PERMISSIONS.MEDIA_LIBRARY,
]).then(results => {
  // results.LOCATION_ALWAYS
  // results.MEDIA_LIBRARY
});

openSettings()

Open application settings.

Method type

function openSettings(): Promise<boolean>;

Usage example

import { openSettings } from "react-native-permissions";

openSettings().catch(() => console.warn("cannot open settings");

🍎  iOS Notes

  • Permission type BLUETOOTH_PERIPHERAL represents the status of the CBPeripheralManager.
  • If notificationOptions config array is omitted on NOTIFICATIONS request, it will request alert, badge and sound.