JPush SDK 华为通道集成指南

JPush SDK 华为通道集成指南

概述

在国内 Android 生态中,推送通道都是由终端与云端之间的长链接来维持,严重依赖于应用进程的存活状态。如今一些手机厂家会在自家 rom 中做系统级别的推送通道,再由系统分发给各个 app,以此提高在自家 rom 上的推送送达率。

JPush SDK 为了尽可能提高开发者在各类 rom 上的推送送达率,对使用 EMUI 的设备推送,自动切换到华为通道。同时,为了保证 SDK 的易用性,原本 JPush 的所有接口调用逻辑都不用修改,JPush 会对自身支持的功能做兼容.只需在manifest中配置上华为HMS SDK 必须的配置组件即可.

功能描述

  • JPush 初始化的时候可选择是否初始化 HMS Push 通道。

  • 在 EMUI 设备上 JPush 通道与 华为 通道共存.

  • 华为 通道初始化后支持 tag/alias这些 JPush 原有的功能,其它的 JPush 未支持的功能目前暂时还不可用.

  • 增加兼容华为HMS SDK初始化失败处理错误的接口.

:极光根据 EMUI 系统版本间差异,现采取的方案是 EMUI 4.1 及以上版本,使用 HMS 服务,通知走 HMS 通道;对于 EMUI 4.1 以下版本还是走极光通道。

配置集成步骤

主要步骤为:

<h3 id="1">添加 Huawei SDK 到项目中</h3>

  • 拷贝third-push/huawei/libs中的插件包(jpush-android-plugin-huawei-v3.x.x.jar)到工程libs目录下

    • 注意:也可使用jcenter集成方式,无需拷贝jpush-android-plugin-huawei-v3.x.x.jar文件,也无需配置cn.jpush.android.service.PluginHuaweiPlatformsService组件
    • 示例:implementation 'cn.jiguang.sdk.plugin:huawei:3.x.x'
  • Huawei 上创建和 JPush 上同包名的待发布应用,创建完成后下载该应用的 agconnect-services.json 配置文件并添加到应用的 module 目录下。

  • 在根级 build.gradle 中添加规则,以纳入 HMS 服务插件 和 华为 的 Maven 代码库,可根据华为开发者联盟发布的版本更新选择最新版本:


    ldscript {
        repositories {
            google()
            jcenter()
            maven {url 'http://developer.huawei.com/repo/'}
        }
    }
   buildscript {
       dependencies {
           classpath 'com.huawei.agconnect:agcp:1.0.0.300'
       }
   }
  
    allprojects {
        repositories {
            google()
            jcenter()
            maven {url 'http://developer.huawei.com/repo/'}
        }
    }

  • 在应用 module 的 build.gradle 文件底部添加 apply plugin 代码行,以启用 gradle 插件:
    // ADD THIS AT THE TOP
   apply plugin: 'com.huawei.agconnect'

  • 在应用 module 的 gradle 中 dependencies 节点添加如下代码,可根据 华为 发布的版本更新选择最新版本:
     dependencies {
       implementation 'com.huawei.hms:push:3.0.3.301'
       //引入极光-华为插件,如果采用此配置,无需拷贝jpush-android-plugin-huawei-v3.x.x.jar文件,也无需配置cn.jpush.android.service.PluginHuaweiPlatformsService组件
       implementation 'cn.jiguang.sdk.plugin:huawei:3.x.x'
              
    }

注1:极光集成华为通道在 JPush Android SDK 3.0.5 添加,对应测试的华为HMS SDK 版本为:HMS-SDK-2.4.0.300.aar

注2:JPush Android SDK 3.0.9 适配HMS SDK的升级,对应测试的华为HMS SDK 版本为:HMSSdk-base-2.5.2.300.aar,HMSSdk-push-2.5.2.300.aar

注3:JPush Android SDK 3.1.2 适配HMS SDK的升级,对应测试的华为HMS SDK 版本为:HMSSdk-base-2.5.3.302.aar,HMSSdk-push-2.5.3.302.aar

注4:从HMS_SDK_2.6.0.301版本开始支持jar包+res资源集成,JPush Android SDK 3.1.5对应测试的华为HMS SDK 版本为:HMS_SDK_2.6.0.301.jar

注5:JPush Android SDK 3.2.0 更新华为HMS SDK版本为:hmssdk_2.6.3.301.jar

注6:JPush Android SDK 3.3.6 更新华为HMS SDK版本为:hmssdk_2.6.3.306.jar

注7:JPush Android SDK 3.5.4 更新华为HMS SDK版本为:3.0.3.301

注8 添加 华为 Push SDK 的官方文档

