邮件已成功发送,但Firebase Cloud Messaging中没有可见的通知

时间:2019-03-26 23:23:50

标签: firebase push-notification firebase-cloud-messaging

消息被报告为已成功发送,但没有弹出通知出现。

使用onMessage有时可以记录消息。

请求FCM令牌仅适用于本地主机。

在.com网站上尝试时,错误消息取决于我使用PC还是chromebook-生成的错误消息有所不同。

我使用了2种不同的设备,但始终使用Chrome浏览器。云功能将消息和FCM响应写入功能日志,以确认发送成功。

当我从收件人网页删除onMessage时,没有任何通知的迹象。

在这些试用期间将打开网页。这是web / javascript。

在两个设备中,通知权限均设置为允许。

我花了数小时进行网络搜索,试图找到有关尝试方法的任何提示。

firebase-messaging-sw.js

importScripts('https://www.gstatic.com/firebasejs/3.9.0/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/3.9.0/firebase-messaging.js');


firebase.initializeApp({
  'messagingSenderId': '593287500713' 
});

const messaging = firebase.messaging();

与网页一起运行的相关代码

 messaging.onMessage(function (payload) {
      console.log('Message received. ', payload);
    });

我假设没有onMessage,则通知应基于Firebase SDK出现,但不是。错误的假设

在后台时,没有任何显示。 (我认为通知应该会自动出现。)

在本地主机上运行时,我可以请求并接收FCM令牌,但是在部署时,相同的代码会引发错误。 “请求缺少必需的身份验证...”

我一直在与支持部门@ Google取得联系,他们向我保证了此建议,然后另一个人将100%解决该问题。没有任何改变。

我已经尝试了Firebase文档和github示例中的代码段。

如果我能找到可行的现有代码,那将是一个不错的开始,因为我认为经过40个小时的努力才能找到解决方案。

我错过了明显的事情吗?

更新......

我发现了看不到通知的两个原因。

1)我的PC的设置似乎部分抑制了显示。意外,因为确实会显示YouTube通知。 (打开屏幕右下角的通知托盘。带有新月形符号的“聚焦辅助”。如果单击它,则显示“开”或“仅警报”,我认为这限制了所看到的内容。)

2)我基于Firebase文档和视频的假设是onMessage()可以防止用户在网页上时发出通知,并允许开发人员忽略或处理页面内的通知。对了一半显然,通知是默认忽略的,除非onMessage()对它们进行了处理。该文档提供了onMessage()的代码片段,但仅提供了如何登录到控制台。

还发现了一个有趣的问题。现在,我的PC已注册了邮件的收件人,即使该收件人已注销并已在另一台设备上登录,它也会收到邮件。听起来像个问题。

该代码的当前工作版本。这会出现在网页/应用中(不是位于messages-sw.js文件中

1 个答案:

答案 0 :(得分:0)

关于消息传递的介绍性视频表明,当有人访问网站时,弹出来自网站的通知是不好的UX。因此,代码可以包含onMessage()来忽略通知或在页面中处理通知。

文档提供了onMessage版本,该版本仅将通知记录到控制台,并且仅包含有关执行其他操作的注释。

文档的其他部分说明系统会自动显示通知。

因此,我推断没有onMessage(),通知将自动出现。

看来我错了。

我花了很多时间来解决这个问题并找到一些代码来使通知出现。 (即使现在我不确定我是否已经掌握了发生的情况,但以下方法似乎可行)

它进入网页/应用程序。 (不在messaging-sw.js中。将其放在“使用窗口方法”时会引发错误)

[请注意,我还发现自己的PC设置方式似乎允许YouTube发送通知,但阻止了FCM通知的显示。 (请参阅相关说明)

到目前为止,当用户使用打开网页,后台显示网页以及关闭浏览器时,我已经对此进行了测试。通知以默认声音显示,并在通知托盘中列出。

如果收件人从网页注销并在另一台设备上登录,也会发生这种情况。消息继续发送到同一设备。

消息发送到设备而不是用户]

 messaging.onMessage(function (payload) { 
      try{  //try???
      console.log('Message received. ', payload);

      noteTitle = payload.notification.title; 
      noteOptions = {
        body: payload.notification.body,
        icon: "typewriter.jpg", //this is my image in my public folder
      };

      console.log("title ",noteTitle, " ", payload.notification.body);
          //var notification = //examples include this, seems not needed

      new Notification(noteTitle, noteOptions);//This can be used to generate a local notification, without an incoming message. noteOptions has to be an object
    }
    catch(err){
      console.log('Caught error: ',err);
    }
    });

``````````