FCM服务:
public class FCMService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.i(Constants.TAG,"onMessageReceived");
Log.i(Constants.TAG, "From: " + remoteMessage.getFrom());
if (remoteMessage.getData().size() > 0) {
Log.d(Constants.TAG, "Message data payload: " + remoteMessage.getData());
}
if (remoteMessage.getNotification() != null) {
Log.d(Constants.TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
}
}
}
App Gradle:
compile 'com.google.firebase:firebase-messaging:10.2.6'
清单:
<service android:name="communications.FCMService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
- 我发送消息from FCM console但没有到达。发送消息时,FCM控制台显示确定。
-I从java服务器发送消息,消息不到。发送消息时,Java服务器显示正常。
- 发送消息我在Android设备中使用生成的令牌。
- 之前,我错误地导入FCM库,错误已解决。每次发送邮件时发生过去的错误,Android上都会发生异常。现在没有收到任何东西。
- 我在Android设备上有一个Internet连接,我通过GCM(而不是FCM)从我过去实现的另一个应用程序接收消息。
-App在前台。
某些日志带有“fcm”过滤器。我发送消息时会收到此日志。
08-14 12:09:25.640 800-4739/? D/PowerManagerService: acquireWakeLockInternal: lock=862109980, flags=0x1, tag="wake:bidsy.app.bidsy/communications.FCMService", ws=null, uid=10354, pid=24073
08-14 12:09:25.640 800-4739/? D/PowerManagerNotifier: onWakeLockAcquired: flags=1, tag="wake:bidsy.app.bidsy/communications.FCMService", packageName=bidsy.app.bidsy, ownerUid=10354, ownerPid=24073, workSource=null
08-14 12:09:25.683 24073-24073/bidsy.app.bidsy D/ActivityThread: SVC-Creating service: CreateServiceData{token=android.os.BinderProxy@1c269013 className=communications.FCMService packageName=bidsy.app.bidsy intent=null}
08-14 12:09:25.683 24073-24073/bidsy.app.bidsy D/ActivityThread: SVC-CREATE_SERVICE handled : 0 / CreateServiceData{token=android.os.BinderProxy@1c269013 className=communications.FCMService packageName=bidsy.app.bidsy intent=null}
08-14 12:09:25.685 24073-24073/bidsy.app.bidsy D/ActivityThread: SVC-SERVICE_ARGS handled : 0 / ServiceArgsData{token=android.os.BinderProxy@1c269013 startId=1 args=Intent { act=com.google.firebase.MESSAGING_EVENT pkg=bidsy.app.bidsy cmp=bidsy.app.bidsy/communications.FCMService (has extras) }}
08-14 12:09:25.684 24073-24073/bidsy.app.bidsy D/ActivityThread: SVC-Calling onStartCommand: communications.FCMService@3e035250, flags=0, startId=1
08-14 12:09:25.691 800-1592/? D/PowerManagerService: releaseWakeLockInternal: lock=862109980 [wake:bidsy.app.bidsy/communications.FCMService], flags=0x0, total_time=52ms
08-14 12:09:25.691 800-1592/? D/PowerManagerNotifier: onWakeLockReleased: flags=1, tag="wake:bidsy.app.bidsy/communications.FCMService", packageName=bidsy.app.bidsy, ownerUid=10354, ownerPid=24073, workSource=null
08-14 12:09:25.692 24073-24073/bidsy.app.bidsy D/ActivityThread: SVC-Destroying service: communications.FCMService@3e035250
似乎消息到达服务但未显示。
当然我不会在日志中使用任何过滤器来检查消息是否到达onMessageReceived
我发现类似的问题在这里没有回答,有相同的日志:
Can't receive the push notification message
仔细查看整个日志后,我看到发送邮件时发生以下Firebase错误:
D / FirebaseMessaging: Unknown intent action: com.google.firebase.MESSAGING_EVENT
我的问题的解决方法就在这里:
答案 0 :(得分:11)
从某个地方发送的消息需要具有数据有效负载和无通知有效负载,否则他们将无法一致 < / em>&#34; onMessageReceived&#34;在MessagingService中。
通知消息包含一组预定义的用户可见键。相反,数据消息仅包含用户定义的自定义键值对。通知消息可以包含可选的数据有效负载。
("Notification messages can contain an optional data payload"
,如果您的应用程序位于前台,这只会提交给您的服务!)
从控制台创建的消息将始终是通知消息!
您无法发送普通数据消息,这些消息将始终通过firebase-console到达您的服务。这只能通过REST-API (FCM protocols)或Admin SDK进行。
更重要的一点是:
如果您发送带有数据有效负载的通知消息,那么必须不仅可以通过服务处理,如果应用程序位于前台,还可以从< strong>如果用户点击通知,意图将启动您的启动活动,这将打开!数据有效负载将在意图内!
通知消息和数据消息。
通知消息包含一组预定义的用户可见键。通知消息具有可选的通知有效负载,并且将是 传送到用户系统托盘。
如果应用程序位于前台,如果通知具有数据有效负载,则会调用onMessageReceived
。
如果应用程序是后台应用程序,则会显示通知,并通过启动活动的意图提供数据有效负载。
如果通知没有可选的数据有效负载,则会显示通知,并在单击时打开应用程序。
数据消息仅包含用户定义的自定义键值对。 (如下所述)。如果您希望消息始终调用onMessageReceived,则它们不应包含通知有效负载,而应包含数据有效负载。
来自文档:
客户端应用程序负责处理数据消息。数据消息 只有自定义键值对。 (!再一次 - 只有自定义键值对)
您可以阅读此处:Fcm Message Types
的消息类型数据有效负载是一个简单的json条目,另外在您的有效负载中 并且可以有简单的键值对。
示例:
"data": {
"eventId" : "1",
"flavors" : "alpha",
"minFcmVersion" : "3",
"showFallbackOnLowVersion" : "false"
}
在控制台内部,如果您在&#34;扩展选项&#34;下面输入某些内容,则可以添加数据有效负载。字段:
从控制台创建的消息始终是通知消息!
首先,通过控制台发送firebase云消息,直接发送给您 device(使用fcm标记)并添加带有示例值的简单数据有效负载。 现在检查是否调用了onMessageReceived服务。 (你的app必须在前台!)
后端
使用REST API,您可以发送仅包含自定义键值对的数据消息,并始终提供给您的服务!
您的后端应自行编写消息并添加数据负载。 这在这里有所描述:HTTP protocol data payload
您还可以通过其中一个测试后端明智的发送消息 您在网上找到的http请求构建器。我喜欢:hurl.it和
Post
:
'com.google.firebase:firebase-messaging:11.0.4'
现在已经出局了。
较低版本中存在错误。
此处更好阅读文档:Receive Messages Documentation 作为SOF的消息类型的一个很好的解释答案:SOF - Answer - Message Types
答案 1 :(得分:0)
尝试以下案例
确保您的java服务器代码顺序正确,例如
HttpResponse response = Unirest.post(“https://fcm.googleapis.com/fcm/send”) .header(“授权”,“key = your_firebase_key”) .header(“content-type”,“application / json”) .header(“缓存控制”,“无缓存”) .header(“postman-token”,“836e187a-c342-ce8a-3a2d-f541a4d8e416”) .body(“{\ r \ n \”to \“:\”your_device_token \“,\ r \ n \”data \“:{\ r \ n \”message \“:\”检查pushnotification \“\ r \ n \ N} \ r \ n \吨\ r \ N}“) .asString();