<h3 id="2">2. 配置接收 HMS 消息的服务</h3>

     <service
                android:name="cn.jpush.android.service.PluginHuaweiPlatformsService"
                android:exported="false">
                <intent-filter>
                    <action android:name="com.huawei.push.action.MESSAGING_EVENT" />
                </intent-filter>
            </service

<h3 id="3">3. 在build.gradle中配置在华为后台添加的指纹证书对应的签名</h3>

:HMS 服务必须要求 app 签名才能注册成功。指纹证书是在终端采用keytool -list -v -keystore keystorefileName 获取偶对应的指纹证书.

    signingConfigs {
        release {
            storeFile file("release.keystore")//签名文件的path
            storePassword "123456"
            keyAlias "android.keystore"
            keyPassword "123456"
        }
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        debug{
            minifyEnabled false
            signingConfig signingConfigs.release
        }
    }

HMS SDK的编译混淆问题

如果使用了 proguard,需要在配置文件中加入,可以防止一个误报的 warning 导致无法成功编译,

    -ignorewarning 
    -keepattributes *Annotation* 
    -keepattributes Exceptions 
    -keepattributes InnerClasses 
    -keepattributes Signature 
    -keepattributes SourceFile,LineNumberTable 
    -keep class com.hianalytics.android.**{*;} 
    -keep class com.huawei.updatesdk.**{*;} 
    -keep class com.huawei.hms.**{*;}

点击通知跳转 Activity

功能说明

支持的版本

此功能从 JPush Android SDK 3.0.9 开始支持

华为手机通知跳转的定义

华为 push 允许开发者在推送通知的时候传入自定义的 intent uri 字符串,当用户点击了该通知,系统会根据 uri 的值过滤出匹配的 Activity ,并打开 Activity,达到跳转的目的。

使用方式

Push API 推送说明

在 push api 的 payload 中的 "notification" 的 "android" 节点下添加以下字段:

<div class="table-d" align="center" >
<table border="1" width = "100%">
<tr bgcolor="#D3D3D3" >
<th >关键字</th>
<th >类型</th>
<th >示例</th>
<th >说明</th>
</tr>
<tr >
<td>uri_activity</td>
<td>string</td>
<td>"com.example.jpushdemo.OpenClickActivity"</td>
<td>该字段用于指定开发者想要打开的 activity,值为activity 节点的 “android:name ” 属性值。</td>
</tr>
</table>
</div>

示例:

demo manifest配置:
<activity android:name="com.example.jpushdemo.OpenClickActivity"
      android:exported="true">
      <intent-filter>
           <action android:name="android.intent.action.VIEW"/>
           <category android:name="android.intent.category.DEFAULT"/>
      </intent-filter>
</activity>

请求json如下:
{
    "platform": [
        "android"
    ],
    "audience": "all",
    "notification": {
        "android": {
            "alert": "在线alert003",
            "title": "在线title003",
            "uri_activity": "com.example.jpushdemo.OpenClickActivity",
        }
    },
    "message": {
        "msg_content": "自定义消息内容003"
    }
}

SDK 端配置

1.AndroidManifest.xml中配置点击通知要打开的 activity
<activity android:name="您配置的activity"
      android:exported="true">
      <intent-filter>
           <action android:name="android.intent.action.VIEW"/>
           <category android:name="android.intent.category.DEFAULT"/>
      </intent-filter>
</activity>

注: android:exported 属性必须设置为 true,并增加示例中的 intent-filter,否则会导致无法收到通知。

2.获取通知相关信息

目前启动配置的 activity 都是使用 Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK 方式启动,只需要在您配置的 activity 中的onCreate方法中进行处理,获取通知信息。

通过 getIntent().getData() 获取到Intent 数据。获取到的数据是 JSON 字符串,通过解析可以获得通知相关内容。

JSON 示例如下:

{
    "msg_id":"123456",
    "n_content":"this is content",
    "n_extras":{"key1":"value1","key2":"value2"},
    "n_title":"this is title",
    "rom_type":0
}

JSON 内容字段说明:

字段 取值类型 描述
msg_id String 通过此key获取到通知的msgid
n_title String 通过此key获取到通知标题
n_content String 通过此key获取到通知内容
n_extras String 通过此key获取到通知附加字段
rom_type byte 通过此key获取到下发通知的平台。得到值说明:byte类型的整数, 0为极光,1为小米,2为华为,3为魅族,4为oppo,5为vivo,8为FCM。

注: rom_type 用于点击事件的上报,一般情况下开发者只需要取到该字段的值用于上报,不需要关心具体取值。

3.通知点击上报

解析通知内容后,需主动调用接口来进行通知点击上报,上报接口如下:

