使用PHP发送FCM通知时APP关闭状态下无法接收的问题
Firebase推送通知:APP关闭时无法接收的问题解决
我来帮你分析下这个问题——你遇到的情况其实很常见,核心原因在于Firebase推送消息的两种类型差异,以及你的PHP代码生成的payload结构可能不够完善。
问题根源
Firebase的推送消息分为两种:
- 通知消息(Notification Message):当APP在前台时,会直接传递给你的APP代码处理;但当APP关闭/后台时,这条消息会由系统托盘接管显示。如果你的payload只有notification字段,可能因为系统的推送策略(比如低优先级)导致APP关闭时无法触发显示。
- 数据消息(Data Message):无论APP处于前台还是后台/关闭状态,都会直接传递给你的APP代码处理,但需要客户端提前写好对应的接收逻辑。
你的当前代码应该只发送了纯通知消息,而且可能缺少关键的优先级配置,这就导致APP关闭时系统没有及时触发通知展示。
PHP代码调整方案
你需要修改payload结构,同时包含notification和data字段,并设置高优先级,确保消息能被及时推送到设备。调整后的代码示例如下:
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




