You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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允许你在数据负载中添加任意自定义参数,而带按钮的通知可以结合客户端配置和推送参数实现,下面是具体方案:

核心实现思路

  1. 自定义按钮的配置:

    • Android:可以在客户端接收消息时,根据数据负载里的参数动态创建带按钮的通知,每个按钮绑定独立的PendingIntent(比如打开不同页面、触发不同接口请求);也可以提前配置自定义通知通道,预设按钮动作。
    • iOS:需要先在客户端注册通知类别(Category),定义好YES/NO按钮的标识和行为,推送时在通知负载中指定该类别即可,同时数据负载携带按钮对应的业务参数。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:11:00