美文网首页
firebase cloud message 使用

firebase cloud message 使用

作者: lambentlight | 来源:发表于2018-01-22 16:36 被阅读0次

1、什么是firebase

Firebase是一家实时后端数据库创业公司,它能帮助开发者很快的写出Web端和移动端的应用。自2014年10月google收购Firebase以来,用户可以在更方便地使用Firebase的同时,结合Google的云服务。

2、这篇文章主要讲述一下自己使用firebase cloud message 经历。


正题:因为FCM使用了Google服务,所以需要科学上网。

1、登陆 https://firebase.google.com/ 进入firebase网站首页。登陆用户(使用的Google账户)

2、创建项目

image

输入项目名称,会自动生成项目ID,这个id可以在创建后无法修改

2、添加android app

创建成功后进入主页面

image

点击需要添加的app。可以是ios,android,和web

我使用的是android app。点击后进入下面的画面。

image

第一个输入安卓程序的package name。在build.gradle中可以看到安卓应用的package name。

第二个是nickname,属于可填项。指定后,整个firebase会使用该名称表示此应用,对用户不可见。

第三个是调试证书,可填项。

我这边只填了package name

3、下载json文件

注册后进入下一个页面。下载json文件

添加到安卓程序中。

放在app/src/debug文件中。

image

添加firebase的sdk

image

至此。完成了基本的配置。编码完成后,可以在网页上向手机发送通知。

注:我在使用的时候发现这两行并不够用。

需要在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通知已经完成了。


接下来介绍一下如何测试。
登陆之前的网站。
选中自己的项目

image

点击左侧grow中的notificaitons

之后就可以新建message了


第一个是消息的内容。第二个是消息标签
主要是下面的target
选择了第三个single device
然后输入token 就可以给自己的测试机发送消息。
这个token需要
FirebaseInstanceId.getInstance().getToken()
来获得

点击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手机有一个显示通知的设置,默认全部不现实,需要开启以后才能显示。安卓各个牌子手机都不太一样,具体需要自己再测试一下。

(完)

相关文章

网友评论

      本文标题:firebase cloud message 使用

      本文链接:https://www.haomeiwen.com/subject/zqalaxtx.html