问题标签 [android-push-notification]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1429 浏览

android - FirebaseMessagingService onMessageReceived 在主线程上调用?

FirebaseMessagingService onMessageReceived在主线程或后台线程上调用?

0 投票
2 回答
20039 浏览

android - Firebase 云消息传递示例项目中条件“if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {”的目的是什么?

我正在实施https://github.com/firebase/quickstart-android/tree/master/messaging上提供的 Firebase Cloud Messaging 快速入门示例项目,并将其合并到我的应用程序中。在https://github.com/firebase/quickstart-android/blob/master/messaging/app/src/main/java/com/google/firebase/quickstart/fcm/MainActivity.java我可以看到以下代码块:

使用条件的目的是什么if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){}?据我了解,Build.VERSION.SDK_INT返回安装应用程序的设备的 API 级别,并且Build.VERSION_CODES.O是我在 app/build.gradle 文件中定义为要编译的 API 级别,例如:compileSdkVersion 26. 如果用户的设备的 API 级别低于compileSdkVersion我用来定义我正在编译的 SDK 版本的设备,代码是否要求不执行创建通道以显示通知的代码?我不明白这种情况的目的。顺便说一句,我正在使用 API 级别为 23 且符合预期的手机进行测试,因为我compileSdkVersion 26在我的build.gradle文件,整个代码块都没有被执行。如果您能帮助澄清这段代码的目的,我将不胜感激,当然这不是我编写的代码。我从https://github.com/firebase/quickstart-android/blob/master/messaging/app/src/main/java/com/google/firebase/quickstart/fcm/MainActivity.java拿了它,但我正在尝试去理解它。谢谢你。

0 投票
3 回答
2057 浏览

android - MyFirebaseInstanceIDService.java 中的 FirebaseInstanceId.getInstance().getToken() 未出现在日志中

我正在按照https://firebase.google.com/docs/cloud-messaging/android/client上的说明在 Android 上设置 Firebase 云消息传递客户端应用程序。我已经编辑了我的应用程序清单以包含 MyFirebaseMessagingService 和 MyFirebaseInstanceIDService 服务。我现在正在尝试访问设备注册令牌。这是我的MyFirebaseInstanceIDService.java文件的内容(从https://github.com/firebase/quickstart-android/blob/master/messaging/app/src/main/java/com/google/firebase/quickstart/fcm/MyFirebaseInstanceIDService获得的代码.java):

由于我正在使用Log.d(TAG, "Refreshed token: " + refreshedToken);,我希望在 Android Studio 中从 Android Monitor 中看到令牌,但我看不到它。你知道我需要做什么onTokenRefresh()才能调用该方法以便FirebaseInstanceId.getInstance().getToken()执行并生成令牌吗?谢谢你。

0 投票
1 回答
159 浏览

android - 错误:任务“:app:transformClassesWithJarMergingForDebug”执行失败。> 重复条目:com/google/android/gms/gcm/PendingCallback.class

该应用程序可以在 Android 6.0 的设备中正确编译,但不能在 Android 4.4.2 的手机中编译。当我尝试使用带有 Android 4.4.2 的设备从 Android Studio 2.2.3 编译项目时,我收到此错误:

在我的build.gradle文件中,我正在使用这个:

我已经Build/Clean Project按照 SergioLucas 在Error:Execution failed for task ':app:transformClassesWithJarMergingForDebug' 的建议进行了尝试,并且我还尝试在所有 Google Play 服务库中使用相同的版本,正如 Benjamin 在Android studio APK 构建错误 transformClassesWithJarMergingForDebug中所建议的那样。就我而言,两者都使用 9.8.0com.google.android.gms:play-servicescom.google.firebase:firebase-messaging没有修复错误。有任何想法吗?谢谢你。

编辑:

该应用程序可以在 Android 5.1.1、5.0.1 和 6.0 的设备上正确编译并且零问题。我仅在装有 Android 4.4.2 的测试设备上遇到此错误。查看图片错误:

