You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

使用PHP发送FCM通知时APP关闭状态下无法接收的问题

Firebase推送通知:APP关闭时无法接收的问题解决

我来帮你分析下这个问题——你遇到的情况其实很常见,核心原因在于Firebase推送消息的两种类型差异,以及你的PHP代码生成的payload结构可能不够完善。

问题根源

Firebase的推送消息分为两种:

  • 通知消息(Notification Message):当APP在前台时,会直接传递给你的APP代码处理;但当APP关闭/后台时,这条消息会由系统托盘接管显示。如果你的payload只有notification字段,可能因为系统的推送策略(比如低优先级)导致APP关闭时无法触发显示。
  • 数据消息(Data Message):无论APP处于前台还是后台/关闭状态,都会直接传递给你的APP代码处理,但需要客户端提前写好对应的接收逻辑。

你的当前代码应该只发送了纯通知消息,而且可能缺少关键的优先级配置,这就导致APP关闭时系统没有及时触发通知展示。

PHP代码调整方案

你需要修改payload结构,同时包含notificationdata字段,并设置高优先级,确保消息能被及时推送到设备。调整后的代码示例如下:

function send_notification($token,$title,$desc){
    // 通知栏展示的内容
    $notification = array(
        'body' => $desc,
        'title' => $title,
        'icon' => 'myicon', // 确保这个图标在客户端有对应资源
        'sound' => 'default' // 补全sound字段,用默认提示音或者自定义音
    );
    
    // 自定义数据,客户端可以获取这些内容做后续处理
    $data = array(
        'notification_title' => $title,
        'notification_desc' => $desc,
        'custom_key' => 'custom_value' // 可以根据需求添加自定义字段
    );
    
    // 完整的请求payload
    $fields = array(
        'to' => $token,
        'notification' => $notification,
        'data' => $data,
        'priority' => 'high' // 高优先级确保消息不会被系统延迟
    );

    // 发送请求到FCM服务器的配置
    $headers = array(
        'Authorization: key=YOUR_FCM_SERVER_KEY', // 替换成你的服务器密钥
        'Content-Type: application/json'
    );

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send');
    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($fields));
    
    $result = curl_exec($ch);
    curl_close($ch);
    
    return $result;
}

关键调整点说明

  • 添加data字段:即使APP关闭,客户端的Firebase消息服务也能接收到这条数据,配合客户端代码可以触发通知展示(如果客户端没有默认处理的话)。
  • 设置priority: high:这个参数会告诉FCM服务器优先推送这条消息,避免系统在APP关闭时延迟或忽略推送。
  • 补全sound字段:如果你的代码里sound字段没有写完,一定要补全,否则部分设备可能不会触发提示音,也可能影响通知的展示逻辑。

额外提醒

除了PHP代码调整,你还需要确保客户端配置正确:

  • Android端:要正确实现FirebaseMessagingService,重写onMessageReceived方法,处理data字段的内容。
  • iOS端:要开启推送权限,在AppDelegate中配置didReceiveRemoteNotification方法,处理推送消息。

内容的提问来源于stack exchange,提问作者khushhal goyal

火山引擎 最新活动