FCM推送升级


说明

  • Google官方推出了GCM的升级版通知工具FCM(Firebase Cloud Messaging),并强烈建议开发者使用FCM。
  • 新注册项目已不能使用GCM推送服务,所以新项目只能使用FCM推送功能。
  • Google官方称会继续维护GCM推送,所以SDK中仍然保留GCM推送功能,之前使用GCM推送的项目可以继续使用GCM推送。GCM相关配置详见第三方推送集成
  • 该文档中所指环信SDK Demo为SDK v3.3.5所对应官方Demo

必备条件

  • FCM 使用针对于国外用户;
  • FCM 要求设备安装有 Google Play 服务和 Google Play 商店。

继续使用GCM推送

SDK中仍然保留GCM推送相关功能,由于GCM依赖库和FCM依赖库版本必须对应(否则会出现类冲突的错误),所以需要删除libs目录下的google-play-services.jar文件,环信官方SDK demo文件位置如下图所示。

删除google-service.jar

并把compile 'com.google.android.gms:play-services-gcm:11.4.0'该行配置放在项目相应的build.gradle文件中,SDK demo中的该配置在easeui/build.gradle中,如下:

dependencies {
    // 添加此行
    compile 'com.google.android.gms:play-services-gcm:11.4.0'
}

GCM升级FCM

- 服务端

1.登录Firebase管理后台

2.在Firebase欢迎界面选择 Import Google Project

3.在项目列表中选择你的GCM项目并选择 Add Firebase

4.在Firebase欢迎界面选择 Add Firebase to your Android App

5.选择应用类型后需要输入包名、项目昵称、SHA-1,然后点击 Register App

6.进入引导页,如下图,点击按钮下载google-services.json文件到本地。注意该json文件在Android项目中的放置位置。

7.跳过引导页,点击Cloud Messaging tab页,复制Server Key和Sender ID。

8.登录环信管理后台,选择你的应用—选择推送证书—新增证书,证书的名称要求填上方复制Sender ID,证书秘钥填写上方复制的Server Key。

- 移动端

1. AndroidManifest.xml 中删除GCM相关权限配置

<!-- GCM required, remember replace "com.hyphenate.chatuidemo" to your own package -->
<!--<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />-->

<!--<permission
    android:name="com.hyphenate.chatuidemo.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />

<uses-permission android:name="com.hyphenate.chatuidemo.permission.C2D_MESSAGE" />-->

<!-- gcm start -->
<!--<receiver
    android:name="com.hyphenate.chat.EMGCMBroadcastReceiver"
    android:exported="true"
    android:permission="com.google.android.c2dm.permission.SEND">
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />

        <category android:name="com.hyphenate.chatuidemo" />
    </intent-filter>
</receiver>

<service
    android:name="com.hyphenate.chat.EMGCMListenerService"
    android:exported="false" />

<receiver
    android:name=".receiver.GCMPushBroadCast"
    android:exported="false">
    <intent-filter>
        <action android:name="com.hyphenate.sdk.push" />

        <category android:name="com.hyphenate.chatuidemo" />
    </intent-filter>
</receiver>-->
<!-- gcm end -->

2.添加Google Play Service相关依赖库

用于检查设备是否支持Google Play Service,只有支持的设备才支持Google推送服务。

删除libs目录下的google-play-services.jar文件,环信官方SDK demo文件位置如下图所示:

删除google-service.jar

并把compile 'com.google.android.gms:play-services-base:11.4.0'该行配置添加到项目相应的build.gradle文件中,SDK demo中的配置在easeui/build.gradle中,如下:

dependencies {
    // 添加此行
    compile 'com.google.android.gms:play-services-base:11.4.0'
}

注意:Google推送相关依赖库版本必须对应(该文档中均为:11.4.0),否则可能会出现类冲突的错误。

3.在project-level的build.gradle中添加FCM相关库文件配置:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        // 添加此行
        classpath 'com.google.gms:google-services:3.1.1'
    }
}

allprojects {
    repositories {
        // 添加此行
        maven { url 'https://maven.google.com' }
    }
}

4.在app-level的build.gradle中添加FCM相关库文件配置:

dependencies {
// 添加此行,Google Firebase cloud messaging
    compile 'com.google.firebase:firebase-messaging:11.4.0'
}

// 此行添加在文件末尾
apply plugin: 'com.google.gms.google-services'

注意:Google推送相关依赖库版本必须对应(该文档中均为:11.4.0),否则可能会出现类冲突的错误。

5.放置下载的google-services.json在app-level的根目录下

6.实现一个继承自FirebaseMessagingService的自定义service,该类用于FCM在后台进行接收应用推送消息的处理。并把该service注册到AndroidManifest.xml中。

自定义FirebaseMessagingService:

public class EMFCMMSGService extends FirebaseMessagingService {
    private static final String TAG = "EMFCMMSGService";

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        if (remoteMessage.getData().size() > 0) {
            String message = remoteMessage.getData().get("alert");
            Log.i(TAG, "onMessageReceived: " + message);
        }
    }
}

AndroidManifest.xml:

<service android:name=".fcm.EMFCMMSGService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

7.实现一个继承自FirebaseInstanceIdService的自定义service,该类用于监听FCM token的创建和更新。一个设备对应一个FCM token,该token用于服务端向该设备推送消息,所以该token创建或更新后需及时上传至环信服务器。