在此处输入图像描述

令我感兴趣的是,该错误仅发生在 Android 4.x 中,并且所有内容都可以在 Android 5.x 和 6.x 的设备上正常编译和运行。也许我需要一个特定的库来使东西与旧版本的 Android 兼容,在这种情况下是 Android 4.x?如果您能提供任何提示来解决此错误,我将不胜感激。谢谢你。

0 投票
1 回答
354 浏览

android - CPU 和带宽密集型是否直接使用 Firebase 云消息传递发送推送通知?

据我了解,从https://console.firebase.google.com/u/0/project/[projectname]:api-project-[senderID]/notification/compose从 Firebase 撰写消息控制台发送通知时,仅来自 Google 服务器的 CPU 和带宽被消耗,因为通知是直接从 Google 服务器而不是我的服务器发送的,对吗?如果我使用 cURL 从我的服务器触发推送通知,它仍然会使用 Firebase 和 Google 服务器来发送和传递通知,并且它不会消耗我服务器的 CPU 和带宽,对吗?

我试图完全了解是否直接使用 Firebase 云消息传递而不使用 Urban Airship 等第三方解决方案发送推送通知是否会占用我服务器上的 CPU 和带宽。我不确定第三方推送通知解决方案提供的部分功能/优势是否是处理 CPU/带宽密集型任务,或者这是否是 Google 服务器在直接使用 Firebase Cloud Messaging 连接和发送推送通知时直接处理的事情。

我知道 StackOverflow 不适合引起争论的问题,尤其是关于架构和内部与第三方软件解决方案的问题,但我的问题的主要目的是知道当推送通知发送到数千台设备时谁处理 CPU 和带宽密集型工作,是谷歌服务器(Firebase Cloud Messaging 服务器),还是提供推送通知服务(如 Urban Airship)的软件公司的服务器,或者是在 Firebase Cloud Messaging 配置内置的情况下触发推送通知的服务器 -没有第三方解决方案的房子?谢谢你。

编辑:为什么以及如何推送通知(如 GCM)电池高效?包括这一段:“Android 设备与 GCM 服务器保持单一连接以侦听通知”。但是,它仍然没有回答我的问题,因为即使我知道 Firebase 云消息传递服务器负责发送推送通知,我仍然试图了解我的服务器是否根本不需要提供 CPU 功率或带宽,即使例如,如果我使用 cURL 使用 PHP cURL 函数和 cron 作业从我的服务器触发推送通知。如果我可以打个比方,想象一下通过直接从https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js导入库来使用 jQuery而不是下载 jquery.min.js 文件,然后将其放在您的服务器上。如果您使用https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js,您将使用来自 Google 服务器的资源,而不是来自您自己的服务器的资源。如果您将 jquery.min.js 下载到您的服务器,那么访问者将使用来自您自己服务器的资源,而不是来自 Google 的服务器。这是我的类比,所以对于使用 Firebase 云消息传递而没有第三方解决方案(如 Urban Airship)的推送通知,我想知道谁提供 CPU 能力和带宽,是您自己的服务器还是 Google 的服务器。谢谢你。

0 投票
3 回答
8890 浏览

php - 如何使用 php 代码向 android 发送推送通知?

我正在集成 android 推送通知在客户端工作正常。我想使用 PHP 制作服务器推送通知吗?请建议您是否知道相同的内容。

0 投票
1 回答
786 浏览

android - 无法解析 Facebook 推送通知的方法“setPushNotificationsRegistrationId(java.lang.String)”

我正在使用 Firebase Cloud Messaging 在 Android 中实现推送通知,并且我也在实现 Facebook 推送通知和 Facebook 应用内通知。

我正在按照https://developers.facebook.com/docs/push-notifications/android上的说明为 Android 设置推送广告系列。我已经在https://firebase.google.com/docs/cloud-messaging/android/client完成了有关在 Android 上设置 Firebase 云消息传递客户端应用程序的说明。

