React Native 0.70/0.71 PermissionsAndroid权限差异及崩溃问题
问题解答
1. 权限常量名称变化并非笔误
文档里的权限名称差异是正常的版本适配:
- Android 12及以下(API <33)的通知权限为
android.permission.POST_NOTIFICATION,React Native 0.70版本文档对应这个旧权限名 - Android 13(API 33)将通知权限重命名为
android.permission.POST_NOTIFICATIONS,React Native 0.71及以上版本文档适配了这个新权限名
2. 崩溃原因:RN 0.70.5未内置该权限常量
你使用的React Native 0.70.5版本中,PermissionsAndroid.PERMISSIONS里不存在POST_NOTIFICATION或POST_NOTIFICATIONS这两个常量,直接调用会得到undefined,传递给PermissionsAndroid.request后就触发了permission is null的异常。
3. 解决方案
方案一:直接使用权限字符串替代常量
既然已设置compileSdkVersion=33和targetSdkVersion=33,直接传入完整权限字符串即可:
async requestPermission() { try { const granted = await PermissionsAndroid.request( 'android.permission.POST_NOTIFICATIONS', // 直接使用权限字符串 { title: 'TEST', message: I18n.t('permissions.locationPermissionMessage') } ) if (granted === PermissionsAndroid.RESULTS.GRANTED) { // 权限已授予后的逻辑 } else { // 权限被拒绝后的逻辑 } } catch (err) { console.error(err); } }
方案二:添加Android版本判断(兼容旧系统)
如果需要兼容Android 12及以下设备,注意这类系统无需主动请求通知权限,仅在Android 13+时发起请求:
import { Platform } from 'react-native'; async requestPermission() { if (Platform.OS === 'android' && Platform.Version >= 33) { try { const granted = await PermissionsAndroid.request( 'android.permission.POST_NOTIFICATIONS', { title: 'TEST', message: I18n.t('permissions.locationPermissionMessage') } ) if (granted === PermissionsAndroid.RESULTS.GRANTED) { // 权限已授予后的逻辑 } else { // 权限被拒绝后的逻辑 } } catch (err) { console.error(err); } } }
方案三:升级RN版本到0.71+
若愿意升级React Native到0.71及以上版本,就可以直接使用内置的PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS常量,无需手动编写权限字符串。
内容的提问来源于stack exchange,提问作者Ted
相关产品推荐
相关产品推荐

