Ionic 6 Angular应用无法接收后台推送通知问题求助
解决Ionic Angular + Capacitor 3后台/杀死状态下推送通知不显示问题
针对你遇到的前台能接收推送但后台/应用杀死后系统托盘无通知的问题,从配置、推送格式、代码逻辑三个核心方向排查:
一、Android平台配置检查
- Firebase配置文件验证:确保
google-services.json已放在android/app目录下,文件内的包名与Firebase项目注册的包名完全一致。 - 通知通道关联:Android 8.0+必须指定通知通道才能显示通知。你代码中创建了
test通道,但推送时必须在payload里指定channel_id: "test",否则系统不会展示通知。 - 权限与服务配置:检查
AndroidManifest.xml是否添加必要权限:
同时确认Capacitor推送服务已注册:<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <!-- Android 13+ 必填 --> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /><service android:name="com.getcapacitor.plugin.pushnotifications.PushNotificationsFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> - 电池优化豁免:部分安卓厂商的电池优化会阻止后台推送,需将应用设置为「不优化电池使用」。
二、iOS平台配置检查
- Firebase配置文件集成:
GoogleService-Info.plist必须通过Xcode添加到项目(直接复制到目录无效),添加时勾选Copy items if needed。 - Xcode能力配置:在项目
Signing & Capabilities中,确保添加Push Notifications能力,同时在Background Modes里勾选Remote notifications。 - 系统通知权限:除了应用内请求的权限,还要在设备系统设置中确认应用的通知权限已开启(包括锁屏、通知中心展示权限)。
三、推送Payload格式问题
不管是自有API还是Firebase控制台,推送格式必须符合平台要求,否则后台/杀死状态下不会触发系统托盘通知:
- Android推送示例:必须包含
notification字段,且指定通道ID{ "notification": { "title": "测试通知", "body": "后台通知测试", "channel_id": "test" }, "to": "设备Token" } - iOS推送示例:必须包含
aps字段,且带alert内容{ "aps": { "alert": { "title": "测试通知", "body": "后台通知测试" }, "sound": "default" }, "to": "设备Token" } - Firebase控制台注意事项:选择「Notification」类型推送(而非「Data」类型),纯Data消息在后台/杀死状态下不会触发系统托盘,需配合Notification字段使用。
四、代码逻辑修复
你的代码存在两处关键问题,会导致推送初始化异常:
- 构造函数不能直接用await:构造函数无法标记为async,需把初始化逻辑抽成独立async函数:
constructor(private platform: Platform) { this.initPushNotifications(); } private async initPushNotifications() { if (this.platform.is('ios') || this.platform.is('android')) { let permissions = await PushNotifications.checkPermissions(); if (permissions.receive == "granted") { await this.setupFirebase(); } else { let permissions = await PushNotifications.requestPermissions(); if (permissions.receive == "granted") { await this.setupFirebase(); } } } } - 通道创建时机修正:
register()是异步操作,需用await确保注册完成后再创建通道:private async setupFirebase() { // ... 监听器代码保持不变 ... await PushNotifications.register(); await PushNotifications.createChannel({id: "test", name: "test", importance: 5}); }
五、额外排查步骤
- 确认设备Token已正确上传到自有API,推送时使用的Token有效
- 查看Firebase控制台的消息发送记录,排查是否存在Token无效、权限拒绝等报错
- 使用真实设备测试,模拟器对推送通知的兼容性较差
内容的提问来源于stack exchange,提问作者YSFKBDY
相关产品推荐
相关产品推荐

