FCM不能向所有主题订阅者发送通知(数据通知)。

13
我使用 FCM 向我的应用程序用户推送通知。我还使用 Firebase Analytics 来获取有关应用程序行为的反馈。
我有一个应用程序,在其默认活动启动时订阅特定主题。因此,基本上每个使用过该应用程序的用户都是主题订阅者。从 Firebase Analytics 中,我可以在过去 30 天的事件日志中看到 21374 个 first_open。我也可以在“活跃用户”仪表板中看到此数量。
因此,基本上应该有至少 21k 订阅者可用于该主题。
昨天我向这个主题发送了一条通知。这是一个数据通知,所以应用程序的后台/前台/未启动状态都没有问题。
在 onMessageReceived 方法中,我在 Firebase Analytics 上记录了一个事件。而且显然,只有 2.9K 用户收到了通知。
什么可以解释订阅者计数和有效推送给用户的通知之间的差异?
以下是一些可能相关的元素:
- 应用程序在 3 天前更新了商店。因此,用户可能尚未启动新版本的应用程序。但更新不应删除先前版本已订阅的主题。我还运行了一些测试来验证这一点,并且更新不会删除由先前版本订阅的主题(除非首先卸载应用程序)。因此,这不应该是出现此问题的原因。 - 应用程序使用了 GooglePlayServices / Firebase 包的新版本(从 9.2 到 10.0.1)。它是否会删除旧版 GooglePlayServices / Firebase 包订阅的所有主题?
是否有其他原因可以导致订阅者计数和通知发送计数之间的差异?
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上记录事件的方法。


删除了应用程序? - Apps-n-Add-Ons
看起来你已经搞定了。 - Bob Snyder
@ThomasThomas,你能添加你的IntentService吗? - Jorgesys
@Jorgesys,你指的是哪个IntentService?是FirebaseInstanceIdService吗?还是FirebaseMessagingService? - Thomas Thomas
@Jorgesys 我已经在我的第一篇帖子中添加了它。 - Thomas Thomas
显示剩余12条评论
2个回答

6

这里可能有多种因素:

1)用户可能已删除您的应用程序。

2)用户可能已在您的应用程序上使用“强制停止”功能。

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

4)用户没有连接到网络,他们的主题消息将被缓存直到主题消息的过期时间(默认为4周)。

5)用户可能已清除应用程序数据,这会导致实例ID失效并且主题消息也被取消订阅。如果您没有重新订阅逻辑,请保持取消订阅状态。

6)在较新的Android版本中,如果您的应用程序在一定时间内没有打开(Google没有披露具体时间),而在这些天中,如果您的应用程序没有任何可见组件,例如前台服务、通知等,那么该应用程序将被缓存,通知将无法像往常一样传递。这就是应用待机。

7)数据消息的到期时间已经过去,并且在此期间,用户未连接到FCM服务器并获取消息。

8)在某些情况下,FCM可能无法传递消息。这发生在特定设备上挂起了太多消息(>100),或者如果该设备在一个月以上没有连接到FCM。在这些情况下,您可能会收到回调FirebaseMessagingService.onDeletedMessages()

可能还有其他因素导致主题屏幕显示21k但与实际计数不符等。


在Firebase分析中,有一个“活跃用户”仪表板,表示每月、每周和每天的“唯一用户”活跃数。我有以下值:月=21k,周=7k和日=1.2k。即使有些人已经删除、停止了应用程序(微不足道)或清除了数据(微不足道),或者使用Android O(更微不足道),这也无法解释我上次发送会话中的“4k通知”。在另一个会话中,我有8k,然后在另一个会话中,只过了3天就有5k。自从我使用FCM以来,我只发送了6条消息,因此远未达到100条。 - Thomas Thomas
由于你的问题比较宽泛,所以我的回答也比较笼统。我没有完整的信息。而且我不知道你是如何订阅特定主题的用户的。可能会导致他们取消订阅。 - Kushan

2
看起来,在数据通知的“收到通知”方面,Firebase分析非常不准确。
我进行了以下测试: 向大约100,000个用户发送一个数据通知,该通知立即显示通知,并向另外大约100,000个用户发送相同的通知,这次使用Firebase控制台发送。 (在为测试创建主题之前,随机洗牌令牌)
根据Firebase控制台,数据通知的接收率为40%,而从控制台发送的通知为84%。因此,您预计推送打开次数与“已接收”的数量成比例,但令人惊讶的是,两组中的推送打开次数几乎相同。
在我们进行的另一项测试中,我们将我们内部系统的分析结果与Firebase进行了比较,发现我们系统中的“已收到”数量是Firebase报告的两倍。 请注意,这些测试是最近进行的(2天),Firebase中的事件可能会有一些延迟。如果未来几天数字得到对齐,我将更新评论。
编辑: 如承诺更新,仪表板没有刷新。我强烈感觉数据通知的“已收到”事件不可靠。

1
我相信这是正确的答案 - Firebase 报告并不可靠,只是一些估计。我的经验也是完全一样的。 - qkx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接