系统刚启动时未收到 FCM 通知

Posted

技术标签:

【中文标题】系统刚启动时未收到 FCM 通知【英文标题】:FCM notifications not received when system is just booted 【发布时间】:2018-02-26 07:47:24 【问题描述】:

我已经在我的 android 应用程序中实现了 FCM 推送通知。在正常情况下会收到推送通知。我的情况是:

    关闭手机。 向使用生成的令牌发送 FCM 推送通知 FirebaseInstanceId.getInstance().getToken() 打开手机。 (未收到通知) 打开应用程序。 (未收到通知)

手机应该不会收到手机开机的通知。我针对另一个场景测试了 FCM。

    关闭互联网 向使用生成的令牌发送 FCM 推送通知 FirebaseInstanceId.getInstance().getToken() 打开互联网。 (收到通知)

为什么刚启动设备时没有收到 FCM 通知?

【问题讨论】:

你为 FCM 使用了什么 ttl 值? 我在 firebase 控制台上测试这个。我已将有效期设置为 4 周。 【参考方案1】:

我认为您应该在不同的设备上重复这种情况,因为某些设备默认具有特殊设置,例如除非明确允许,否则不允许后台应用程序自动启动或访问互联网。因此,也许它是特定于设备的,例如,如果您在应用程序未在前台打开或在最近的应用程序中可用时没有收到通知,那么就是这种情况。

除此之外,我认为您应该在清单中添加RECEIVE_BOOT_COMPLETED 权限并在接收boot complete 广播时初始化您的应用程序,这样它就不会在设备关闭时被杀死,并且在设备打开时它的服务会重新启动.

我在一部手机上有几个带有 GCM 推送通知的应用程序,而且这部手机经常没电,但每次我再次打开它时,我都会收到手机离线时发送的所有通知。所以我认为你的场景中缺少一些东西,它应该在打开时收到通知。

【讨论】:

是的,它是特定于设备的。在 moto 设备及其工作上进行了测试,但不是在一加 3 上测试。【参考方案2】:

每当生成新令牌时都会触发 onTokenRefreshcallback,因此在其上下文中调用 getToken 可确保您访问的是当前可用的注册令牌。确保您已将服务添加到清单中,然后在 onTokenRefresh 的上下文中调用 getToken,并记录如下所示的值:

您必须确保在 MyFirebaseInstanceIDService 中覆盖 onTokenRefresh 方法

@Override
public void onTokenRefresh() 
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);
    sendRegistrationToServer(refreshedToken); // Replace this method with your appropriate method for send registration token to server

【讨论】:

它已经完成了,这不是令牌刷新的情况。因为我已经测试过稍后发送带有相同令牌的推送通知及其工作。

以上是关于系统刚启动时未收到 FCM 通知的主要内容,如果未能解决你的问题,请参考以下文章

通过 FCM 发送时未收到推送通知,但在 IOS 上通过 APN 发送时收到

打开应用程序并锁定屏幕时未收到 Ionic FCM 推送通知,除非被点击

Swift如何在系统启动之前更改从firebase(FCM)收到的通知标题和正文?

Firebase FCM onLaunch 代码在单击通知时未运行功能

在收到 Firebase 通知时打开应用 (FCM)

收到 FCM 通知时如何在不点击通知的情况下打开(启动)应用程序