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文件位置如下图所示。
并把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文件位置如下图所示:
并把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。