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

相关推荐
Reese_Cool1 小时前
【C语言二级考试】循环结构设计
android·java·c语言·开发语言
平凡シンプル2 小时前
安卓 uniapp跨端开发
android·uni-app
elina80132 小时前
安卓实现导入Excel文件
android·excel
严文文-Chris2 小时前
【设计模式-享元】
android·java·设计模式
趋势大仙2 小时前
SQLiteDatabase insert or replace数据不生效
android·数据库
DS小龙哥2 小时前
QT For Android开发-打开PPT文件
android·qt·powerpoint
试行3 小时前
Android实现自定义下拉列表绑定数据
android·java
艾小逗3 小时前
uniapp快速入门教程,内容来源于官方文档,仅仅记录快速入门需要了解到的知识点
小程序·uni-app·app·es6
Dingdangr8 小时前
Android中的Intent的作用
android
技术无疆8 小时前
快速开发与维护:探索 AndroidAnnotations
android·java·android studio·android-studio·androidx·代码注入