FCM(FirebaseCloudMessage)简单介绍
Firebase 是 Google 的移动平台,提供了分析、数据库、消息传递和崩溃报告等功能, FCM(FirebaseCloudMessage)是用来代替已经弃用的 GCM (Google Cloud Messaging )。
FCM 接入
你可以按照上面的文档一步步接入,也可以按照Android Studio - Tools- Firebase ,然后选择Cloud Messaging,点开后有步骤提示,按步骤接入获取到google-services.json文件放到文档说明的位置即可。
FCM添加插件和依赖
在Project的 build.gradle中加入:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
classpath 'com.google.gms:google-services:4.3.3'
}
}
allprojects {
repositories {
google()
jcenter()
}
}
在Model的 build.gradle中加入:
apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'
android {
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
...
implementation 'com.google.firebase:firebase-messaging:20.0.0'
}
FirebaseCloudMessage 版本区别
版本区别主要提现在 " firebase-messaging:18.0.0 ",其中最能提现的就是通知当中是否含有图片的功能,18之前没有推送通知栏图片的功能,18之后有了相应的Api,通知栏在收到含图的通知后会自动出图,所以如果你的应用需要推送图片,还请注意一下依赖的版本。
添加消息接收类和清单文件
现在的版本较以前相对简单只需要继承FirebaseMessagingService 即可
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "MyFirebaseMessagingServ";
/**
* Notification 为空 或者 Notification 不为空且App 如果是在前台打开状态下 是会调用这个方法,但是不会主动弹出通知 需要自己添加
*
* Notification 不为空 App 如果是在后台运行 不会调用下面的这些方法 会直接弹出通知.
*
* @param remoteMessage
*/
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
Log.e(TAG, "onMessageReceived: ____________________________收到消息" );
if (remoteMessage.getNotification() != null) {
//弹出通知
showNotification(remoteMessage);
}
}
/**
* 应用首次安装注册推送id , 后台需要的话可以在这里通过网络推送给后台
* @param token
*/
@Override
public void onNewToken(String token) {
super.onNewToken(token);
Log.e(TAG, "onNewToken: _________应用首次安装注册推送id ___________________"+token );
}
}
以往的版本是需要专门写一个去继承FirebaseInstanceIdService 来表示Fcm注册成功可以接受通知了,如今是直接使用上面的 onNewToken 来接收了。( 解释其他文章可能有写到去继承)
然后清单文件配置
<!-- 通知栏显示的 应用名称字体颜色和下拉查看通知详情的箭头的颜色-->
<meta-data android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@android:color/holo_red_dark" />
<!-- 只要传入的消息未明确设置通知渠道,FCM 就会使用此值-->
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/default_notification_channel_id" />
<service android:name=".MyFirebaseMessagingService" android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
发送通知
配置完成后运行项目 (提前连接国际网)将项目运行到手机上,查看日志如果 onNewToken 方法里面的日志 将token打印出来那么表示注册成功,我们可以进行下一步的发送通知:
-
通过 Firebase 控制台推送(数据单一)
2.通过 PostMan控制台推送
推送方式的介绍:
1.根据token推向指定的设备,每一台设备在首次打开应用的时候都会注册到一个对应的唯一的token,然后我们根据这个token可以推向指定的用户。
{
"to":"App 获取到的 FCM 返回的 token",
"notification":{
... 通知栏数据
},
"data":{
....隐藏数据
}
}
2.根据topic推给一个指定的用户群,比如在项目当中有个新闻订阅功能,订阅了新闻栏目,那么我们根据topic 推送就可以专门针对这些订阅了的用户。
//项目代码订阅主题
FirebaseMessaging.getInstance().subscribeToTopic("news");
//postman 通过主题推送
{
"to":"/topics/news",
"notification":{
... 通知栏数据
},
"data":{
....隐藏数据
}
}
Notification数据简介:
"notification":{
"title":"推送标题",
"body":"推送的内容",
"color":"应用icon和下拉箭头的颜色",
"sound":"收到通知的声音",
"click_action":"通知栏点击跳转事件",
"icon":"通知栏应用icon - 本地图片",
"image":"通知栏当中图片 -网络图片"
}
清单文件配置 click_action 设置通知栏跳转页面,如果不设置默认是启动页。
// 配置click_action
<activity android:name=".PushActivity">
<intent-filter>
<action android:name="com.xxxx.push" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
推送数据对通知的影响
如果我们推送的数据 notification 对应的数据 不为空,那么我们接收消息就需要分为两种情况,前台和后台,如果App当前状态为前台,那么 onMessageReceived 方法就会被调用,后续我们自己拿到对用的数据进行通知栏的显示,如果App当前状态为后台的话 那么我们无需自己写 sdk会自己弹出。
如果我们推送的数据 notification 对应的数据为空,把所有的数据放置到data 字段里面,那么sdk不会为我们弹出通知,这时候无论App在前台还是后台都会调用 onMessageReceived ,这时候我们自己需要处理通知栏的ui 显示。这种情况一般用于自定义通知栏ui 的时候。
// 获取data 数据
Map<String, String> data = remoteMessage.getData();
Demo
demo里面含有推送消息的网络请求,下载运行可直接推送测试(需要连接国际网络)。
Demo下载地址