React Native中使用Firebase Messaging能否撤销推送通知权限?
@react-native-firebase/messaging 推送权限撤销方案
iOS 和 Android 系统出于安全限制,都不允许第三方应用直接修改已授予的通知权限状态,没有对应的系统API可以实现应用内一键撤销权限,你可以选择以下两种符合平台规范的实现方式:
方案1:引导用户到系统设置页关闭权限(真正修改系统权限状态)
该方案会真实修改系统层面的通知权限开关,关闭后用户在系统设置中也能看到通知权限处于未授权状态,实现代码如下:
import { Linking, Platform } from 'react-native'; import messaging from '@react-native-firebase/messaging'; // 开关关闭时触发该方法 const revokeNotificationPermission = async () => { // 先删除FCM token,避免权限关闭前还有推送下发 await messaging().deleteToken(); // 跳转到应用系统设置页 if (Platform.OS === 'ios') { Linking.openURL('app-settings:'); } else { Linking.openSettings(); } }
后续你可以通过messaging().hasPermission()判断权限状态,返回false即代表用户已经关闭通知权限。
方案2:应用内无感知关闭推送(效果等同于撤销权限)
如果你不需要修改系统层面的权限状态,仅要实现开关关闭后设备完全不接收推送,可以采用删除FCM token+本地拦截的方案,这是目前绝大多数应用采用的实现方式:
- 开关关闭时删除本地和Firebase云端存储的FCM token,Firebase就不会再向该设备下发任何推送
- 本地存储开关状态,即便有特殊情况收到推送,也可以在前台回调中直接拦截不展示
- 开关重新开启时,重新申请权限、获取新token上传到业务服务端即可
实现代码示例:
import AsyncStorage from '@react-native-async-storage/async-storage'; import messaging from '@react-native-firebase/messaging'; const togglePushNotification = async (isEnable) => { if (isEnable) { // 开启推送流程 const authStatus = await messaging().requestPermission(); const isAuthorized = authStatus === messaging.AuthorizationStatus.AUTHORIZED || authStatus === messaging.AuthorizationStatus.PROVISIONAL; if (isAuthorized) { const fcmToken = await messaging().getToken(); // 上传token到你的业务服务端存储 await fetch('/your-api/save-fcm-token', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token: fcmToken }) }); await AsyncStorage.setItem('push_notification_enabled', '1'); } } else { // 关闭推送流程 await messaging().deleteToken(); // 调用业务服务端接口删除对应token await fetch('/your-api/delete-fcm-token', { method: 'POST' }); await AsyncStorage.setItem('push_notification_enabled', '0'); } }
内容的提问来源于stack exchange,提问作者Lucas Goldner
相关产品推荐
相关产品推荐