这是我的MyFirebaseMessagingService.java文件的内容:

这是为我生成错误的行:

AppEventsLogger.setPushNotificationsRegistrationId(refreshedToken);

错误是:Cannot resolve method 'setPushNotificationsRegistrationId(java.lang.String)'您可以在下图中看到它:

在此处输入图像描述

我认为 Facebook 库应该已经负责导入该方法。我compile 'com.facebook.android:facebook-android-sdk:3.23.1'在我的依赖项和compile 'com.facebook.android:notifications:1.+'. 您对可能导致此错误的原因有任何想法吗?也许我需要更新版本的 Facebook SDK?我将不胜感激任何解决此错误的提示和想法。谢谢你。

编辑1:我已经尝试过使用compile 'com.facebook.android:facebook-android-sdk:4.20.0',但我仍然看到同样的错误。

编辑 2:我在https://developers.facebook.com/docs/android/change-log-4x找到了以下信息:

4.11.0 - 2016 年 4 月 12 日 Facebook SDK 添加了 AppEventsLogger.setPushNotificationsRegistrationId和 AppEventsLogger.logPush*。

这意味着AppEventsLogger.setPushNotificationsRegistrationId在 Facebook SDK 4.11.0 之前不存在,我使用的是 Facebook SDK 3.23.1。setPushNotificationsRegistrationId()无法识别该方法是有道理的。但是为什么即使我compile 'com.facebook.android:facebook-android-sdk:4.11.0'在依赖项中使用并尝试编译应用程序,我仍然会看到相同的错误?

编辑 3:我正在检查https://developers.facebook.com/docs/reference/android/current/class/AppEventsLogger/上的文档以了解有关 AppEventsLogger 类的更多信息,我可以看到该setPushNotificationsRegistrationId(String)方法与以下描述:Sets a registration id to register the current app installation for push notifications.我用来访问此类和方法的是:import com.facebook.notifications.internal.appevents.AppEventsLogger;. 我在https://developers.facebook.com/docs/reference/android/current/class/AppEventsLogger/上没有看到任何关于最低 Facebook SDK 的限制或文档或能够使用setPushNotificationsRegistrationId()我期望的方法的附加要求从AppEventsLogger我正在使用的课程中获得。

编辑4:为了使用AppEventsLogger.setPushNotificationsRegistrationId(refreshedToken);,我需要导入import com.facebook.notifications.internal.appevents.AppEventsLogger;还是import com.facebook.AppEventsLogger;?在我的代码的其他部分,我使用了例如AppEventsLogger logger = AppEventsLogger.newLogger(getApplication());with import com.facebook.AppEventsLogger;。usingimport com.facebook.notifications.internal.appevents.AppEventsLogger;和有什么区别import com.facebook.AppEventsLogger;?谢谢你。

0 投票
2 回答
1961 浏览

android - Firebase 云消息传递中“主题消息”、“目标消息”和“用户细分”之间的区别

我想使用 Firebase Cloud Messaging 向我的应用程序的用户发送推送通知。我有两类:

  1. 国家 1
  2. 国家 2

在应用程序的设置中,用户有单选按钮来订阅国家 1 或国家 2。我已经完成了https://firebase.google.com/docs/cloud-messaging/android/client中描述的步骤,当我使用FirebaseInstanceId.getInstance().getToken(),我正在成功获取设备令牌。通过使用 Firebase 控制台的撰写消息部分,我能够向单个设备发送通知。Firebase 控制台具有三个单选按钮:

1) 用户细分 2) 主题 3) 单机

我了解如何使用设备令牌向单个设备发送消息。现在我试图完全理解“主题消息”、“目标消息”和“用户细分”之间的区别。我在https://firebase.google.com/docs/cloud-messaging/android/topic-messaging阅读以下信息:

主题消息针对吞吐量而不是延迟进行了优化。为了快速、安全地传送到单个设备或小组设备,请将消息定位到注册令牌,而不是主题。

