use*_*041 7 android firebase firebase-cloud-messaging
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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
App Gradle:
compile 'com.google.firebase:firebase-messaging:10.2.6'
Run Code Online (Sandbox Code Playgroud)
表现:
<service android:name="communications.FCMService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
Run Code Online (Sandbox Code Playgroud)
- 我从FCM控制台发送消息但没有到达.发送消息时,FCM控制台显示确定.
-I从java服务器发送消息,消息不到.发送消息时,Java服务器显示OK.
- 发送消息我在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
Run Code Online (Sandbox Code Playgroud)
似乎消息到达服务但没有显示.
当然,我不在日志中使用任何过滤器来检查消息是否到达onMessageReceived
我发现类似的问题在这里没有回答,有相同的日志:
在查看整个日志详细信息之后,我看到当我发送消息时发生以下Firebase错误:
D / FirebaseMessaging: Unknown intent action: com.google.firebase.MESSAGING_EVENT
Run Code Online (Sandbox Code Playgroud)
我的问题的解决方案在这里:
我在使用旧版本的FCM时遇到了一个问题,即10.2.6未知的意图操作:com.google.firebase.MESSAGING_EVENT
Jac*_*1re 13
从某个地方发送的消息需要具有数据有效负载且没有通知负载,或者它们不会在MessagingService中的"onMessageReceived"内一致地到达.
通知消息包含一组预定义的用户可见键.相反,数据消息仅包含用户定义的自定义键值对.通知消息可以包含可选的数据有效负载.
("Notification messages can contain an optional data payload"如果您的应用程序位于前台,这只会提交给您的服务!)
从控制台创建的消息将始终是通知消息!
您无法发送明文数据消息,这些消息将始终通过firebase-console到达您的服务.这只能通过REST-API(FCM协议)或Admin SDK实现.
更重要的是:
如果您发送带有数据有效负载的通知消息,您必须处理,如果应用程序位于前台,您必须通过服务处理它,还必须从您的Launch-Activity将接收的Intent中收集数据,这将是如果用户点击通知,则打开!数据有效负载将在意图内!
通知消息和数据消息.
通知消息包含一组预定义的用户可见键.通知消息具有可选的通知有效负载,并将传递到用户系统托盘.
如果应用程序位于前台,则onMessageReceived如果通知具有数据有效负载,则它们将调用.
如果应用程序是后台应用程序,则将显示通知,并通过启动活动的意图给出数据有效负载.
如果通知没有可选的数据有效负载,则会显示通知,并在单击时打开应用程序.
数据消息仅包含用户定义的自定义键值对.(如下所述).如果您希望消息始终调用onMessageReceived,则它们不应包含通知有效负载,而应包含数据有效负载.
来自文档:
客户端应用程序负责处理数据消息.数据消息只有自定义键值对.(!再一次 - 只有自定义键值对)
您可以在此处阅读有关消息类型的信息:Fcm消息类型
数据有效负载是一个简单的json条目,另外在您的有效负载中,可以有简单的键值对.
例:
"data": {
"eventId" : "1",
"flavors" : "alpha",
"minFcmVersion" : "3",
"showFallbackOnLowVersion" : "false"
}
Run Code Online (Sandbox Code Playgroud)
在控制台内部,如果在"扩展选项"字段下面输入内容,则可以添加数据有效负载:
从控制台创建的消息将始终是通知消息!
首先,通过控制台直接向您的设备发送firebase云消息(使用fcm令牌)并添加带有示例值的简单数据负载.现在检查是否调用了onMessageReceived服务.(你的app必须在前台!)
后端
使用REST API,您可以发送仅包含自定义键值对的数据消息,并始终提供给您的服务!
您的后端应该组成消息本身并添加数据有效负载.这在某种程度上描述了:HTTP协议数据有效载荷
您还可以通过在线找到的几个http请求构建器之一测试后端明智的发送消息.我喜欢:hurl.it和
Post 至:
顺便说一句:'com.google.firebase:firebase-messaging:11.0.4'现在出去了.较低版本中存在错误.
这里更好的阅读文档:接收消息文档 和作为SOF的消息类型的一个很好的解释答案:SOF - 答案 - 消息类型
| 归档时间: |
|
| 查看次数: |
7185 次 |
| 最近记录: |