
Expo 通知功能实战3 个环节跑通你的第一条推送通知【免费下载链接】expoAn open-source framework for making universal native apps with React. Expo runs on Android, iOS, and the web.项目地址: https://gitcode.com/GitHub_Trending/ex/expo写过通知代码却收不到推送权限弹窗被拒、令牌拿到手是 undefined、应用划走之后消息石沉大海——这些是刚接触推送时最容易栽进去的坑。Expo 通知功能expo-notifications 模块把 Android 和 iOS 的推送差异封装成一套 JS 接口你只管请求权限、拿到 Expo 推送令牌可以理解成这台设备的收件地址、调 Expo Push API 发消息前台怎么展示则交给一段你自己写的策略代码。能力速览它能帮你干什么把消息精准送到某台设备用推送令牌 Expo Push API用户把应用划走后消息照样送达系统负责弹出横幅。前台行为完全由你定夺应用开着时收到推送是弹系统横幅、静默写日志还是只刷新你自己的界面都靠setNotificationHandler一句话拍板。接住用户的点击用户点通知、点按钮都会触发响应监听器你拿到的data字段可以直接用来做深度链接跳转。本地定时通知也能顺手做不经过服务器应用内就能创建一次性或周期性的本地通知。动手接入从装包到收到第一条推送前置装两个包并确认你是用 Development Buildnpx expo install expo-notifications expo-constantsexpo-notifications是核心模块expo-constants用来读取项目里的projectId。这里有个容易忽略的前提Expo Go 里用不了推送必须走 EAS 构建出 Development Buildeas build然后在真机上测。Android 带 Google Play 服务的模拟器也可以iOS 用 Xcode 14 的模拟器。关键配置app.json 里加一行插件{ expo: { plugins: [expo-notifications] } }这一行让 config-plugins 在生成原生工程时自动配好默认通知图标等原生细节省得你去改 AndroidManifest 或 iOS 工程文件。请求权限拿到 Expo 推送令牌先查、再申请别上来就弹系统权限框用户之前可能已经给过重复弹窗很减好感const { status } await Notifications.getPermissionsAsync(); const finalStatus status granted ? status : (await Notifications.requestPermissionsAsync()).status; const projectId Constants.expoConfig?.extra?.eas?.projectId; const token (await Notifications.getExpoPushTokenAsync({ projectId })).data;权限没拿到就早退并提示用户去系统设置里开projectId缺失时getExpoPushTokenAsync会直接报错这是令牌为 undefined最常见的原因。发出第一条推送拿到令牌后一条 POST 请求就够了await fetch(https://exp.host/--/api/v2/push/send, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ to: token, title: Hello Expo, body: 这是你的第一条推送, data: { screen: home }, }), });不想手搓请求的话官方通知工具页面expo.dev 的 Notifications 页可以粘贴令牌直接发测试推送适合第一遍联调。机制拆解一条推送在三种状态下的走向推送到了设备之后谁来接管取决于应用当时在不在前台服务器 → Expo Push API → 设备系统 ├─ 前台JS 监听器 你的 handler 决定展示与否 └─ 后台/已杀系统横幅 → 用户点击 → 响应监听器前台应用是主人推送先进你的 JS。setNotificationHandler里四个返回值shouldShowBanner/shouldPlaySound/shouldSetBadge/shouldShowList控制横幅、声音、角标和是否进通知列表。想让前台只静默更新数据把shouldShowBanner设成false即可。后台系统直接弹横幅你的代码不参与展示用户点击后addNotificationResponseReceivedListener被触发response.notification.request.content.data就是发送时塞进去的data。已杀用户手动清掉应用iOS 上点通知会冷启动应用。稳妥做法是在模块顶层就注册响应监听器启动时再补查一次getLastNotificationResponse别只依赖监听器否则冷启动的第一次点击可能拿不到。避坑与调优群里最常问的 3 个问题Q推送明明发了手机毫无反应先别怀疑代码。九成是构建方式问题Expo Go 里没有推送能力必须 Development Build再查 EAS 里该项目的推送凭据iOS 的 APNs、Android 的 FCM是否配全。两者都确认过再用通知工具重发一次设备端日志里能看到接收过程。QAndroid 上通知能弹但没声音、没震动Android 8.0 的通知挂在渠道上默认渠道的重要性偏低。启动时用setNotificationChannelAsync显式建一个渠道importance给到AndroidImportance.MAX并设置振动模式声音震动就都正常了。Q权限被拒之后应用里再也拿不到令牌被拒不等于永久失败。先getPermissionsAsync判断状态只有denied才弹申请如果弹完还是拒引导用户去系统设置手动开启而不是反复弹框。下一步试着把本地定时通知scheduleNotificationAsync也接上推送 本地两种能力就齐了。细节可以翻 推送通知配置文档遇到怪问题先看 官方 FAQ。【免费下载链接】expoAn open-source framework for making universal native apps with React. Expo runs on Android, iOS, and the web.项目地址: https://gitcode.com/GitHub_Trending/ex/expo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考