使用 FCM 旧版服务器发送通知
编辑页面
了解如何使用 FCM 旧版服务器发送通知。
For the complete documentation index, see llms.txt. Use this file to discover all available pages.
此页面已存档。请参阅 推送通知指南 获取最新信息。
关于使用较新的 FCMv1 服务进行通信的文档,请参阅 使用 FCMv1 和 APNs 发送通知。本指南基于 Google 的文档,本节介绍帮助你入门的基础内容。
与 FCM 通信是通过发送 POST 请求完成的。不过,在发送或接收任何通知之前,你需要先按照配置 FCM中的步骤来配置 FCM,并获取你的 FCM-SERVER-KEY。
await fetch('https://fcm.googleapis.com/fcm/send', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `key=<FCM-SERVER-KEY>`, }, body: JSON.stringify({ to: '<NATIVE-DEVICE-PUSH-TOKEN>', priority: 'normal', data: { experienceId: '@yourExpoUsername/yourProjectSlug', scopeKey: '@yourExpoUsername/yourProjectSlug', title: "\uD83D\uDCE7 你有新邮件", message: '你好,世界! \uD83C\uDF10', }, }), });
experienceId 和 scopeKey 字段是必需的。否则,你的通知不会发送到你的应用。FCM 在通知负载中提供了支持字段列表,你也可以通过查看 FirebaseRemoteMessage 来了解 expo-notifications 在 Android 上支持哪些字段。
FCM 还提供了一些适用于不同语言的服务端库,你可以用它们来代替原始的 fetch 请求。
如何找到 FCM 服务器密钥
你的 FCM 服务器密钥可以通过确保你已经完成了配置步骤来找到,并且不是将你的 FCM 密钥上传到 Expo,而是直接在你的服务器中使用该密钥(如前一个示例中的 FCM-SERVER-KEY)。
负载格式
{ "token": native device token string, "collapse_key": 标识通知可折叠性的字符串, "priority": "normal" || "high", "data": { "experienceId": "@yourExpoUsername/yourProjectSlug", "scopeKey": "@yourExpoUsername/yourProjectSlug", "title": 消息标题, "message": 消息正文, "channelId": 与此通知关联的 Android channel ID, "categoryId": 与此通知关联的类别, "icon": 要随此通知显示的图标, "link": 此通知应打开的链接, "sound": 布尔值或你想播放的自定义声音文件, "vibrate": "true" | "false" | number[], "priority": AndroidNotificationPriority, // https://docs.expo.dev/versions/latest/sdk/notifications/#androidnotificationpriority "badge": 要将图标角标设置为的数字, "body": { 键值对对象 } } }
Firebase 通知类型
Firebase Cloud Messaging 消息有两种类型:notification 和 data 消息。
-
Notification 消息仅由 Firebase 库处理(并显示)。它们不一定会唤醒应用,
expo-notifications也不会知道你的应用收到了任何通知。 -
Data 消息不会由 Firebase 库处理。它们会立即交给你的应用进行处理。
expo-notifications就是在这里解释 data 负载并根据这些数据采取操作。在几乎所有情况下,这都是你必须发送的通知类型。
如果你直接通过 Firebase 发送的是 notification 类型而不是 data 类型的消息,你将不知道用户是否与通知进行了交互(不会提供 onNotificationResponse 事件),并且你也无法在通知事件相关的监听器中解析通知负载中的任何数据。
当你需要一个
expo-notifications还未暴露的配置选项时,使用 notification 类型消息会有好处。通常来说,它可能比使用 data 类型消息带来更不可预测的情况。不过,你可能需要直接向 Google 报告你遇到的任何问题。
下面是使用 Node.js Firebase Admin SDK 发送 data 类型消息而不是 notification 类型消息的示例:
const devicePushToken = /* ... */; const options = /* ... */; // ❌ 以下负载在根级别包含一个 notification 对象,并且 // 它不会触发 expo-notifications,且可能无法按预期工作。 admin.messaging().sendToDevice( devicePushToken, { notification: { title: "这是一条 notification 类型消息", body: "`expo-notifications` 永远不会看到这条消息 😢", }, data: { photoId: 42, }, }, options ); // ✅ 在负载的根级别没有 "notification" 键 // 因此该消息是 "data" 消息,从而会触发 expo-notifications。 admin.messaging().sendToDevice( devicePushToken, { data: { title: "这是一条 data 类型消息", message: "`expo-notifications` 事件将被触发 🤗", // ⚠️ 注意,这个负载的 schema 与 Firebase SDK 的不同。 // 这里的 "body" 对应的是 "message"。更多信息请参见: // https://docs.expo.dev/versions/latest/sdk/notifications/#android-push-notification-payload-specification body: // 根据上面指定的 Android 负载格式, JSON.stringify({ photoId: 42 }), // 额外的 "data" 应放在 "body" 键下。 }, }, options );