如何解决 Android 11 设备锁屏时 FCM 推送无法及时送达的问题

梦明酱_2900

梦明酱_2900

2026-07-06

592人浏览

原创

如何解决 Android 11 设备锁屏时 FCM 推送无法及时送达的问题

android 11 下使用 php 发送 fcm 推送时,通知仅在屏幕点亮后才到达,根源在于混用 notification 消息与 data 消息——应改用纯 data 消息并由客户端完整处理通知展示逻辑,规避系统对后台 notification 消息的省电限制。

android 11 下使用 php 发送 fcm 推送时,通知仅在屏幕点亮后才到达,根源在于混用 notification 消息与 data 消息——应改用纯 data 消息并由客户端完整处理通知展示逻辑,规避系统对后台 notification 消息的省电限制。

在 Android 11 及更高版本中,Google 对后台执行和消息处理施加了更严格的电池优化策略。当您使用 notification 字段(即「Notification Message」)发送推送时,FCM 会将该消息交由系统通知管理器直接处理——但系统仅在设备处于活跃状态(如亮屏、前台应用运行或白名单豁免)时才允许显示通知;一旦设备进入深度休眠(如锁屏超时、Doze 模式),此类消息会被延迟甚至丢弃,直到用户唤醒设备。

而真正的解决方案是:改用 Data Only Message(纯数据消息)。这类消息始终通过 onMessageReceived() 回调传递给您的应用(即使应用在后台或进程被杀),由您完全控制通知的构建、触发与唤醒逻辑,从而绕过系统对 Notification 消息的限制。

✅ 正确的 PHP 发送代码(Data Only Message)如下:

Android Control
Android Control

通过命令行工具(uiautomator、screencap、input、am)控制安卓设备。优先尝试非 root 执行,失败后自动回退至 root...

下载
<?php function sendPushNotification($to, $data = array()) {
    // 关键:移除 'notification' 字段,仅保留 'data'
    $fields = [
        'to' => '/topics/' . $to,
        'data' => $data, // ← 全部业务内容放在这里(title/body 等需自行解析)
        // 可选:添加 'priority' 和 'time_to_live' 提升可靠性
        'priority' => 'high',
        'time_to_live' => 3600 // 1小时有效期
    ];

    $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'  => '您的配送单 #A12345 已开始派送',
    'click_action' => 'FLUTTER_NOTIFICATION_CLICK', // 如为 Flutter 项目;原生 Android 可忽略或设为自定义 action
    'sound' => 'default',
    'badge' => '1'
];

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

⚠️ 注意事项与关键实践:

  • 客户端必须处理所有通知逻辑:Android 端 onMessageReceived() 中需手动解析 remoteMessage.data,构建 NotificationCompat.Builder 并调用 notify() —— 不再依赖 remoteMessage.notification(它在 Data 消息中为 null)。
  • 确保高优先级 + 唤醒能力:PHP 请求中务必设置 'priority' => 'high',并在 Android 客户端 onMessageReceived() 内正确申请 WakeLock(您当前的 wakeUpScreen() 实现基本合理,但建议使用 FLAG_KEEP_SCREEN_ON 或 PowerManager.FULL_WAKE_LOCK 配合 WakeLock.acquire(),并注意及时释放)。
  • 检查应用是否被系统限制:在 Android 设置 → 电池 → 应用启动管理 / 自启动管理中,确认您的 App 已启用“允许后台活动”、“允许自启动”、“不受电池优化限制”。
  • 避免混合消息类型:切勿同时包含 notification 和 data 字段(除非明确需要双路径分发),否则 FCM 会降级为 Notification Message 行为,导致锁屏失效。

? 总结:FCM 在 Android 11+ 的行为本质是「系统级管控」而非后端 Bug。PHP 侧无需复杂改造,只需切换至 Data Only Message 模式,并配合客户端完善后台唤醒与通知渲染逻辑,即可实现锁屏状态下秒级送达。这是 Google 官方推荐且经过验证的合规方案。

相关文章

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

2787

5

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

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

2023.09.19

5577

7

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

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

2023.10.18

725

5

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

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

2024.03.01

984

5

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

2026.11.06

0

12

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

2026.11.06

0

13

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

2026.11.06

0

10

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

2026.11.05

20

12

热门下载

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

精品课程

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

共162课时 | 45.4万人学习

Java 教程
Java 教程

共578课时 | 197.2万人学习

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

共64课时 | 9.7万人学习