如何解决 Android 11 设备锁屏时 FCM 推送延迟或不触发的问题

千萱小哥_9303

千萱小哥_9303

2026-07-09

292人浏览

原创

如何解决 Android 11 设备锁屏时 FCM 推送延迟或不触发的问题

android 11 设备在锁屏状态下无法及时接收 php 后端发送的 fcm 推送,根本原因在于使用了「通知消息(notification message)」而非「数据消息(data message)」,导致系统受后台执行限制与省电策略影响而延迟投递。

android 11 设备在锁屏状态下无法及时接收 php 后端发送的 fcm 推送,根本原因在于使用了「通知消息(notification message)」而非「数据消息(data message)」,导致系统受后台执行限制与省电策略影响而延迟投递。

FCM 消息分为两类:通知消息(Notification Message) 和 数据消息(Data Message)。前者由 Firebase 自动处理——即使应用进程被杀或设备锁屏,系统级通知栏仍可显示,但 Android 8.0+(尤其是 Android 11)对后台服务和唤醒行为施加了严格限制,当仅发送 notification 字段时,FCM 可能将消息降级为“高优先级但非强制唤醒”,实际投递严重依赖系统调度,导致锁屏后延迟甚至丢弃。

而 数据消息(Data Message) 则不同:它始终通过 onMessageReceived() 回调送达应用层(即使应用在后台或进程被杀),由开发者完全控制通知构建与唤醒逻辑,从而绕过系统对通知消息的节流机制。因此,修复的关键是:PHP 后端必须发送纯 data 字段的消息,移除 notification 字段,并确保 Android 端正确响应 RemoteMessage.getData()。

✅ 正确的 PHP 发送代码(数据消息示例):

<?php function sendPushNotification($to, $data = array()) {
    // 关键:仅保留 data 字段,移除 notification 字段
    $fields = [
        'to' => '/topics/' . $to,
        'data' => $data, // ← 核心:使用 data 而非 notification
        'priority' => 'high', // 必须设为 high 才可能唤醒设备
        'time_to_live' => 3600 // 可选:设置存活时间(秒)
    ];

    $headers = [
        'Authorization: key=MY_SECRET_FCM_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 json_decode($result, true);
}

// 示例调用:发送纯数据消息
$data = [
    'title' => '订单已更新',
    'body'  => '您的配送单状态已变更',
    'click_action' => 'FLUTTER_NOTIFICATION_CLICK' // Android 专用:点击跳转标识(如需)
];

sendPushNotification("myTopic", $data);
?>

⚠️ 注意事项:

  • 不要混用 notification 和 data 字段:若同时存在,FCM 会以「通知消息」模式投递,onMessageReceived() 在后台/锁屏时不会被调用(仅前台生效),导致你的 wakeUpScreen() 逻辑失效。

    Android SMS Gateway
    Android SMS Gateway

    自托管短信服务,使用 Android 手机作为网关提供 HTTP API,支持发送/接收短信,兼容主流短信网关。

    下载
  • Android 端必须监听 data 字段:在 onMessageReceived() 中改用 remoteMessage.getData() 解析内容,而非 remoteMessage.getNotification():

    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        Log.d(TAG, "Data message received: ${remoteMessage.data}")
    
        // ✅ 从 data 中提取内容
        val title = remoteMessage.data["title"] ?: "默认标题"
        val body = remoteMessage.data["body"] ?: "默认内容"
    
        // 构建并显示通知(含唤醒逻辑)
        wakeUpScreen()
        showNotification(title, body)
    }
  • 确保 priority: "high" + time_to_live:这是触发系统唤醒的关键参数;低优先级消息会被延迟或丢弃。

  • 验证 Android 权限与配置:确认 AndroidManifest.xml 中已声明 WAKE_LOCK 和 POST_NOTIFICATIONS(Android 12+)权限,并在运行时动态申请(如适用)。

? 总结:PHP 后端问题本质并非代码缺陷,而是消息类型误用。将 notification 替换为 data、设置 priority: high、并在 Android 端统一从 data 解析内容,即可稳定实现锁屏唤醒与即时推送。此方案兼容 Android 11+ 后台限制,且无需关闭电池优化(用户侧更友好)。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

android

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

2023.08.14

922

4

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.22

2747

5

android权限限制怎么解开
android权限限制怎么解开

android权限限制可以使用Root权限、第三方权限管理应用程序、ADB命令和Xposed框架解开。详细介绍:1、Root权限,通过获取Root权限,用户可以解锁所有权限,并对系统进行自定义和修改;2、第三方权限管理应用程序,用户可以轻松地控制和管理应用程序的权限;3、ADB命令,用户可以在设备上执行各种操作,包括解锁权限;4、Xposed框架,用户可以在不修改系统文件的情况下修改应用程序的行为和权限。

2023.09.19

5417

7

android重启应用的方法有哪些
android重启应用的方法有哪些

android重启应用有通过Intent、PendingIntent、系统服务、Runtime等方法。本专题为大家提供Android相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

705

5

Android语音播放功能实现方法
Android语音播放功能实现方法

实现方法有使用MediaPlayer实现、使用SoundPool实现两种。可以根据具体的需求选择适合的方法进行实现。想了解更多语音播放的相关内容,可以阅读本专题下面的文章。

2024.03.01

964

5

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

80

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

60

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

220

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

140

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 45万人学习

Java 教程
Java 教程

共578课时 | 195.2万人学习

Uniapp从零开始实现新闻资讯应用
Uniapp从零开始实现新闻资讯应用

共64课时 | 9.7万人学习