跳转至

FCM

准备工作

首先,要有个 Google 开发者账号,然后登录到 Firebase 控制台创建 Firebase 项目,如下图:

avatar

1、如果已经有一个与您的移动应用关联的现有 Google 项目(之前集成过 GCM),请点击 Import Google Project。 否则,请点击 Create New Project。

2、创建之后,点击 Add Firebase to your Android app 并按设置步骤进行操作。如果在导入现有 Google 项目,这可能是自动进行的,您只需下载配置文件即可。

image

3、出现提示时,输入您的应用的包名称。输入您应用使用的包名称十分重要。只有当您将一个应用添加至您的 Firebase 项目时才能进行此设置。 4、最后,您将下载一个 google-services.json 文件。您可以随时重新下载此文件。 5、最后将下载的 json 文件 copy 到你的 App 的目录下。

上述步骤之后,你可以进入 project setting,之后点击 CLOUD MESSAGING 查看 Server key,将它设置到融云开发者平台上 FCM 密钥配置中

avatar

avatar

接入流程

导入 SDK

首先在根级别的 build.gradle 文件添加一条规则。以包含 Google 服务插件

// ...
dependencies {
    // ...
    classpath 'com.google.gms:google-services:4.2.0'
}

然后在模块 Gradle 文件(通常是app/build.gradle)中,添加 firebase 依赖

apply plugin: 'com.android.application'

android {
  // ...
}

dependencies {
  // ...
  api 'com.google.android.gms:play-services:12.0.1'
  api 'com.google.firebase:firebase-messaging:17.6.0'
}

之后再你 app module 下最后一行加入下面一句,底部 添加 apply plugin 行,以启用 Gradle 插件:

// ADD THIS AT THE BOTTOM
apply plugin: 'com.google.gms.google-services'

需要注意的是该 build.gradle 文件和之前下载的 google-services.json 文件应该处于同一个目录下面。

如果 AndroidStudio 版本是 2.2+ 的话,则可以通过 Tools->Firebase. 点击 Cloud Messaging->set up Firebase Cloud Messaging. 之后从准备工作步骤 2 开始集成。不要忘了api 'com.google.android.gms:play-services:12.0.1'

添加配置文件

在你 App 下的 AndroidManifest.xml 中加入

	<!-- [START firebase_service] -->
    <meta-data
      android:name="firebase_messaging_auto_init_enabled"
      android:value="false" />
    <meta-data
      android:name="firebase_analytics_collection_enabled"
      android:value="false" />

    <service
      android:name="io.rong.push.platform.google.RongFirebaseMessagingService"
      android:stopWithTask="false"
      android:exported="false">
           <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
     </service>
     <!-- [END firebase_service] -->
启用推送服务

在调用融云初始化 API (即 RongIM.init() 或 RongIMClient.init()) 之前,将 PushConfig 里的 FCM 开关打开。如果没有 PushConfig 对象,则需要新建一个,并进行相应配置。

PushConfig config = new PushConfig.Builder()
        .enableMiPush("", "") //配置小米推送
        .enableHWPush(true)  // 配置华为推送
        .enableFCM(true) //配置 FCM 推送
        .build();
RongPushClient.setPushConfig(config);
RongIM.init(this);
通知栏点击事件

当收到推送时会回调 io.rong.push.platform.google.RongFirebaseMessagingService#onMessageReceived 方法

在以上方法中会发送广播并触发继承 PushMessageReceiver 类的 onNotificationMessageArrived 方法。 当 onNotificationMessageArrived 回调返回 false 时,会产一条融云生成的通知栏消息。

当点击该通知时会触发 发继承 PushMessageReceiver 类的 onNotificationMessageClicked 方法。

在此方法中的参数 PushNotificationMessage 中可以获得以下信息

String pushId;    //对应推送消息的唯一Id,如果是消息转push,则为消息的uid
RongPushClient.ConversationType conversationType;  //会话类型
String objectName;  // 消息类型:RC:Txt RC:Img ...
String senderId;  // 发送者ID
String senderName; // 发送者名称
Uri senderPortrait;  //发送者头像地址
String targetId;        // 目标Id。ex: 群里的某人发了一条消息,则targetId为群Id,senderId为群里的这个用户的Id。
String targetUserName;  //目标名字。
String toId; //该推送的目标用户。
String pushTitle;  //推送消息的标题
String pushContent; //推送消息内容
String pushData;    // 客户端发送push消息时的附加字段
String isFromPush;  //是push消息时为true, 后台消息时为false
PushSourceType sourceType; //推送来源。

当重写 onNotificationMessageClicked 返回 false 时, SDk 会以以下 action 进行跳转 Activity

rong://【你的 ApllicationId】/conversation/private?targetId=【目标 targetId】&title=【推送标题】&isFromPush=true

当在 AndroidManifest.xml 中,您的会话界面 Activity 中加入 Intent-filter 进行拦截即可跳转

<activity
    android:name="您的会话界面 Activity">

    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data
            android:host="你的 ApllicationId"
            android:path="/conversation/"
            android:scheme="rong" />
    </intent-filter>
</activity>
异常处理

和 HMS 相似。您可以在自定义的继承自 PushMessageReceiver 的广播接收器中,复写如下事件来捕捉推送异常事件。

参数说明:

参数 类型 必填 说明
pushType PushType push类型
action String 当前的操作,连接或者获取token
resultCode long 返回的错误码

代码示例:

     @Override
     public void onThirdPartyPushState(PushType pushType, String action, long resultCode) {
         super.onThirdPartyPushState(pushType, action, resultCode);
     }

当 pushType 为 PushType.GOOGLE_FCM 时, 您可根据 resultCode 到 com.google.android.gms.common.ConnectionResult 中查看错误码具体含义,根据需要,选择是否弹出对话框提醒用户安装对应环境等。

至此,FCM 推送集成完毕。

混淆脚本

-dontwarn com.xiaomi.mipush.sdk.**
-keep public class com.xiaomi.mipush.sdk.* {*; }
-keep public class com.google.firebase.* {*;}