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

Phonegap Firebase推送:点击通知无法触发事件监听(Android7/8)

解决Phonegap + FCM在Android 7/8后台点击通知未触发事件的问题

我之前也碰到过几乎一模一样的问题,折腾了好久才找到适配Android 7+的解决方案,核心在于完全掌控推送消息的处理逻辑,而不是依赖FCM系统服务自动处理通知。下面是分步解决方法:

一、关键前提:更新插件到最新版

旧版的phonegap-plugin-push对Android O(8.0)的通知渠道支持不完善,先把插件更新到最新稳定版,同时引入本地通知插件来手动控制后台通知展示:

cordova plugin add phonegap-plugin-push@latest
cordova plugin add cordova-plugin-local-notification@latest

二、调整推送Payload:只发送Data字段

放弃同时发送notification和data的方式,只发送data payload。原因是:如果发送notification字段,FCM系统服务会直接接管通知展示,点击后唤起APP但不会把事件传递给Phonegap插件;而纯data字段会让插件全程捕获消息,不管APP处于前台/后台/关闭状态。

修改你的PHP推送代码:

$data = array (
    "title" => "test",
    "body" => "test",
    "icon" => "notification_icon",
    "content_available" => true,
    // 可以添加自定义额外数据,比如跳转页面标识
    "targetPage" => "home"
);
$fields = array (
    'registration_ids' => $registrationIds,
    'data' => $data,
    "priority" => "high"
);

三、修改APP端监听逻辑

现在我们需要自己处理前台弹窗、后台创建系统通知、点击通知触发事件这三个场景:

var app = {
    initialize: function() {
        this.bindEvents();
    },
    bindEvents: function() {
        document.addEventListener('deviceready', this.onDeviceReady, false);
    },
    onDeviceReady: function() {
        console.log('Received Device Ready Event');
        app.setupPush();
        // 初始化本地通知权限
        cordova.plugins.notification.local.registerPermission(function(granted) {
            console.log('Notification permission granted: ' + granted);
        });
    },
    setupPush: function() {
        var push = PushNotification.init({
            android: {
                senderID: 'XXXXXXXXXX',
                iconColor: "#ccc",
                alert: true,
                badge: true,
                icon: 'notification_icon',
                sound: true,
                vibrate: true,
                // 关键参数:强制后台收到data时触发插件事件
                forceShow: true
            },
            browser: {},
            ios: {
                sound: true,
                vibration: true,
                badge: true
            },
            windows: {}
        });

        push.on('registration', function(data) {
            // 你的设备Token注册逻辑不变
        });

        push.on('error', function(e) {
            console.log('push error = ' + e.message);
        });

        push.on('notification', function(data) {
            console.log('Received push data:', data);
            
            // 1. APP前台:直接展示弹窗
            if (data.additionalData.foreground) {
                showPopup(data, "info");
            } else {
                // 2. APP后台/关闭:判断是否是冷启动唤起
                if (data.additionalData.coldstart) {
                    // 冷启动(APP完全关闭后点击通知唤起):直接展示弹窗
                    console.log('App started from cold state via notification');
                    showPopup(data, "info");
                } else {
                    // 后台运行:创建本地系统通知,让用户能在通知栏看到
                    cordova.plugins.notification.local.schedule({
                        id: Math.floor(Math.random() * 10000), // 唯一ID避免重复
                        title: data.title,
                        text: data.message,
                        icon: 'notification_icon',
                        sound: 'default',
                        // 把推送的额外数据存到本地通知里,点击时能获取
                        data: data.additionalData
                    });
                }
            }
            // 清除应用角标(按需)
            PushNotification.setApplicationIconBadgeNumber(function() {}, function() {}, 0);
        });

        // 3. 监听本地通知的点击事件
        cordova.plugins.notification.local.on('click', function(notification) {
            console.log('Local notification clicked:', notification);
            // 点击通知后展示弹窗,同时可以处理自定义逻辑(比如跳转页面)
            showPopup({
                title: notification.title,
                message: notification.text,
                additionalData: notification.data
            }, "info");
        });
    }
};

function showPopup(data, type){
    Swal.fire({
        type: type,
        title: data.title,
        text: data.message,
        showConfirmButton: true,
        imageUrl: data.image,
        imageWidth: 400,
        imageHeight: 200,
        imageAlt: data.title,
        animation: true,
    });
}

四、原理说明

  1. Android 8+通知渠道:最新版的phonegap-plugin-push会自动创建符合Android O要求的通知渠道,无需手动配置。
  2. 纯Data的优势:FCM会把Data消息直接传递给Phonegap插件,不管APP状态,我们可以完全控制消息的处理方式。
  3. 本地通知的作用:后台收到Data消息时,插件会触发notification事件,但不会自动显示系统通知,所以需要用cordova-plugin-local-notification手动创建,点击这个本地通知时,我们能监听点击事件并触发弹窗逻辑。

测试验证

  • 前台状态:发送推送,直接弹出Sweet Alert,符合预期。
  • 后台状态:通知栏出现本地通知,点击后唤起APP并弹出弹窗。
  • 关闭APP状态:通知栏出现本地通知,点击后冷启动APP并弹出弹窗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:30:28