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, }); }
四、原理说明
- Android 8+通知渠道:最新版的
phonegap-plugin-push会自动创建符合Android O要求的通知渠道,无需手动配置。 - 纯Data的优势:FCM会把Data消息直接传递给Phonegap插件,不管APP状态,我们可以完全控制消息的处理方式。
- 本地通知的作用:后台收到Data消息时,插件会触发
notification事件,但不会自动显示系统通知,所以需要用cordova-plugin-local-notification手动创建,点击这个本地通知时,我们能监听点击事件并触发弹窗逻辑。
测试验证
- 前台状态:发送推送,直接弹出Sweet Alert,符合预期。
- 后台状态:通知栏出现本地通知,点击后唤起APP并弹出弹窗。
- 关闭APP状态:通知栏出现本地通知,点击后冷启动APP并弹出弹窗。
内容的提问来源于stack exchange,提问作者Delmontee
相关产品推荐
相关产品推荐