/**
* context 上下文
* msgId 消息ID
* whichPushSDK 收到推送的平台,即 rom_type 字段的取值。
**/
JPushInterface.reportNotificationOpened(Context context, String msgId, byte whichPushSDK);

注: 点击上报必须传入正确的 whichPushSDK 参数,否则会造成统计数据错误。

4.富媒体调整

在 AndroidManifest.xml 中将 PushActivity、PopWinActivity 的 android:exported="false" 属性修改为 true,否则会导致收不到富媒体推送。

5.Activity 示例代码
package com.example.jpushdemo;

import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.widget.TextView;

import org.json.JSONException;
import org.json.JSONObject;

import cn.jpush.android.api.JPushInterface;

/**
 * Created by jiguang on 17/7/5.
 */

public class OpenClickActivity extends Activity {
    private static final String TAG = "OpenClickActivity";
    /**消息Id**/
    private static final String KEY_MSGID = "msg_id";
    /**该通知的下发通道**/
    private static final String KEY_WHICH_PUSH_SDK = "rom_type";
    /**通知标题**/
    private static final String KEY_TITLE = "n_title";
    /**通知内容**/
    private static final String KEY_CONTENT = "n_content";
    /**通知附加字段**/
    private static final String KEY_EXTRAS = "n_extras";
    private TextView mTextView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mTextView = new TextView(this);
        setContentView(mTextView);
        handleOpenClick();
    }


    /**
     * 处理点击事件,当前启动配置的Activity都是使用
     * Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK
     * 方式启动,只需要在onCreat中调用此方法进行处理
     */
    private void handleOpenClick() {
        Log.d(TAG, "用户点击打开了通知");
        String data = null;
        //获取华为平台附带的jpush信息
        if (getIntent().getData() != null) {
             data = getIntent().getData().toString();
        }

        //获取fcm、oppo、vivo、华硕、小米平台附带的jpush信息
        if(TextUtils.isEmpty(data) && getIntent().getExtras() != null){
            data = getIntent().getExtras().getString("JMessageExtra");
        }

        Log.w(TAG, "msg content is " + String.valueOf(data));
        if (TextUtils.isEmpty(data)) return;
        try {
            JSONObject jsonObject = new JSONObject(data);
            String msgId = jsonObject.optString(KEY_MSGID);
            byte whichPushSDK = (byte) jsonObject.optInt(KEY_WHICH_PUSH_SDK);
            String title = jsonObject.optString(KEY_TITLE);
            String content = jsonObject.optString(KEY_CONTENT);
            String extras = jsonObject.optString(KEY_EXTRAS);
            StringBuilder sb = new StringBuilder();
            sb.append("msgId:");
            sb.append(String.valueOf(msgId));
            sb.append("\n");
            sb.append("title:");
            sb.append(String.valueOf(title));
            sb.append("\n");
            sb.append("content:");
            sb.append(String.valueOf(content));
            sb.append("\n");
            sb.append("extras:");
            sb.append(String.valueOf(extras));
            sb.append("\n");
            sb.append("platform:");
            sb.append(getPushSDKName(whichPushSDK));
            mTextView.setText(sb.toString());

            //上报点击事件
            JPushInterface.reportNotificationOpened(this, msgId, whichPushSDK);
        } catch (JSONException e) {
            Log.w(TAG, "parse notification error");
        }


    }

    private String getPushSDKName(byte whichPushSDK) {
        String name;
        switch (whichPushSDK){
            case 0:
                name = "jpush";
                break;
            case 1:
                name = "xiaomi";
                break;
            case 2:
                name = "huawei";
                break;
            case 3:
                name = "meizu";
                break;
            case 4:
                name= "oppo";
                break;
            case 5:
                name = "vivo";
                break;
            case 6:
                name = "asus";
                break;                
            case 8:
                name = "fcm";
                break;
            default:
                name = "jpush";
        }
        return name;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • 声明:该博客仅用于学习研究使用,不得用于商业用途!,如有侵权,请联系删除 首先先去Jetbrains下载软件 这里...
    通通小小通阅读 61,479评论 29 17
  • 主人因不满狗的业绩。决定让猫看管谷仓的苞米,狗只能担任警卫工作。 谷仓搬来了老鼠一家,猫因为懒惰不想驱赶...
    牧羊村的人阅读 552评论 1 2
  • 我妈妈是一个美容师,也是一个业余的理发师,修眉、绣眉、剪发、染发样样能行。我从小看着那把剪刀在妈妈手里“咔嚓咔嚓...
    lk777阅读 367评论 0 7
  • “黑夜给了我黑色的眼睛,我却用它来寻找光明。"这天才的诗句就是出自天才的顾城。论造诣他是伟大的诗人,可是现实...
    晩秋的云阅读 1,492评论 24 55