FCM的集成使用与JPsuh的通道对接
前言
省流:想要比较好的离线推送体验,如果用户中有国产设备建议开通全部厂商通道,如果没有国产设备则只需要 FCM 即可。
正文:FCM 做过海外应用的可能或多或少的知道 Firebase 云消息,用于消息推送的,海外的手机都是有 Google 服务的所以都是可以用的,但是国内的手机由于一些特殊原因,网络与服务均不支持,所以我们无法使用 FCM 功能。
那么用 FCM 就用呗跟 JPush 又有什么关系?
例如我们的应用之前是国内的,一直用 JPush 现在要上香港市场,那香港市场的设备有些是海外版有些是国内买的设备,那么如何保证推送的到达率?
全部用 JPush ? 全部用 FCM ?都不能达到这个效果,所以只要有国产设备我们就要做厂商推送通道。
这样的效果就是在线推送走的推送平台例如 JPush 离线推送走的厂商通道,从而达到推送尽可能覆盖的效果。
关于厂商推送大家应该没什么问题,下载各厂商的 SDK 申请对应的 APID 即可,相对比较简单。
而 FCM 可能有些人就不太了解,这里就拿出来单独说说。
一、FCM 的单独集成与使用
FCM 的推送与其他的厂商通道有区别,FCM 是可以单独集成到后台服务器的也可以单独使用的。
FCM Android 端集成官网【传送门】
总的来说如果只是客户端集成的话,比极光推送还要简单。
第一步 Firebase 创建应用 ,下载对应的google-josn文件放到app目录 【传送门】
应用创建完毕大概是这样一个效果:
下载到项目app目录是这样的
**第二步添加依赖 **加入 FCM 的依赖与 google-services 服务
在项目下的 build.gradle 中添加如下代码:
scss
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
...
classpath("com.google.gms:google-services:4.3.14")
}
}
app 的 build.gradle 中添加 FCM 依赖
arduino
implementation 'com.google.firebase:firebase-messaging:23.2.1'
第三步添加服务 添加接收消息的 Service 并在清单文件注册
kotlin
class ExampleFCMService : FirebaseMessagingService() {
override fun onNewToken(token: String) {
super.onNewToken(token)
// FCM生成的令牌,可以用于标识用户的身份
}
override fun onMessageReceived(message: RemoteMessage) {
super.onMessageReceived(message)
// 接收到推送消息时回调此方法
}
清单文件中配置一些属性
xml
<application>
...
<!-- FCM 配置 -->
<service
android:name=".fcm.ExampleFCMService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<!-- 设置自定义默认图标。当没有为传入通知消息设置图标时使用此选项.(选填)-->
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@mipmap/ic_launcher" />
<!-- 设置传入通知消息使用的颜色。当没有为传入设置颜色时使用此选项 (选填) -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/transparent" />
</application>
这样就可以推送了,我们可以在 Firebase 后台创建推送消息
我们可以根据 FCM 获取到token,根据token创建推送
less
FirebaseMessaging.getInstance().getToken()
.addOnCompleteListener(new OnCompleteListener<String>() {
@Override
public void onComplete(@NonNull Task<String> task) {
if (!task.isSuccessful()) {
Log.w(TAG, "Fetching FCM registration token failed", task.getException());
return;
}
// Get new FCM registration token
String token = task.getResult();
// Log and toast
String msg = getString(R.string.msg_token_fmt, token);
Log.d(TAG, msg);
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
});
我们当然不可能每次消息都从控制台发送,如果服务端要给我们发送推送需要用到服务秘钥。
后台可以通过调用API去发送消息给客户端,这一点是由后台人员完成。
二、JPush的FCM通道
而 FCM 集成到 JPush 的通道又有所不同了。
如果我们需要集成到 JPush 的通道上,那么光有秘钥还不行,还需要下载到私钥json文件。
然后配置到极光后台:
最后也是最重要的就是集成谷歌版本JPush,并且集成到 fcm 的插件。
按道理只要集成完毕就完成了,可是事情往往没有那么简单。开发过海外应用的同学可能有些感触,谷歌的库可不敢随便升级,各种兼容冲突问题。
谷歌库与firebase的冲突,kotlin版本冲突,target的冲突,类重复冲突,简直无语。如果按照极光官方的推荐版本完全用不了。
arduino
//facebook登录 - 需要升级到V13版本
implementation 'com.facebook.android:facebook-login:13.0.0'
//Google服务-用户登录
implementation 'com.google.android.gms:play-services-auth:20.7.0'
//FireBase相关服务
implementation 'com.google.firebase:firebase-core:21.1.1'
//FireBase用户相关
implementation 'com.google.firebase:firebase-auth:20.0.0'
//谷歌广告
implementation 'com.google.android.gms:play-services-ads:22.4.0'
//FCM云消息与极光FCM插件
implementation 'com.google.firebase:firebase-messaging:23.2.1'
implementation 'cn.jiguang.sdk.plugin:fcm:5.2.2'
//JPush
implementation 'cn.jiguang.sdk:jpush-google:5.2.2' //高版本自带的 Jcore 为 4.5.0 版本
//Google页面分析跟踪
implementation 'com.google.android.gms:play-services-analytics:18.0.3'
如果按照推荐最新版本,你能编译的过?只能找相对兼容的老版本,这里推荐自用的版本。
arduino
//Google服务-用户登录
implementation 'com.google.android.gms:play-services-auth:19.2.0'
//FireBase相关服务
//core里面默认就包含analytics
implementation 'com.google.firebase:firebase-core:20.0.0'
//FireBase用户登录
implementation 'com.google.firebase:firebase-auth:20.0.0'
//谷歌广告
implementation 'com.google.android.gms:play-services-ads:20.4.0'
//FCM云消息与极光FCM插件
implementation 'com.google.firebase:firebase-messaging:23.0.5' //需要指定这个版本,不然和 core/auth 有冲突
implementation 'cn.jiguang.sdk.plugin:fcm:5.0.3'
//JPush
implementation 'cn.jiguang.sdk:jpush-google:4.8.5'
implementation 'cn.jiguang.sdk:jcore-google:4.0.0'
//Google页面分析跟踪
implementation 'com.google.android.gms:play-services-analytics:17.0.0'
当然如果你们没有用到其他的firebase库,那真的太好了,直接用最新的库即可。
加下来就能验证是否成功了,打开 Log 如果集成成功会有Log,如果没有Log,可能是 FCM 的版本不对,它的 Messageing 类中没有 getToken 这个类。
如果有上传第三方token到极光,说明集成成功了,此时 FCM 的消息就由 JPush 接管了。是的,接管了,你自定义的 FirebaseMessagingService 没用了。
极光前台的推送与 FCM 推送的区别(测试机海外版三星手机)
可以看出 FCM 的推送消息是粗体字,去极光推送前台消息有明显区别
把应用杀死之后,现在的离线推送效果是:
默认极光推送收不到推送:
集成 FCM 通道之后,可以收到离线推送:
此时我们换一个 AOSP 刷机的设备是同样的效果:
可以明显看到前台推送与离线推送的区别,一个是圆形Log,一个是方形Logo。
假如我们换国产设备安装对应的谷歌框架谷歌服务,能不能接收到 FCM 消息呢?
我试过几个设备了,有的可以有的不行,大部分不行。vivo 和 oppo 就更别想了,安心集成厂商通道吧。
多的话就不多说了。
总结
我们需要注意的是 FCM 对接了 JPush 的通道之后,自定义的 FirebaseMessagingService 方法会无法走到,那么一些依赖与 FCM 实现的功能就无法触发了,例如 twilio-voice 网络隐私电话。不知道大家做没做过类似的功能。
如果有其他第三方 SDK 或业务逻辑需要依赖 FirebaseMessagingService 做自定义的逻辑,那么就需要自己服务器集成 FCM 自行推送了。
不过总的来说,如果有很多国产手机品牌的用户,或者之前一直用 JPush 想要无痛添加一个 FCM 通道,使用 JPush 的通道方案还是蛮方便的。
如果有国产手机品牌的用户想要做到尽可能覆盖到离线推送,目前能做到的也只能是每个品牌申请推送对应的厂商通道:
我们可以通过 JPush 集成全部的厂商通道(其他推送平台类似的操作),这样在线推送走的推送平台例如 JPush 离线推送走的厂商通道,从而达到离线推送的效果。
(PS.就算申请了也不能保证是百分比到达😅)
最后还是衷心希望海内外手机厂商能统一 Android 设备推送通道,别再为难开发者了,你看看隔壁iOS,你看看人家多懂事...
好了,如果感觉本文对你有一点点的启发与帮助,还望你能点赞
支持一下,你的支持是我最大的动力啦。
如果有错漏的地方或者有不同意见的或者更好的方案,希望同学们可以在评论区指出或交流。
Ok,这一期就此完结。