Android-FCM推送集成与对接JPush通道的踩坑过程

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,这一期就此完结。

相关推荐
MiyamuraMiyako42 分钟前
从 0 到发布:Gradle 插件双平台(MavenCentral + Plugin Portal)发布记录与避坑
android
NRatel1 小时前
Unity 游戏提升 Android TargetVersion 相关记录
android·游戏·unity·提升版本
叽哥4 小时前
Kotlin学习第 1 课:Kotlin 入门准备:搭建学习环境与认知基础
android·java·kotlin
风往哪边走4 小时前
创建自定义语音录制View
android·前端
用户2018792831674 小时前
事件分发之“官僚主义”?或“绕圈”的艺术
android
用户2018792831674 小时前
Android事件分发为何喜欢“兜圈子”?不做个“敞亮人”!
android
Kapaseker6 小时前
你一定会喜欢的 Compose 形变动画
android
QuZhengRong6 小时前
【数据库】Navicat 导入 Excel 数据乱码问题的解决方法
android·数据库·excel
zhangphil7 小时前
Android Coil3视频封面抽取封面帧存Disk缓存,Kotlin(2)
android·kotlin
程序员码歌14 小时前
【零代码AI编程实战】AI灯塔导航-总结篇
android·前端·后端