对于我需要的东西,我认为使用“主题消息”会很方便,我将有两个主题:“国家 1”和“国家 2”,在这种情况下,用户决定订阅他们想要接收促销的国家.

“用户细分”意味着我获取一组设备令牌并将它们添加到一个细分,然后我向该细分广播推送通知,对吗?在“主题消息”的情况下,我会让用户订阅他们想要的国家,并且在我的代码中,我会有如下几行让某人订阅特定国家,对吗?:

同样,我会简单地使用unsubscribeFromTopic("country1")andunsubscribeFromTopic("country2")来取消订阅用户的主题。

如果您能告诉我我的陈述是否正确,或者您发现我误解了“主题消息”、“目标消息”和“用户细分”之间的概念差异,我将不胜感激。谢谢你。

0 投票
1 回答
829 浏览

android - Does Firebase Cloud Messaging provide a Graphical User Interface to see, manage and monitor device topic subscriptions?

I am already obtaining successfully the Firebase Cloud Messaging (FCM) device token by using FirebaseInstanceId.getInstance().getToken(). I used the following code to subscribe the client app to a topic:

I assume everything is correct but in order to confirm, I would like to have a Graphical User Interface (GUI) provided by FCM to manage, monitor and see all of the devices that are subscribed to specific topics. With the code I used, I would expect to see the topic "toronto", and at least one device subscribed to that topic, for example by showing the FCM device token.

I was reading at https://developers.google.com/instance-id/reference/server#get_information_about_app_instances how it is possible to get information about app instances to find out details about a client app instance's subscriptions, including each topic name and subscribe date, but does FCM provide a GUI to see that?

UPDATE 1:

I was able to subscribe devices to topics and unsubscribe devices from topics. But when I want to confirm/monitor that a device was subscribed successfully, I am using this for example (for privacy I changed values of keys and tokens):

I was expecting Firebase Cloud Messaging to provide a Graphical User Interface with a dashboard, charts and reports to see the topics that have been created and the list and number of devices subscribed to each of the topics, something similar to the Google Analytics reports, maybe even with maps to see where devices are subscribing from or anything visual that can help to visualize and monitor topic subscriptions. Instead, I am having to do everything with cURL with code similar to what I am showing in this UPDATE 1. I am surprised Firebase Cloud Messaging does not provide a GUI, since the tool comes from Google and they could easily provide a dashboard or something similar to Google Analytics.

0 投票
1 回答
2277 浏览

android - 使用 Firebase 云消息传递从服务器端管理主题订阅的示例 GET 请求

我在https://developers.google.com/instance-id/reference/server#get_information_about_app_instances找到了以下示例 GET 请求:

该示例中的关键是:AIzaSyZ-1u...0GBYzPu7Udno5aA. 我在哪里可以找到我的密钥,我应该在我的 GET 请求中使用的那个?我试图在https://console.developers.google.com/apis/credentials找到它,这就是我所看到的:

在此处输入图像描述

我尝试使用您在上图中看到的所有四个键,但我总是从浏览器收到此消息:

此错误是指密钥错误还是其他原因?我是否在正确的地方寻找钥匙?谢谢你。

编辑 1:我正在查看如何检查订阅了多少主题?,并且我还尝试使用在 Firebase 控制台中找到的密钥,位于“云消息传递”选项卡下。这就是我所看到的:

在此处输入图像描述

我也使用上图中的这些键尝试了 GET 请求,但我仍然看到相同的错误{"error":"MissingAuthorization"}

编辑2:我从命令行使用它:

请注意我是如何简单地复制/粘贴在“示例 GET 请求”标题下的https://developers.google.com/instance-id/reference/server#get_information_about_app_instances找到的内容。我什至没有尝试使用我自己的密钥,但我看到了同样的错误:{"error":"MissingAuthorization"}. 这是否意味着问题出在我使用的密钥上?这不是我在 Firebase 控制台中看到的吗?