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_IMAGESREAD_MEDIA_VIDEOREAD_MEDIA_AUDIO
👉 用旧的 READ_EXTERNAL_STORAGE 会失效
五、总结(给你一个明确建议)
👉 90% 场景建议:
- 用 👉
react-native-permissions