Expo应用请求通知权限时触发异常问题求助
解决Expo通知权限请求报错:String resource ID #0xffffffff
你遇到的错误是Android端Expo通知模块的资源引用异常,通常和SDK版本、缓存或资源配置有关。先看你的原代码:
if (isDevice) { const { status: existingStatus } = await Notifications.getPermissionsAsync(); let finalStatus = existingStatus; if (existingStatus !== "granted") { const { status } = await Notifications.requestPermissionsAsync(); finalStatus = status; } if (finalStatus !== "granted") { Alert.alert("Falha ao obter permissão para notificações push!", "É necessário permitir o envio de notificações push para o aplicativo funcionar corretamente."); return ""; } token = (await Notifications.getExpoPushTokenAsync()).data; } else { alert("Para gerar o token de notificação você precisa estar em um dispositivo físico!"); }
排查和解决步骤:
- 升级Expo SDK到稳定版:旧版本的
ExpoNotificationPermissionsModule存在资源引用bug,执行expo upgrade将SDK及依赖更新到最新兼容版本。 - 清除项目缓存:缓存损坏会导致资源加载异常,运行
expo r -c清除缓存后重启项目。 - 显式指定权限配置:调用
requestPermissionsAsync时传入具体的权限参数,避免模块默认资源引用出错,修改后的调用如下:const { status } = await Notifications.requestPermissionsAsync({ ios: { allowAlert: true, allowBadge: true, allowSound: true, }, android: { allowAlert: true, allowBadge: true, allowSound: true, allowVibrate: true, }, }); - 确认Android权限声明:检查
app.json中的Android配置,确保包含通知权限:"android": { "permissions": ["POST_NOTIFICATIONS"] }
修正后的完整代码:
if (isDevice) { const { status: existingStatus } = await Notifications.getPermissionsAsync(); let finalStatus = existingStatus; if (existingStatus !== "granted") { // 显式指定权限配置 const { status } = await Notifications.requestPermissionsAsync({ ios: { allowAlert: true, allowBadge: true, allowSound: true, }, android: { allowAlert: true, allowBadge: true, allowSound: true, allowVibrate: true, }, }); finalStatus = status; } if (finalStatus !== "granted") { Alert.alert("Falha ao obter permissão para notificações push!", "É necessário permitir o envio de notificações push para o aplicativo funcionar corretamente."); return ""; } token = (await Notifications.getExpoPushTokenAsync()).data; } else { alert("Para gerar o token de notificação você precisa estar em um dispositivo físico!"); }
内容的提问来源于stack exchange,提问作者Lucas Gardini Dias
相关产品推荐
相关产品推荐

