FCM不会将通知传递给所有主题订阅者(数据通知)

我使用FCM将通知推送给我的应用程序用户。 我还使用Firebase Analytics获取关于应用行为的一些反馈。

我有一个应用程序,它开始其默认活动时订阅特定的主题。 所以基本上每个启动至less一次该应用程序的用户都是主题订阅者。 从firebase分析,我可以在过去30天的事件日志中看到21374 first_open。 我也可以在“活跃用户”仪表板中看到这个数量。

所以基本上,这个话题至less应该有21万个用户

昨天我通知了这个话题。 这是一个数据通知 ,所以应用程序的背景/前景/未启动状态没有问题。

在onMessageReceived方法中,我logging了一个关于firebase分析的事件。 显然, 只有29千用户收到通知

什么可以解释用户数量和通知之间的差异有效推送给用户?

一些可以链接的元素:

  • 该应用程序已于3天前在商店更新。 所以用户可能没有启动应用程序的新版本。 但更新不应删除以前版本已订阅的主题。 我还运行了一些testing来validation这一点,并且更新不会删除先前版本订阅的主题(除非该应用程序是先卸载的)。 所以这不应该是这个问题的原因。

  • 该应用程序已更新为新版GooglePlayServices / Firebase包(从9.2到10.0.1)是否删除旧版GooglePlayServices / Firebase包订阅的所有主题?

有没有其他的原因可以导致用户数量和通知交付数量之间的这种差异?


@Bob Snyder

以下是我查看Google Play服务版本的方法:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance(); int success = googleApiAvailability.isGooglePlayServicesAvailable(this); if(success != ConnectionResult.SUCCESS) { googleApiAvailability.makeGooglePlayServicesAvailable(this); } FirebaseMessaging.getInstance().subscribeToTopic("mytopic"); 

所使用的Google Play服务的版本与移动设备环境有关,很多用户在更新GooglePlayService版本时遇到了一些困难,所以我通常保留比最新版本更低的版本,并且只在必要时进行更新。


@Jorgesys

我的FirebaseMessagingService实际上很简单:

 public class MyFirebaseMessagingService extends FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage remoteMessage) { Logger.d("From: " + remoteMessage.getFrom()); MyFirebaseAnalytics mAnalytics = new MyFirebaseAnalytics(this); mAnalytics.logEvent("notif", "reception"); Map<String, String> data = remoteMessage.getData(); // Check if message contains a data payload. if (data.size() > 0) { Logger.d("Message data payload: " + data); } 

logEvent方法是在Firebase上logging事件的方法。

Related of "FCM不会将通知传递给所有主题订阅者(数据通知)"

那么在这里可能有一些因素可以作为一个因素:

1)人们可能已经删除了你的应用程序

2)人们可能在您的应用上使用了“强制停止”

3)分析数据通常需要一些时间才能logging,可能不完整

4)人们没有连接到networking,他们的主题消息被caching直到主题消息的到期时间(默认是4周)

5)用户可能已经清除了应用程序数据,导致实例ID失效,主题消息也取消订阅。 如果你没有重新订阅的逻辑,他们将保持退订。

6)在较新的Android版本,如果你的应用程序不会打开一段时间(谷歌还没有透露数额),在那些日子里,如果你的应用程序没有任何可见的组件,例如前景服务,通知等。应用程序得到caching和通知不像往常一样交付。 这是应用程序待机

7)数据消息到期的时间已经过去,到那时,用户没有连接到FCM服务器并获得消息。

8)在某些情况下,FCM可能不传递消息。 当连接时在特定设备上有太多的消息(> 100)待处理,或者设备在超过一个月内未连接到FCM时,会发生这种情况。 在这些情况下,您可能会收到FirebaseMessagingService.onDeletedMessages()的callback

可能还有其他的因素,如主题屏幕显示21k,但它不是最新的实际计数等。