草庐IT

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

coder 2023-11-21 原文

我使用 FCM 向我的应用用户推送通知。 我还使用 Firebase Analytics 获取有关应用行为的一些反馈。

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

所以基本上,至少 21,000 个订阅者应该可以用于该主题。

我昨天推送了一个关于这个主题的通知。 是数据通知,所以应用的后台/前台/未启动状态都没有问题。

在 onMessageReceived 方法中,我在 firebase analytics 上记录了一个事件。显然,只有 2,900 名用户收到了通知

如何解释订阅者数量与有效推送给用户的通知之间的这种差异?

一些可以链接的元素:

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

  • 该应用已更新为新版本的 GooglePlayServices/Firebase 软件包(从 9.2 到 10.0.1) 它会删除旧版 GooglePlayServices/Firebase 包订阅的所有主题吗?

是否还有任何其他原因会导致订阅者数量与通知发送数量之间出现这种差异?


@鲍勃·斯奈德

以下是我检查 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 Services的版本与mobile+wear的环境有关,很多用户在更新自己的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 上记录事件的方法。

最佳答案

好吧,这里可能有很多因素:

1) 人们可能已经删除了您的应用

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

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

4) 没有连接到网络的人在主题消息过期时间(默认为 4 周)之前缓存他们的主题消息

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

6) 在较新的 android 版本中,如果您的应用程序在大约一段时间内未打开(谷歌尚未披露数量)并且在那些日子里如果您的应用程序没有任何可见组件,例如前台服务、通知等.. 应用程序已缓存,通知不会像往常一样发送。这是应用待机

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

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

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

关于android - FCM 不向所有主题订阅者发送通知(数据通知),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47888040/

有关android - FCM 不向所有主题订阅者发送通知(数据通知)的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  3. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  4. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  5. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  6. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  7. ruby - 使用 Ruby 通过 Outlook 发送消息的最简单方法是什么? - 2

    我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=

  8. ruby-on-rails - 如何在发布新的 Ruby 或 Rails 版本时收到通知? - 2

    有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:

  9. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  10. ruby - 是否可以在不实际发送或读取数据的情况下查明 ruby​​ 套接字是否处于 ESTABLISHED 或 CLOSE_WAIT 状态? - 2

    s=Socket.new(Socket::AF_INET,Socket::SOCK_STREAM,0)s.connect(Socket.pack_sockaddr_in('port','hostname'))ssl=OpenSSL::SSL::SSLSocket.new(s,sslcert)ssl.connect从这里开始,如果ssl连接和底层套接字仍然是ESTABLISHED,或者它是否在默认值7200之后进入CLOSE_WAIT,我想检查一个线程几秒钟甚至更糟的是在实际上不需要.write()或.read()的情况下关闭。是用select()、IO.select()还是其他方法完成

随机推荐