自定义FirebaseInstanceIdService:

public class EMFCMTokenRefreshService extends FirebaseInstanceIdService {
    private static final String TAG = "FCMTokenRefreshService";

    @Override
    public void onTokenRefresh() {
        super.onTokenRefresh();
        String token = FirebaseInstanceId.getInstance().getToken();
        Log.i(TAG, "onTokenRefresh: " + token);
        // Important, send the fcm token to the server
        EMClient.getInstance().sendFCMTokenToServer(token);
    }
}

AndroidManifest.xml:

<service android:name=".fcm.EMFCMTokenRefreshService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
    </intent-filter>
</service>

8.将Sender ID(即创建Google推送证书时填写的证书名称)在SDK初始化前通过options.setFCMNumber(string)接口设置到options里options.setFCMNumber(senderId)

9.使用 FCM 时需要在退出登录时解绑设备 token,调用EMClient.getInstance().logout(true)或者EMClient.getInstance().logout(true,callback)方法,如果是被踢的情况下,则要求设置为 false。

新用户集成FCM

- 服务端

1.登录Firebase管理后台

2.在Firebase欢迎界面点击 Add Project,输入相应内容并点击 Create Project

3.在Firebase欢迎界面选择 Add Firebase to your Android App

4.选择应用类型后需要输入包名、项目昵称、SHA-1,然后点击 Register App

5.进入引导页,如下图,点击按钮下载google-services.json文件到本地。注意该json文件在Android项目中的放置位置。

6.跳过引导页,点击Cloud Messaging tab页,复制Server Key和Sender ID。

7.登录环信管理后台,选择你的应用—选择推送证书—新增证书,证书的名称要求填上方复制Sender ID,证书秘钥填写上方复制的Server Key。

- 移动端

1.添加Google Play Service相关依赖库

用于检查设备是否支持Google Play Service,只有支持的设备才支持Google推送服务。

compile 'com.google.android.gms:play-services-base:11.4.0'该行配置添加到项目相应的build.gradle文件中,SDK demo中的配置在easeui/build.gradle中,如下:

dependencies {
    // 添加此行
    compile 'com.google.android.gms:play-services-base:11.4.0'
}

注意:Google推送相关依赖库版本必须对应(该文档中均为:11.4.0),否则可能会出现类冲突的错误。

2.在project-level的build.gradle中添加FCM相关库文件配置:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        // 添加此行
        classpath 'com.google.gms:google-services:3.1.1'
    }
}

allprojects {
    repositories {
        // 添加此行
        maven { url 'https://maven.google.com' }
    }
}

3.在app-level的build.gradle中添加FCM相关库文件配置:

dependencies {
// 添加此行,Google Firebase cloud messaging
    compile 'com.google.firebase:firebase-messaging:11.4.0'
}

// 此行添加在文件末尾
apply plugin: 'com.google.gms.google-services'

注意:Google推送相关依赖库版本必须对应(该文档中均为:11.4.0),否则可能会出现类冲突的错误。

4.放置下载的google-services.json在app-level的根目录下

5.实现一个继承自FirebaseMessagingService的自定义service,该类用于FCM在后台进行接收应用推送消息的处理。并把该service注册到AndroidManifest.xml中。

自定义FirebaseMessagingService:

public class EMFCMMSGService extends FirebaseMessagingService {
    private static final String TAG = "EMFCMMSGService";

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        if (remoteMessage.getData().size() > 0) {
            String message = remoteMessage.getData().get("alert");
            Log.i(TAG, "onMessageReceived: " + message);
        }
    }
}

AndroidManifest.xml:

<service android:name=".fcm.EMFCMMSGService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

6.实现一个继承自FirebaseInstanceIdService的自定义service,该类用于监听FCM token的创建和更新。一个设备对应一个FCM token,该token用于服务端向该设备推送消息,所以该token创建或更新后需及时上传至环信服务器。

自定义FirebaseInstanceIdService:

public class EMFCMTokenRefreshService extends FirebaseInstanceIdService {
    private static final String TAG = "FCMTokenRefreshService";

    @Override
    public void onTokenRefresh() {
        super.onTokenRefresh();
        String token = FirebaseInstanceId.getInstance().getToken();
        Log.i(TAG, "onTokenRefresh: " + token);
        // Important, send the fcm token to the server
        EMClient.getInstance().sendFCMTokenToServer(token);
    }
}

AndroidManifest.xml:

<service android:name=".fcm.EMFCMTokenRefreshService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
    </intent-filter>
</service>

7.将Sender ID(即创建Google推送证书时填写的证书名称)在SDK初始化前通过options.setFCMNumber(string)接口设置到options里options.setFCMNumber(senderId)

8.使用 FCM 时需要在退出登录时解绑设备 token,调用EMClient.getInstance().logout(true)或者EMClient.getInstance().logout(true,callback)方法,如果是被踢的情况下,则要求设置为 false。

推送服务测试

为了确保推送服务的成功集成,可按如下步骤进行测试,

  1. 运行app并进行登录
  2. 杀掉该app进程(通过Android任务列表滑动结束进程,不是按Home键让app进入后台)
  3. 向该登录账号发送消息,app会收到通过推送服务送达的消息