1、什么是firebase
Firebase是一家实时后端数据库创业公司,它能帮助开发者很快的写出Web端和移动端的应用。自2014年10月google收购Firebase以来,用户可以在更方便地使用Firebase的同时,结合Google的云服务。
2、这篇文章主要讲述一下自己使用firebase cloud message 经历。
正题:因为FCM使用了Google服务,所以需要科学上网。
1、登陆 https://firebase.google.com/ 进入firebase网站首页。登陆用户(使用的Google账户)
2、创建项目
![](https://img.haomeiwen.com/i10035622/faecca05c59e8c99.png)
输入项目名称,会自动生成项目ID,这个id可以在创建后无法修改
2、添加android app
创建成功后进入主页面
![](https://img.haomeiwen.com/i10035622/8e619dcbcfed71e0.png)
点击需要添加的app。可以是ios,android,和web
我使用的是android app。点击后进入下面的画面。
![](https://img.haomeiwen.com/i10035622/655591300b1d0a3b.png)
第一个输入安卓程序的package name。在build.gradle中可以看到安卓应用的package name。
第二个是nickname,属于可填项。指定后,整个firebase会使用该名称表示此应用,对用户不可见。
第三个是调试证书,可填项。
我这边只填了package name
3、下载json文件
注册后进入下一个页面。下载json文件
添加到安卓程序中。
放在app/src/debug文件中。
![](https://img.haomeiwen.com/i10035622/e137743687f39a73.png)
添加firebase的sdk
![](https://img.haomeiwen.com/i10035622/d197e746d3b878e7.png)
至此。完成了基本的配置。编码完成后,可以在网页上向手机发送通知。
注:我在使用的时候发现这两行并不够用。
需要在project build.gradle 中的 dependencies
添加
compile'com.google.firebase:firebase-messaging:11.0.4'
compile'com.firebase:firebase-jobdispatcher:0.6.0'
可能版本有更新。
在app-module build.gradle最下面添加
apply plugin: 'com.google.gms.google-services'
这个需要使用到上面下载的json文件。需要放对文件的位置,否则会报错。
编码部分:
需要3个文件。第一个,继承 FirebaseInstanceIdService 。
这个类中的onTokenRefresh方法是在token更新的时候会触发。
使用FirebaseInstanceId.getInstance().getToken()
可以获得token
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService{
private static final String TAG = "MyFirebaseIIDService";
@Override
public void onTokenRefresh() {
super.onTokenRefresh();
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
PrefUtils.writeString(getApplicationContext(), Configs.TOKEN, refreshedToken);
sendRegistrationToServer(refreshedToken);
}
private void sendRegistrationToServer(String refreshedToken) {
}
}
第二个: 继承 JobService
public class MyJobService extends JobService {
private static final StringTAG ="MyJobService";
@Override
public boolean onStartJob(JobParameters jobParameters) {
Log.d(TAG, "Performing long running task in scheduled job");
return false;
}
@Override
public boolean onStopJob(JobParameters jobParameters) {
return false;
}
}
第三个:继承 FirebaseMessagingService
这个类主要处理消息接收, onMessageReceived在下面测试时会结合测试数据说明
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final StringTAG ="MyFirebaseMsgService";
@Override
public void onCreate() {
super.onCreate();
}
/** 接收到通知后,会进行这个方法的调用
* Called when message is received.*
* @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
*/
// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
// TODO(developer): Handle FCM messages here.
Log.d(TAG, "From: " + remoteMessage.getFrom());
if (remoteMessage.getData().size() >0) {
Log.d(TAG, "Message data payload: " + remoteMessage.getData());
if (/* Check if data needs to be processed by long running job */ true) { //需要进行耗时操作
// For long-running tasks (10 seconds or more) use Firebase Job Dispatcher.
scheduleJob();
} else { //可以直接进行的操作
// Handle message within 10 seconds
handleNow();
}
}
// Check if message contains a notification payload.
if (remoteMessage.getNotification() !=null) {
Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
sendNotification(remoteMessage.getNotification().getBody());
//push通知的消息接收,处理可以在这下面写
}
}
/**
* Schedule a job using FirebaseJobDispatcher.
*/
private void scheduleJob() {
// [START dispatch_job]
FirebaseJobDispatcher dispatcher =new FirebaseJobDispatcher(new GooglePlayDriver(this));
Job myJob = dispatcher.newJobBuilder().setService(MyJobService.class).setTag("my-job-tag").build();
dispatcher.schedule(myJob);
// [END dispatch_job]
}
/**
* Handle time allotted to BroadcastReceivers.
*/
private void handleNow() {
Log.d(TAG, "Short lived task is done.");
}
/** 这个方法主要就是用于发送push通知
* Create and show a simple notification containing the received FCM message.*
* @param messageBody FCM message body received.
*/
private void sendNotification(String messageBody) {
Intent intent =new Intent(this, MessageListActivity_.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 , intent, PendingIntent.FLAG_ONE_SHOT);
String channelId = getString(R.string.default_notification_channel_id);
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder =new NotificationCompat.Builder(this,channelId)
.setSmallIcon(R.drawable.ic_stat_ic_notification)
.setContentTitle(getString(R.string.fbmContentTitle))
.setContentText(messageBody)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 , notificationBuilder.build());
}
}
第三个文件中的 onMessageReceived 方法。就是接收到消息后执行的代码。
在mainiftest文件中加入服务
<meta - data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_stat_ic_notification" />
<meta - data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/colorAccent" />
<meta - data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/default_notification_channel_id"/>
<service android:name=".firebasemessage.MyFirebaseMessagingService">
<intent-filter >
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<service>
<intent-filter>
<action android:name=".firebasemessage.MyFirebaseInstanceIDService">
</intent-filter>
</service>
<service android:name=".firebasemessage.MyJobService" android:exported="false">
<intent-filter>
<action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
</intent-filter>
</service>
也需要加上联网权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
至此。push通知已经完成了。
接下来介绍一下如何测试。
登陆之前的网站。
选中自己的项目
![](https://img.haomeiwen.com/i10035622/db7e4e7c4b8a17c0.png)
点击左侧grow中的notificaitons
之后就可以新建message了
![](https://img.haomeiwen.com/i10035622/376bd60ed41332fa.png)
第一个是消息的内容。第二个是消息标签
主要是下面的target
选择了第三个single device
然后输入token 就可以给自己的测试机发送消息。
这个token需要
FirebaseInstanceId.getInstance().getToken()
来获得
![](https://img.haomeiwen.com/i10035622/29658b19f438bf68.png)
点击advanced option 展开上面的这个画面。
其中custom data 会以 map<string, string>的形式发送给手机。
当然也可以直接把数据放在最开始的Message text中。
public void onMessageReceived(RemoteMessage remoteMessage) {
// TODO(developer): Handle FCM messages here.
Log.d(TAG, "From: " + remoteMessage.getFrom());
if (remoteMessage.getData().size() >0) {
Log.d(TAG, "Message data payload: " + remoteMessage.getData());
if (/* Check if data needs to be processed by long running job */ true) { //需要进行耗时操作
// For long-running tasks (10 seconds or more) use Firebase Job Dispatcher.
scheduleJob();
} else { //可以直接进行的操作
// Handle message within 10 seconds
handleNow();
}
}
// Check if message contains a notification payload.
if (remoteMessage.getNotification() !=null) {
Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
sendNotification(remoteMessage.getNotification().getBody());
//push通知的消息接收,处理可以在这下面写
}
}
在这个方法中,remoteMessage.getData()
接收到的就是custom data。是一个Map<string,string>类型
remoteMessage.getNotification().getBody()
接收到的就是第一个 Message text
至此就完成了测试
最后再说几点。如果没有办法收到通知,需要查看自己的手机是否能够正常接收通知,我实用的oppo手机有一个显示通知的设置,默认全部不现实,需要开启以后才能显示。安卓各个牌子手机都不太一样,具体需要自己再测试一下。
(完)
网友评论