当前位置: 首页 > 知识库问答 >
问题:

Firebase Cloud Messaging onMessage接收到不能与 ShortcutBadger 一起使用

蒙奇
2023-03-14

我使用Firebase Cloud Messaging发送通知,使用ShortcutBadger更新应用徽章上的未读消息数。我已经扩展了< code > firebasemesagingservice 类,并实现了覆盖方法< code>onMessageReceived,它似乎工作得很好,因为当我的应用程序在后台或被终止时,我会收到通知。但是,当我在此方法中添加< code>ShortcutBadger调用时,我不再收到通知,并且ShortcutBadger调用不起作用。

快捷方式枷锁需要一个上下文,并且由于Firebase消息服务扩展了服务,因此它是一个上下文,这就是为什么我只是传递这个。我也有快捷方式转换器在我的代码的其他部分工作,所以我知道它的工作原理。

任何建议将不胜感激。

public class Notifications extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        ShortcutBadger.applyCount(getApplicationContext(), 1); // <-- now is working
    }

}

编辑:服务器端代码

这是发送Firebase消息的服务器端代码

Notification notification = new Notification.Builder(null)
        .title(msg.getTitle())
        .badge(msg.getBadge())
        .body(msg.getMessage())
        .build();


Message message = new Message.Builder()
        .timeToLive(timeToLive)
        .delayWhileIdle(true)
        .notification(notification)
        .addData("text", msg.getMessage())
        .addData("title", msg.getTitle())
        .addData("line1", msg.getSubtitle())
        .addData("badge", String.valueOf(msg.getBadge()))
        .addData("qummute_notification", "true")
        .build();

Result result = send(message, deviceKey, retries);

有人建议我在没有通知有效负载的情况下发送消息。会尝试一下,看看会发生什么。

共有3个答案

霍建章
2023-03-14

这似乎工作正常,因为当我的应用程序在后台或被杀死时,我会收到通知

不,如果您有通知负载,当您的应用程序在前台而不是后台时,会调用< code>onMessageReceived。

在您的服务器端代码中,您添加了通知有效负载,因此以前当应用程序在后台但通知由操作系统从您的有效负载中显示时,也不会调用您的onMessageReception

如果您想一直处理推送,您需要删除通知负载,但请记住,如果您有iOS应用程序,它可能会中断iOS推送。

公西光华
2023-03-14

您需要从服务器处理这种情况side.Remove从JSON通知并使用数据。删除通知孔对象,“通知”:{“标题”:“我的标题(如果有)”,“正文”:“位置”,“声音”:“默认”},

从您发送通知的位置,您需要更改该代码,对于服务器端代码,即使应用程序在后台或被杀死,您的onMessageRecereced方法调用也是如此。

{
  "registration_ids": [
    "cBbGxlj5JRI:APA91bFRLp3tDoBo_P5lGYGUZ4F6iJ55yBJq4GInL7RVV2asHR5PovqnMX-ekIdl_xOYyRyJmSe3SkxYMa3mzIvqml3MmLYZUh8JWygixIebhzhb_l4xv0Q-v3werKl_UO069G1uOyvq"
  ],
  "data": {
    "title": "alt_ctgry - Vehicle Number - extra detail(if any)",
    "body": "location"
  },
  "priority": "high"
}

如果你想创建通知,那么写你自己的通知代码。对于通知数据访问,使用以下代码,

@Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        Log.e("FCM", "Call onMessageReceived\n" + remoteMessage + "");

        String title = remoteMessage.getData().get("title");
        String body = remoteMessage.getData().get("body");

        createNotification(title, body);
    }
相温文
2023-03-14
    < li >您是否确保在测试时没有调用< code > shortcut badger . remove count(Context Context)? < li >尝试使用< code > shortcut badger . applycountorthrow(Context Context,int badgeCount)查看是否引发了任何异常。 < li >在后台线程上调用< code > on message received(remote message remote message)。也许你正在测试的手机/启动器正在使用一个不能从后台线程创建和显示的徽章。
 类似资料:
  • 我试图用DataJpaTest注释测试我的存储库,但出现了一些奇怪的情况。 当我使用经典的时,一切正常,我的测试成功了。但是当我使用下面的生成器时,我的测试失败了。 测试应该成功,但其他测试没有成功,因为没有抛出关于约束有效性的异常。 例如,这里有一个失败的断言: Java语言AssertionError:预期测试将抛出org的实例。springframework。道。DataIntegrityV

  • 我的application.properties文件中有以下属性。 当我使用注释在spring控制器中使用属性时,它给我的值为2003,但当我通过获得它的值时,我获得的值为 如何使用AbstractenVironment获得值2003?

  • 我正在尝试推出一个使用STS开发的简单hibernate MYSQL应用程序。Hibernate使用c3P0进行连接池。当我推送应用程序并开始访问它时,我看到与c3P0相关的异常。我在本地测试了它,它运行良好。 ResourcePool无法从其主要工厂或来源获取资源。com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(Basic

  • 问题内容: 我这样做: 并获得此异常: 不兼容的类型:Intf不是功能接口接口Intf中存在多个非重写的抽象方法。用-Xdiags:verbose重新编译以获得完整的输出1错误 是否有任何条件不能使用lambda替换匿名类? 问题答案: 否。没有办法“克服”这一问题。功能接口必须只有一种抽象方法。您的界面有两个: 注意:您不需要注释中提到的界面注释。但是,如果您的接口不是有效的功能接口,则可以使用

  • 要实现这一点,我需要将Zapier连接到MongoDB。然而,MongoDB Atlas中提供的连接字符串(我已经成功地使用它连接其他应用程序)似乎不能与Zapier一起工作。 在connect对话框(https://ibb.co/TQ1lxyf)中,我尝试将mongodb连接字符串作为主机输入(没有密码和用户名,它们必须分别输入)。 MongoDB+srv:/:@cluster0-v1yap.m

  • 问题内容: 我已经使用Selenium和最初的PhantomJS开发了一些Python脚本。在走向自动下载时,我改用了(带头的)Firefox(运行了),然后选择了无头选项的Chrome,这样我就不会打开浏览器了。 我的第一个脚本访问一个页面和几个HTML元素,与无头Chrome完美搭配。 但是第二个 仅适用于带头的Chrome 。如果添加“无头”选项,它将不再起作用。当我尝试以无头模式打印HTM