news 2026/4/29 7:36:18

RN中如何处理推送通知(本地推送、远程推送),点击推送跳转指定页面?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RN中如何处理推送通知(本地推送、远程推送),点击推送跳转指定页面?

在 React Native(RN)中处理推送通知,一般分为三块:

1️⃣ 本地推送(Local Notification)
2️⃣ 远程推送(Push Notification / FCM / APNs)
3️⃣ 点击通知跳转页面(Deep Link / Navigation)

我给你按“工程实战”的方式讲,直接能落地。


一、常用方案选型

目前主流有两套:

✅ 方案1(推荐)

  • Firebase(FCM 推送)

  • react-native-firebase

  • Notifee(处理本地通知 + 点击事件)

👉 优点:稳定、功能全、可控性强(企业项目首选)


方案2(简单但旧)

  • react-native-push-notification

👉 不太推荐(维护一般)


二、基础架构(你要理解)

推送流程:

服务端 -> FCM/APNs -> 手机 -> RN App -> 展示通知 -> 用户点击 -> 跳转页面

关键点:

  • 后台推送数据(data payload)

  • App 收到后展示通知

  • 点击通知时解析数据并导航


三、安装依赖(推荐方案)

yarn add @react-native-firebase/app yarn add @react-native-firebase/messaging yarn add @notifee/react-native

四、远程推送(FCM)

1️⃣ 请求权限

import messaging from '@react-native-firebase/messaging'; async function requestPermission() { const authStatus = await messaging().requestPermission(); const enabled = authStatus === messaging.AuthorizationStatus.AUTHORIZED || authStatus === messaging.AuthorizationStatus.PROVISIONAL; if (enabled) { console.log('授权成功'); } }

2️⃣ 获取 token(发给后端)

const token = await messaging().getToken(); console.log('FCM Token:', token);

3️⃣ 前台接收消息

messaging().onMessage(async remoteMessage => { console.log('前台收到消息:', remoteMessage); // 用 Notifee 展示本地通知 });

4️⃣ 后台/关闭状态处理

messaging().setBackgroundMessageHandler(async remoteMessage => { console.log('后台消息:', remoteMessage); });

五、本地通知(Notifee)

1️⃣ 创建通知

import notifee from '@notifee/react-native'; async function displayNotification(data) { await notifee.displayNotification({ title: data.title, body: data.body, android: { channelId: 'default', }, data: data, // 关键:携带跳转参数 }); }

2️⃣ 创建 channel(Android 必须)

await notifee.createChannel({ id: 'default', name: 'Default Channel', });

六、点击通知跳转页面(重点)

这是你最关心的 👇

核心思路

👉 推送数据里带上跳转信息

例如服务端 payload:

{ "data": { "type": "order", "orderId": "123" } }

1️⃣ App 已打开(前台点击)

notifee.onForegroundEvent(({ type, detail }) => { if (type === EventType.PRESS) { const data = detail.notification?.data; handleNavigation(data); } });

2️⃣ App 在后台(点击通知)

notifee.onBackgroundEvent(async ({ type, detail }) => { if (type === EventType.PRESS) { const data = detail.notification?.data; handleNavigation(data); } });

3️⃣ App 被杀死(冷启动)

const initialNotification = await notifee.getInitialNotification(); if (initialNotification) { const data = initialNotification.notification?.data; handleNavigation(data); }

七、封装跳转逻辑(React Navigation)

import { navigationRef } from './navigationRef'; function handleNavigation(data) { if (!data) return; switch (data.type) { case 'order': navigationRef.navigate('OrderDetail', { id: data.orderId, }); break; case 'message': navigationRef.navigate('MessagePage'); break; } }

八、navigationRef(关键)

因为推送是在“组件外触发”的:

import { createNavigationContainerRef } from '@react-navigation/native'; export const navigationRef = createNavigationContainerRef();
<NavigationContainer ref={navigationRef}> {/* routes */} </NavigationContainer>

九、完整流程总结

  1. App 启动 → 请求权限

  2. 获取 FCM token → 给后端

  3. 后端发送 push(带 data)

  4. App 收到 → 用 Notifee 展示

  5. 用户点击 → 解析 data

  6. navigationRef 跳转页面


十、常见坑(很重要)

⚠️ iOS 不显示通知
→ 没开权限 / 没配置 APNs

⚠️ Android 收不到
→ channel 没创建

⚠️ 点击没跳转
→ data 没传 or 没监听

⚠️ 冷启动跳转失败
→ 没用getInitialNotification


十一、进阶建议(你这个级别可以做)

你有前端 7 年经验,可以直接做一层封装:

👉 NotificationService

  • 统一处理:

    • 权限

    • token

    • 收消息

    • 跳转

👉 Router Map:

const ROUTE_MAP = { order: 'OrderDetail', message: 'MessagePage', };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 6:22:48

AlienFX Tools:让Alienware设备重获新生的轻量级控制方案

AlienFX Tools&#xff1a;让Alienware设备重获新生的轻量级控制方案 【免费下载链接】alienfx-tools Alienware systems lights, fans, and power control tools and apps 项目地址: https://gitcode.com/gh_mirrors/al/alienfx-tools 还在为Alienware Command Center&…

作者头像 李华
网站建设 2026/4/14 23:36:26

千分尺 | 操作规范及实操读数

注&#xff1a;本文为 “千分尺 | 操作” 相关合辑。 图片清晰度受引文原图所限。 略作重排&#xff0c;未整理去重。 如有内容异常&#xff0c;请看原文。 千分尺操作规范 阑珊笔 质量和管理方法指南 2026 年 3 月 14 日 09:01 宁夏 一、目的 为规范千分尺的操作流程&#…

作者头像 李华
网站建设 2026/4/16 21:22:21

如何无线地将照片从 iPhone 传输到 PC?

我们经常在 iPhone 上存储大量照片&#xff0c;将它们传输到电脑是备份照片并释放 iPhone 空间的好方法。通常&#xff0c;你会使用 USB 数据线将 iPhone 连接到电脑进行传输。但是&#xff0c;如果你没有 USB 数据线&#xff0c;或者你的电脑无法识别你的 iPhone&#xff0c;该…

作者头像 李华
网站建设 2026/4/17 2:19:22

Python Tkinter如何实现组件隐藏与显示_利用pack_forget管理布局

pack_forget() 并未销毁组件&#xff0c;仅临时移除布局&#xff1b;组件对象、事件绑定和属性均保持有效&#xff0c;与 destroy() 的不可逆性有本质区别。pack_forget 后组件真的“消失”了吗&#xff1f;不是销毁&#xff0c;只是从布局管理器中临时移除&#xff1b;组件对象…

作者头像 李华
网站建设 2026/4/16 7:37:04

数字孪生赋能智慧校园:三维可视化运维检测平台的创新实践

1. 数字孪生如何重塑智慧校园管理 第一次看到浙江工商大学的数字孪生校园平台时&#xff0c;我完全被震撼到了——整个校园的每栋建筑、每条道路甚至每棵树都以三维形式精确还原在屏幕上&#xff0c;实时数据像血液一样在虚拟校园中流动。这种技术正在彻底改变传统校园管理模式…

作者头像 李华