如何使用@capacitor/push-notifications插件修改接收的推送通知
@capacitor/push-notifications 修改推送展示内容的实现方案
首先明确核心结论:官方@capacitor/push-notifications插件本身不支持拦截、修改通知中心展示的推送内容。
这个插件提供的pushNotificationReceived事件仅在应用处于前台活跃状态时才会触发到JS层;当应用在后台运行、或被系统杀死时,FCM推送到达设备后会直接由系统渲染展示到通知中心,整个过程不会执行任何JS层代码,根本没有时机在JS侧完成解密再修改展示内容。
可落地的实现路径
要实现「收到加密推送→客户端解密→再展示到通知中心」的需求,必须在原生层完成拦截处理,具体可以按以下两种方式落地:
- 基于现有插件扩展原生拦截能力
- Android侧:自定义继承
FirebaseMessagingService的类,重写onMessageReceived方法,在方法内拿到原始加密的推送payload完成解密,再手动构建通知调用系统API展示。注意发送FCM消息时不要携带notification字段,仅传输data字段,这样系统收到推送后不会自动弹出通知,会将消息完整流转到你自定义的Service中处理。 - iOS侧:新增
Notification Service Extension靶机,这是iOS系统官方提供的通知前置拦截扩展,推送到达后系统会先将payload传入这个扩展,你可以在扩展代码内完成解密,修改通知的标题、正文、附带素材后,再交给系统渲染展示。要触发这个扩展,FCM推送payload里必须携带mutable-content: 1字段。
上述原生修改不需要你重写整个推送插件,只需要在Capacitor生成的原生工程里添加对应代码即可,解密完成后的消息如果需要同步给前端JS层,仍然可以复用原有插件的消息传递逻辑。
- Android侧:自定义继承
- 替换为支持前置拦截的第三方推送插件
如果不想自行编写原生代码,可以选择已经封装好上述原生拦截能力的社区推送插件,这类插件一般会直接暴露通知展示前的原生处理回调,支持在回调内完成解密等自定义逻辑后再触发通知展示,不需要手动写原生扩展。
避坑提示:不要尝试在JS层实现后台推送的解密逻辑。所有混合框架的JS执行线程都仅在应用前台活跃时处于运行状态,应用后台、杀进程场景下JS线程完全挂起,只有用户点击通知拉起应用后JS层才能拿到消息数据,这个时点通知早已展示完成,根本无法满足解密后再展示的需求。
内容的提问来源于stack exchange,提问作者mtnair
相关产品推荐
相关产品推荐

