You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,所以需要手动触发本地通知。
  • 用本地通知插件处理前台展示:
    先安装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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:04:54