You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ionic3项目中Firebase推送通知无法在Android设备接收的问题

解决Android设备接收不到Firebase Cloud Functions推送通知的问题

我之前在Ionic项目里也碰到过几乎一模一样的情况——后台日志明明白白显示推送成功,但Android设备就是没反应,折腾了好一阵才找到问题根源。下面几个排查方向和解决方案,应该能帮你快速定位问题:

1. 先确认FCM令牌的有效性

这是最常见的坑!你存储在Firestore里的目标设备令牌,很可能已经失效了:

  • Ionic应用重启、卸载重装、系统版本更新,甚至设备更换SIM卡,都可能导致令牌失效。
  • 一定要在应用里监听令牌更新事件,确保新令牌及时同步到Firestore:
    firebase.messaging().onTokenRefresh(() => {
      firebase.messaging().getToken()
        .then(refreshedToken => {
          // 把新令牌更新到Firestore对应的用户文档里
          console.log('令牌已更新,同步到数据库:', refreshedToken);
        })
        .catch(err => {
          console.error('获取新令牌失败:', err);
        });
    });
    

2. 检查推送Payload的格式是否符合要求

Firebase对Android的推送Payload有严格要求,格式不对的话,就算后台显示发送成功,设备也不会弹出通知:

  • 如果你要让FCM自动在通知栏显示消息,必须包含notification字段;如果只传data字段,需要应用自己在后台处理并构建通知。
  • 别忘了加clickAction字段,这对Ionic应用很重要,能确保点击通知时打开正确的页面:
    const payload = {
      notification: {
        title: '新预约提醒',
        body: '您收到了一个新的预约请求',
        clickAction: 'FCM_PLUGIN_ACTIVITY'
      },
      data: {
        appointmentId: doc.id // 自定义业务数据,可选
      }
    };
    

3. 排查Android设备的系统限制

很多国产Android厂商(小米、华为、OPPO这些)的后台管控特别严,这也是推送收不到的常见原因:

  • 先确认应用已经获得通知权限,去系统设置里检查一下,别漏开了。
  • 把应用加入系统的后台白名单,关闭“省电模式”或者“智能休眠”这类功能——不然应用在后台时,系统会直接切断FCM的连接。
  • 可以先测试前台接收情况:如果前台能收到,后台收不到,90%是系统后台限制的问题。

4. 深挖Cloud Functions的日志细节

别只看“消息已发送”的提示,去看完整的函数执行日志,说不定藏着隐性错误:

  • 打开Firebase控制台的Cloud Functions页面,找到对应的函数,查看详细日志,重点看有没有error或者warning。比如有时候返回状态码是200,但其实部分令牌推送失败了。
  • 可以在函数里加日志,打印推送的完整响应,排查失效令牌:
    admin.messaging().sendToDevice(targetToken, payload)
      .then(response => {
        console.log('推送响应详情:', response);
        // 筛选出失效的令牌
        const failedTokens = response.results
          .map((result, index) => result.error ? targetToken : null)
          .filter(token => token !== null);
        if (failedTokens.length > 0) {
          console.log('发现失效令牌,建议清理:', failedTokens);
          // 这里可以顺便把Firestore里的失效令牌删掉
        }
      })
      .catch(err => {
        console.error('推送请求失败:', err);
      });
    

5. 验证Ionic FCM插件的配置

最后检查一下插件本身的配置是否正确:

  • 确保你用的FCM插件(比如cordova-plugin-fcm-with-dependecy-updated)是最新版本,避免插件兼容性问题。
  • 确认google-services.json文件正确放在Android项目的app目录下,应用包名和Firebase控制台里的项目包名完全一致。
  • 应用里要正确初始化FCM并监听消息:
    import firebase from 'firebase/app';
    import 'firebase/messaging';
    
    // 初始化Firebase配置
    firebase.initializeApp(yourFirebaseConfig);
    
    // 监听前台消息
    firebase.messaging().onMessage(payload => {
      console.log('前台收到推送:', payload);
      // 可以在这里手动弹出自定义通知
    });
    
    // 监听后台消息(需要在service-worker里配置)
    firebase.messaging().setBackgroundMessageHandler(payload => {
      const notificationTitle = payload.notification.title;
      const notificationOptions = {
        body: payload.notification.body
      };
      return self.registration.showNotification(notificationTitle, notificationOptions);
    });
    

我当时就是因为令牌失效+华为手机的后台限制,导致推送一直收不到,更新令牌并把应用加入后台白名单后就正常了。按照上面的步骤逐一排查,应该能很快解决问题!

内容的提问来源于stack exchange,提问作者somnathbm

火山引擎 最新活动