Firebase+Phonegap-plugin-push:如何发送静默消息并更新应用?
解决phonegap-plugin-push的onNotification回调未触发问题
我之前在把FCM集成到Ionic应用时也碰到过一模一样的问题,核心原因是你发送的APNs payload格式不符合phonegap-plugin-push的要求,导致推送被识别成了静默推送,根本不会触发onNotification回调。下面一步步帮你排查修复:
1. 先分析你的Payload问题
看你当前发送的FCM数据结构:
'message': { 'token': '<my-device-token>', 'data': { 'yup': 'okay' }, 'apns': { 'payload': { 'aps': { 'data': 'here is my data', 'badge': 1, 'content-available': 1 }, 'notId': 2 } } }
这里有两个致命问题:
- 缺少
aps.alert字段:APNs规则里,没有alert的推送会被标记为静默推送,这类推送只会偷偷唤醒应用后台处理,完全不会触发onNotification回调(只会触发onBackgroundMessage,如果配置了的话)。 - 自定义数据放错了位置:
aps是APNs的标准字段集合,自定义数据应该放在payload的根层级(和aps同级),塞到aps里插件根本解析不到。
2. 修正后的Payload结构
调整后的FCM发送数据应该是这样的:
'message': { 'token': '<my-device-token>', 'data': { 'yup': 'okay' }, # 这个FCM的data字段会被插件传到回调的additionalData里 'apns': { 'payload': { 'aps': { 'alert': { # 必须加alert字段,哪怕是简单文本或空对象都可以 'title': '你的通知标题', 'body': '你的通知内容' }, 'badge': 1, 'content-available': 1 # 如果不需要后台唤醒应用可以直接删掉 }, 'notId': 2, # 保持和aps同级,插件能识别这个字段 'custom_data': 'here is my data' # 自定义数据放在payload根层级 } } }
3. 确认应用端的插件配置
还要确保你的Ionic应用里正确注册了回调,并且iOS配置开了alert权限:
const push = PushNotification.init({ android: { senderID: "你的FCM Sender ID" }, ios: { alert: "true", // 必须开这个,否则收不到通知触发回调 badge: "true", sound: "true" }, windows: {} }); // 确认回调注册没问题 push.on('notification', function(notification) { console.log('通知已接收:', notification); // 这里处理你的通知逻辑,比如弹提示、更新UI // notification.additionalData里会包含你发送的data和custom_data }); push.on('error', function(error) { console.error('推送插件出错:', error.message); });
4. 额外注意点
- 如果应用在前台,部分版本的phonegap-plugin-push不会自动弹通知,但
onNotification回调依然会触发,你可以在回调里手动处理通知显示。 content-available:1是给后台数据同步用的,如果你不需要后台唤醒应用,直接删掉这个字段就行,省得浪费系统资源。
调整完Payload再测试推送,onNotification回调应该就能正常触发了!
内容的提问来源于stack exchange,提问作者J. Hesters
相关产品推荐
相关产品推荐

