React Native 做相机、定位、相册、推送权限管理推荐不要自己封装 Native 权限而是统一使用react-native-permissions它统一封装 iOS / Android 权限申请、检查、跳转设置等流程。(NPM)整体流程用户操作 ↓ 业务功能触发 ↓ check权限 ↓ 未授权 → request权限 ↓ granted → 执行业务 denied → 提示原因 blocked → 引导打开系统设置1. 安装npm install react-native-permissions cd ios pod install(NPM)一、相机权限 CameraAndroidandroid/app/src/main/AndroidManifest.xmluses-permission android:nameandroid.permission.CAMERA/iOSInfo.plistkeyNSCameraUsageDescription/key string需要使用相机拍摄照片/stringRN代码import { check, request, PERMISSIONS, RESULTS } from react-native-permissions; async function requestCamera(){ const result await request( PERMISSIONS.IOS.CAMERA ); if(result RESULTS.GRANTED){ console.log(可以使用相机); } if(result RESULTS.BLOCKED){ console.log(去设置开启); } }Android:request( PERMISSIONS.ANDROID.CAMERA )二、定位权限 LocationAndroidManifest:uses-permission android:nameandroid.permission.ACCESS_FINE_LOCATION/ uses-permission android:nameandroid.permission.ACCESS_COARSE_LOCATION/iOSInfo.plist:keyNSLocationWhenInUseUsageDescription/key string用于获取当前位置/string如果后台定位keyNSLocationAlwaysUsageDescription/key string后台需要持续定位/string代码import {PERMISSIONS} from react-native-permissions; async function requestLocation(){ const res await request( PERMISSIONS.IOS.LOCATION_WHEN_IN_USE ) if(res RESULTS.GRANTED){ console.log(定位成功) } }Android:request( PERMISSIONS.ANDROID.ACCESS_FINE_LOCATION )三、相册权限 Photo LibraryAndroid 13需要uses-permission android:nameandroid.permission.READ_MEDIA_IMAGES/Android 12:uses-permission android:nameandroid.permission.READ_EXTERNAL_STORAGE/iOSInfo.plist:keyNSPhotoLibraryUsageDescription/key string用于选择图片/string代码request( PERMISSIONS.IOS.PHOTO_LIBRARY )Android:request( PERMISSIONS.ANDROID.READ_MEDIA_IMAGES )四、推送权限 Notification推送比较特殊。需要系统通知权限APNs / FCM 注册推送 Token推荐react-native-firebase/messagingiOS请求通知import { requestNotifications } from react-native-permissions; async function notificationPermission(){ const result await requestNotifications([ alert, sound, badge ]); console.log(result.status) }(NPM)Android 13Manifest:uses-permission android:nameandroid.permission.POST_NOTIFICATIONS/请求request( PERMISSIONS.ANDROID.POST_NOTIFICATIONS )五、统一权限管理封装实际项目一般这样写src └── permissions ├── camera.js ├── location.js ├── photo.js └── notification.js例如permission.jsimport { request, RESULTS } from react-native-permissions; export async function checkPermission(permission){ const result await request(permission); switch(result){ case RESULTS.GRANTED: return true; case RESULTS.BLOCKED: //打开设置 return false; default: return false; } }业务调用const ok await checkPermission( PERMISSIONS.IOS.CAMERA ) if(ok){ openCamera() }六、推荐权限申请时机不要 App 启动一次申请全部❌打开APP 请求: 相机 定位 相册 通知 用户疯狂点拒绝体验很差。推荐相机用户点击扫一扫 拍照上传再请求。定位进入地图页面附近的人 附近商家 导航请求。相册点击上传图片请求。通知登录完成 / 引导页开启通知及时收到消息请求。七、生产级权限状态处理建议封装状态处理GRANTED直接使用DENIED再次requestBLOCKED弹窗引导系统设置LIMITED(iOS)提示用户选择更多权限UNAVAILABLE设备不支持react-native-permissions本身提供这些状态。(NPM)八、常见 RN APP 权限架构类似微信App启动 | |-- 初始化SDK | |-- 登录 | |-- 用户进入功能 | -- 扫一扫 | | | Camera Permission | -- 发朋友圈 | | | Photo Permission | -- 附近 | | | Location Permission | -- 消息提醒 | Notification Permission这样通过率和用户体验最好。如果是 RN 新架构Fabric TurboModule项目权限层建议独立成 Native Module Service不要散落在页面组件里。