普通视图

发现新文章,点击刷新页面。
今天 — 2026年4月11日首页

RN中如何处理权限申请(相机、相册、定位、存储)?使用第三方库还是原生封装?

作者 光影少年
2026年4月11日 12:02

在 React Native(RN)里处理权限申请,本质上有两条路:

一、推荐方案:使用第三方库(更省心 ✅)

最主流的是 👉 react-native-permissions

为什么推荐它?

  • 一套 API 统一处理 iOS + Android
  • 覆盖:相机 / 相册 / 定位 / 麦克风 / 通讯录等
  • 自动处理不同系统版本差异(特别是 Android 10+、13+)

安装

yarn add react-native-permissions

iOS 还需要:

cd ios && pod install

基本用法(以相机为例)

import {request, PERMISSIONS, RESULTS} from 'react-native-permissions';
import {Platform} from 'react-native';

export async function requestCameraPermission() {
  const permission =
    Platform.OS === 'ios'
      ? PERMISSIONS.IOS.CAMERA
      : PERMISSIONS.ANDROID.CAMERA;

  const result = await request(permission);

  switch (result) {
    case RESULTS.GRANTED:
      console.log('已授权');
      break;
    case RESULTS.DENIED:
      console.log('用户拒绝');
      break;
    case RESULTS.BLOCKED:
      console.log('被永久拒绝,需要引导去设置页');
      break;
  }
}

常见权限对应表

功能 iOS Android
相机 CAMERA CAMERA
相册 PHOTO_LIBRARY READ_MEDIA_IMAGES(Android 13+)
定位 LOCATION_WHEN_IN_USE ACCESS_FINE_LOCATION
存储 自动 READ/WRITE_EXTERNAL_STORAGE(已逐步废弃)

跳转系统设置页(很重要)

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

openSettings();

二、官方原生 API(不推荐做主方案 ❌)

RN 自带:

👉 PermissionsAndroid(仅 Android)

import {PermissionsAndroid} from 'react-native';

await PermissionsAndroid.request(
  PermissionsAndroid.PERMISSIONS.CAMERA
);

问题:

  • ❌ iOS 不支持(需要自己写 Native)
  • ❌ Android 版本适配麻烦(13+权限拆分)
  • ❌ 代码分散,难维护

三、什么时候用“原生封装”?🤔

只有这些情况才建议:

✅ 场景

  • 需要深度定制(比如蓝牙、后台定位)
  • 使用原生 SDK(高德 / 百度定位)
  • 公司有统一权限中间层

❌ 不建议

  • 普通业务(拍照、选图、定位)
  • 中小项目

四、最佳实践(很关键🔥)

1️⃣ 封装统一权限工具

// permission.ts
export async function requestPermission(type: 'camera' | 'photo' | 'location') {
  // 内部统一处理
}

👉 避免业务代码到处写权限逻辑


2️⃣ 权限申请时机

不要一进 App 就申请 ❌
👉 要“用到时再申请” ✅

例如:

  • 点击“拍照” → 再申请相机权限
  • 点击“上传头像” → 再申请相册

3️⃣ 权限被拒绝的处理

if (result === RESULTS.BLOCKED) {
  Alert.alert(
    '需要权限',
    '请前往设置开启权限',
    [
      {text: '取消'},
      {text: '去设置', onPress: openSettings}
    ]
  );
}

4️⃣ Android 13+ 注意点 ⚠️

存储权限拆分为:

  • READ_MEDIA_IMAGES
  • READ_MEDIA_VIDEO
  • READ_MEDIA_AUDIO

👉 用旧的 READ_EXTERNAL_STORAGE 会失效


五、总结(给你一个明确建议)

👉 90% 场景建议:

  • 用 👉 react-native-permissions
❌
❌