Firebase Cloud Messaging可用参数及自定义按钮技术问询
嘿,我来帮你把FCM的这两个问题说清楚,都是实际开发里常用的点:
一、Firebase Cloud Messaging的常用可用参数
FCM的参数主要分为通知负载(Notification Payload)、**数据负载(Data Payload)**和顶层通用参数三类:
通知负载参数(用于展示系统通知)
title:通知的标题文本body:通知的正文内容icon:通知图标(Android对应drawable资源,iOS对应应用图标或指定图片)click_action:点击通知后触发的预设动作(比如打开指定Activity、URL)sound:通知提示音(Android支持自定义音频,iOS支持系统或自定义声音)badge:iOS应用图标右上角的数字标记color:Android通知的状态栏/通知栏颜色tag:Android端用于分组或替换同tag的重复通知body_loc_key/body_loc_args:多语言本地化的正文键与参数title_loc_key/title_loc_args:多语言本地化的标题键与参数
数据负载参数(完全自定义)
这部分没有固定限制,你可以根据业务需求设置任意键值对,比如custom_status: "pending"、order_id: "12345",客户端接收后可解析这些数据执行自定义逻辑。
顶层通用参数
to:目标设备的FCM令牌,或主题、条件表达式registration_ids:多个设备令牌的数组(单次最多1000个)condition:基于主题的条件推送表达式(比如'topic1' in topics && 'topic2' in topics)priority:消息优先级,可选high或normal(Android高优先级会立即唤醒设备,iOS影响推送送达时机)content_available:iOS端用于静默推送,唤醒应用后台处理mutable_content:iOS端允许扩展通知内容(比如自定义通知UI)
二、是否支持title、body等之外的参数?怎么实现YES/NO按钮和独立click_action?
当然支持!FCM允许你在数据负载中添加任意自定义参数,而带按钮的通知可以结合客户端配置和推送参数实现,下面是具体方案:
核心实现思路
自定义按钮的配置:
- Android:可以在客户端接收消息时,根据数据负载里的参数动态创建带按钮的通知,每个按钮绑定独立的
PendingIntent(比如打开不同页面、触发不同接口请求);也可以提前配置自定义通知通道,预设按钮动作。 - iOS:需要先在客户端注册通知类别(Category),定义好YES/NO按钮的标识和行为,推送时在通知负载中指定该类别即可,同时数据负载携带按钮对应的业务参数。
- Android:可以在客户端接收消息时,根据数据负载里的参数动态创建带按钮的通知,每个按钮绑定独立的
PHP/cURL发送示例代码
下面是包含自定义按钮参数和独立动作的请求示例,按钮配置放在数据负载中,客户端接收后解析处理:
<?php // 替换为你的FCM服务器密钥和目标设备令牌 $apiKey = 'YOUR_FCM_SERVER_KEY'; $targetToken = 'TARGET_DEVICE_FCM_TOKEN'; $fcmUrl = 'https://fcm.googleapis.com/fcm/send'; // 基础通知内容 $notification = [ 'title' => '操作确认', 'body' => '是否确认执行该操作?', 'icon' => 'ic_notification', 'click_action' => 'DEFAULT_MAIN_ACTION' // 默认点击动作 ]; // 自定义参数:包含YES/NO按钮的配置和业务数据 $data = [ 'button_config' => [ [ 'text' => 'YES', 'action_type' => 'CONFIRM_ACTION', 'action_url' => 'https://your-domain.com/api/confirm' ], [ 'text' => 'NO', 'action_type' => 'CANCEL_ACTION', 'action_url' => 'https://your-domain.com/api/cancel' ] ], 'order_id' => 'ORD-2024-001' ]; // 完整推送负载 $payload = [ 'to' => $targetToken, 'notification' => $notification, 'data' => $data, 'priority' => 'high' ]; // 请求头配置 $headers = [ 'Authorization: key=' . $apiKey, 'Content-Type: application/json' ]; // 发起cURL请求 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $fcmUrl); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload)); $result = curl_exec($ch); curl_close($ch); echo $result; ?>
客户端处理要点
- Android:在
FirebaseMessagingService的onMessageReceived方法中,通过remoteMessage.getData()获取button_config,然后创建带Notification.Action的通知,为每个按钮绑定对应的意图。 - iOS:在AppDelegate中注册通知类别,示例代码如下:
import UserNotifications func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 注册YES/NO按钮动作 let yesAction = UNNotificationAction(identifier: "CONFIRM_ACTION", title: "YES", options: [.foreground]) let noAction = UNNotificationAction(identifier: "CANCEL_ACTION", title: "NO", options: [.foreground]) // 创建通知类别 let confirmCategory = UNNotificationCategory(identifier: "CONFIRM_CATEGORY", actions: [yesAction, noAction], intentIdentifiers: [], options: []) // 注册类别 UNUserNotificationCenter.current().setNotificationCategories([confirmCategory]) return true }
之后在FCM推送的通知负载中添加"category": "CONFIRM_CATEGORY",客户端就能自动展示带按钮的通知了。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

