iOS应用(Angular2+Cordova)FCM推送通知接收异常求助
我之前在做Angular + Cordova + Firebase推送的iOS项目时,也踩过几乎一模一样的坑,结合你的描述,咱们逐个击破这些问题:
1. 先解决「没有通知权限请求弹窗」的核心问题
这是所有推送功能的基础,没有权限的话iOS根本不会展示任何通知。
检查Info.plist配置:在Xcode的Info.plist里添加以下两个权限描述键(Cordova项目可以直接在
config.xml里配置,不用手动改Xcode):<platform name="ios"> <config-file parent="NSRemoteNotificationUsageDescription" target="*-Info.plist"> <string>需要推送通知来接收最新消息</string> </config-file> <config-file parent="NSAlertUsageDescription" target="*-Info.plist"> <string>需要弹窗权限来展示通知内容</string> </config-file> </platform>主动请求权限:在Angular的初始化逻辑里(比如
app.component.ts的ngOnInit),调用Firebase的权限请求方法:declare var firebase: any; // 若没有类型定义可临时声明 ngOnInit() { // 先检查当前权限状态 firebase.messaging().hasPermission() .then(hasPermission => { if (!hasPermission) { // 主动请求通知权限 firebase.messaging().requestPermission() .then(() => console.log('通知权限已获取')) .catch(err => console.error('请求权限失败:', err)); } }) .catch(err => console.error('检查权限失败:', err)); }注意:如果用户之前已经拒绝过权限,这个请求不会再弹出窗口,需要引导用户去「设置-你的APP-通知」手动开启权限。
2. 解决「前台收到通知但不展示」的问题
iOS的FCM默认不会在前台自动展示通知(Android会),而且从你的日志来看,你收到的是Data Message(仅包含data字段的消息),这类消息不管前台后台,FCM都不会自动处理展示,必须由APP手动处理。
区分消息类型:
- Notification Message:包含
notification字段(有title、body),后台时iOS会自动弹出通知,前台需要手动处理展示 - Data Message:仅包含
data字段,完全由APP自定义处理逻辑
你的日志显示Received data message,说明发送的是Data Message,所以需要手动触发本地通知。
- Notification Message:包含
用本地通知插件处理前台展示:
先安装cordova-plugin-local-notification插件:cordova plugin add cordova-plugin-local-notification然后在Angular里监听FCM的
onMessage事件,收到消息后触发本地通知:ngOnInit() { // ... 前面的权限请求代码 // 监听前台消息 firebase.messaging().onMessage((payload) => { console.log('前台收到消息:', payload); // 触发本地通知,补上缺失的标题 window.plugins.notification.local.schedule({ title: payload.notification?.title || '默认通知标题', text: payload.notification?.body || payload.data?.body, foreground: true // 允许前台展示通知 }); }); }
3. 解决「后台收不到推送,只有打开APP才看到」的问题
这个问题通常和APNs配置、消息类型、Xcode后台能力配置有关:
确保发送的是Notification Message:
若希望后台自动弹出通知,发送的消息payload必须包含notification字段,示例如下:{ "notification": { "title": "测试通知标题", "body": "example test notification message" }, "data": { "customKey": "customValue" }, "token": "你的设备FCM Token" }只有包含
notification字段的消息,iOS后台才会自动展示。检查APNs证书/密钥配置:
- 不管用p12证书还是p8密钥,确保其绑定的Bundle ID和APP的Bundle ID完全一致
- p8密钥要对应你的Apple开发者账号,且Firebase控制台里的APNs认证类型要和Xcode的Build Configuration匹配(Debug用开发环境,Release用生产环境)
开启Xcode后台能力:
在Xcode中进入项目 -> Targets -> Signing & Capabilities -> + Capability,添加Background Modes,然后勾选Remote notifications。验证Firebase配置文件:
确保GoogleService-Info.plist已正确导入Xcode项目,且在Build Phases -> Copy Bundle Resources中能看到该文件(Cordova项目通常会自动处理,但偶尔需要手动添加)。
4. 额外排查点
- 插件版本兼容性:确保
cordova-plugin-firebase是最新版本,旧版本可能存在iOS 13+的适配问题,若遇到瓶颈可尝试替换为@awesome-cordova-plugins/firebase-messaging(Ionic生态插件,Angular也可兼容使用)。 - 设备通知设置:在测试设备上进入「设置-你的APP-通知」,确认「允许通知」已开启,且通知样式选择了「横幅」或「提醒」。
- 测试环境:务必使用真实设备测试(你已完成这一步),iOS模拟器不支持推送通知功能。
内容的提问来源于stack exchange,提问作者Sergej

