Android

集成华为推送

更新时间: 2024/04/07 15:49:14

NIM SDK 4.0.0 之后版本新增支持华为推送。

华为推送从新版 HMS 包开始采用了和小米推送相似的系统级连接方案,但是依赖于 EMUI 版本和 华为移动服务 版本,经过大量测试表明,EMUI4.1及以上并同时满足华为移动服务版本5.3.0.304 以上时比较稳定能收到推送。

本文主要介绍如何集成华为厂商的离线推送通道,使消息通过华为推送服务离线推送至未在线的用户。

集成流程

步骤 1:在华为推送服务平台创建应用并启用推送服务

若已在华为推送服务平台创建应用,则忽略该步骤。更多华为推送服务的信息请参考推送服务使用指南

  1. 华为推送服务平台 注册开发者账号并完成认证,详情请参考账号注册和认证

  2. 登录AppGallery Connect,选择我的项目 > 添加项目,然后在创建项目页面中输入项目名称,单击创建并继续

    华为添加项目.png

    华为创建应用.png

  3. 创建完项目后,在目标项目的项目设置页面单击添加应用

    华为添加应用.png

  4. 填写应用信息,完成后单击确认。(平台类型选择Android。)

    华为填写应用.png

  5. 选择目标应用,然后在左侧导航栏选择增长 -> 推送服务,单击立即开通,在弹出的提示框中单击确定

    开通推送服务.png

  6. 确认开通后,您还需要在配置页签开通精准推送服务。

  7. 单击我的项目,在项目列表中找到您的项目,选择目标应用,进入项目设置 -> 常规页面,可查看包名、APP ID、APP Secret 等应用信息。

    华为APPSECRET.png

步骤 2:在云信控制台添加华为推送证书

  1. 云信控制台首页应用管理选择应用进入应用配置页面,单击证书管理页签。

  2. Android推送证书下单击添加证书,选择证书类型为华为,配置华为推送相关信息。 华为推送.png

    云信推送证书字段对应华为应用的字段信息
    证书名称用户自定义推送证书名称,最大 32 字符
    对应初始化 NIM SDK 时需传入的推送证书信息中的 hwCertificateName
    应用包名对应华为应用的包名,最大 1000 字符
    AppID对应华为应用的 APP ID,最大 1000 字符
    AppSecret对应华为应用的 APP SECRET,最大 5000 字符
    Activity应用入口 Activity 类全路径,最大 1000 字符
  3. 根据界面提示,在该对话框内配置证书类型和证书名称等信息。

步骤 3:下载华为服务配置文件

登录AppGallery Connect我的项目,在项目列表中找到您的项目,选择目标应用,进入项目设置 -> 常规页面,在应用区域下载 agconnect-services.json配置文件。

offline_push_huawei.png

下载完成后,将已下载的 agconnect-services.json 文件添加到您的应用级根目录下。

华为配置文件.png

步骤 4:导入华为推送 SDK

将华为推送客户端 SDK 添加到您的 Android 项目。华为推送客户端 SDK 需要从华为 Maven 仓库获取。

NIM SDK 开发版和稳定版当前兼容的华为推送版本为 com.huawei.hms:push: 6.9.0.300

  1. 在项目级的 build.gradle 文件中添加如下内容,添加 HUAWEI AGC 插件以及 Maven 代码库。这里以 Gradle 插件 7.0 以下版本为例,其他版本请参见集成 HMS Core SDK 指南

    • buildscript > repositories中配置 HMS Core SDK 的 Maven 地址。如果 App 中添加了“agconnect-services.json” 文件则需要在buildscript > dependencies中增加 AGC 插件和 Android Gradle 插件配置。

      buildscript {
          repositories {
              google()
              jcenter()
              // 配置HMS Core SDK的Maven仓地址。
              maven {url 'https://developer.huawei.com/repo/'}
          }
          dependencies {
              ...
              // 增加Android Gradle插件版本号配置,{version}为实际的Gradle插件版本号,例如7.0.1。
              classpath 'com.android.tools.build:gradle:{version}'
              // 增加AGC插件配置,请您参见AGC插件依赖关系选择合适的AGC插件版本。
              classpath 'com.huawei.agconnect:agcp:1.6.0.300'
          }
      }
      
    • 在项目级settings.gradle文件,配置 HMS Core SDK 的 Maven 地址。

      dependencyResolutionManagement {
          ...
          repositories {
              google()
              jcenter() 
              // 配置HMS Core SDK的Maven仓地址。
              maven {url 'https://developer.huawei.com/repo/'}
          }
      }
      
  2. 在应用级的 build.gradle 文件中添加 Account SDK 编译依赖。

    dependencies {
        //hwid:{version}仅为举例,请替换为实际的Kit依赖版本。如:com.huawei.hms:push: 6.9.0.300。
        implementation 'com.huawei.hms:push:{version}'
    }
    
  3. 添加 AGC 插件配置。可通过以下两种方式:

    • 方式一:在文件头部声明下一行添加如下配置:
      apply plugin: 'com.huawei.agconnect'
      
    • 方式二:在plugins中添加如下配置:
      plugins {
          id 'com.android.application'
          // 添加如下配置
          id 'com.huawei.agconnect'
      }
      
  4. 完后以上配置后,完成 build.gradle 文件的同步,将相关依赖下载到本地。

步骤 5:AndroidManifest.xml 配置

app/src/main 目录中,打开AndroidManifest.xml文件,添加对应权限。

<!-- 配置权限,已配置过的条目则无须添加 -->
<!-- 相机权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 录音权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 华为消息推送权限-->
<service
    android:name="com.netease.nimlib.mixpush.hw.HWPushService"
    android:exported="false">
    <intent-filter>
            <action android:name="com.huawei.push.action.MESSAGING_EVENT" />
    </intent-filter>
</service>

步骤 6:防止代码混淆

如果您的应用使用了代码混淆,在 proguard-rules.pro 配置文件中添加以下配置以防止 HMS Core SDK 的代码被混淆:

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

如果您使用了 AndResGuard 插件,需要在应用级的build.gradle文件中加入 AndResGuard 允许清单。

    whiteList = [
        "R.string.hms*",
        "R.string.connect_server_fail_prompt_toast",
        "R.string.getting_message_fail_prompt_toast",
        "R.string.no_available_network_prompt_toast",
        "R.string.third_app_*",
        "R.string.upsdk_*",
        "R.layout.hms*",
        "R.layout.upsdk_*",
        "R.drawable.upsdk*",
        "R.color.upsdk*",
        "R.dimen.upsdk*",
        "R.style.upsdk*", 
        "R.string.agc*"
    ]

集成须知:推送兼容性

若您的自身业务体系中,也需要接入华为推送,则需要考虑自身业务体系的华为推送与云信消息的华为推送兼容。

兼容需要完成以下两个步骤:

  1. 新建一个自定义的服务。 对于华为推送,为了接收推送消息,华为 SDK 要求您自定义一个继承自HmsMessageService类的服务 ,并注册到 AndroidManifest.xml。开发者需要将自身的华为推送服务,从继承 HmsMessageService 改为继承HWPushMessageServiceHWPushMessageService 为云信提供,推送消息首先被 NIM SDK 接收,如果是自身体系的推送消息,NIM SDK 会将消息传递给 HWPushMessageService。您可以自行处理自身体系的推送消息,云信不做处理。

    java/**
    * 以下这些方法运行在非 UI 线程中, 与HuaWei的PHmsMessageService 方法一一对应。
    * 当开发者自身也接入HuaWei推送,则应将继承 HmsMessageService 改为继承 HWPushMessageService,其他不变
    */
    public class HWPushMessageService extends Service {
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        public void onNewToken(String token) {
            MixPushPlatforms.getPushPlatform(PushType.HUA_WEI).onToken(token);
        }
    
        /**
        * 透传消息, 需要用户自己弹出通知
        *
        * @param remoteMessage
        */
        public void onMessageReceived(RemoteMessage remoteMessage) {
        }
    
        public void onMessageSent(String s) {
        }
    
        public void onDeletedMessages() {
        }
    
        public void onSendError(String var1, Exception var2) {
        }
    }
    
  2. 在将服务改为继承 HWPushMessageService 之后,将该服务在 AndroidManifest 中配置如下,您只需将服务名称 HWPushMessageService 替换成自身的服务名。

    xml<service 
        android:name="xxx.HWPushMessageService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.netease.nimlib.mixpush.hw.action.MESSAGING_EVENT" />
        </intent-filter>
    </service>
    

华为平台限制

消息分类

资讯营销类消息的每日推送数量自2023年01月05日起根据应用类型对推送数量进行上限管理,服务与通讯类消息每日推送数量不受限,详情请参见华为的推送数量管理细则

消息类型 说明 提醒方式
服务与通讯 包括社交通讯类消息和服务提醒类消息
  • 社交通讯,指用户间的聊天消息、通话等信息
  • 服务提醒,指应用借助通知中心及时向用户传递重要通知提醒,通常用户对接收此类消息有预期
锁屏、铃声、振动
资讯营销 包括资讯类消息和营销类消息,指的是运营人员向用户发送的活动信息、内容推荐、资讯等 静默通知,仅在下拉通知栏时展示消息

具体的分类细节可见华为消息分类标准

华为推送消息的提醒级别,通过importance字段进行配置:

  • LOW:表示通知栏消息预期的提醒方式为静默提醒,消息到达手机后,无铃声震动。
  • NORMAL:表示通知栏消息预期的提醒方式为强提醒,消息到达手机后,以铃声、震动提醒用户。终端设备实际消息提醒方式将根据category字段取值或者智能分类结果进行调整。

消息分类方式

华为消息分类方式有两种,默认情况下,所有消息一律通过通知消息智能分类功能进行分类。如您希望消息分类能更精准地符合业务需要,您也可以申请自分类权益,我们将信任您所提供的分类信息,按照您提供的分类标准展示对应消息。

  • 消息智能分类

    智能分类算法将根据您发送的内容等多个维度因素,自动将您的消息按照分类标准归类为服务与通讯类或者资讯营销类消息。

  • 消息自分类

    华为推送服务接受开发者自分类权益的申请。当您申请成功后,允许开发者根据华为推送分类规范,自行对消息进行分类。

    自分类权益生效后,应用的推送消息将根据message.android.category字段进行归类。

    category 取值说明消息提醒方式
    MARKETING 表示消息为资讯营销类消息提醒方式为静默通知,仅在下拉通知栏展示
    IM 即时聊天表示消息为服务与通讯类。消息提醒方式为锁屏+铃声+震动
    VOIP 音视频通话
    SUBSCRIPTION 订阅
    TRAVEL 出行
    HEALTH 健康
    WORK 工作事项提醒
    ACCOUNT 账号动态
    EXPRESS 订单&物流
    FINANCE 财务
    DEVICE_REMINDER 设备提醒
    SYSTEM_REMINDER 系统提示
    MAIL 邮件
    PLAY_VOICE语音播报(仅透传消息支持)

    举例:具有消息自分类权益且申请了自分类消息类型 IM 消息,当您发送消息时携带category字段且赋值为“IM”,则该消息的提醒方式为锁屏+铃声+震动。

  • 若应用没有自分类权益,或应用有自分类权益但推送消息不携带category字段,则应用的推送消息将通过智能分类进行自动归类。
  • 若应用有自分类权益且推送消息携带category字段,将信任开发者提供的分类信息,消息不经过智能分类。

消息推送类型配置

为了确保推送能正常提醒用户(锁屏、铃声或震动),需设置推送消息的类型 category

  • 您可以直接在控制台上配置默认的推送消息类型。

    1. 控制台首页应用管理选择应用进入应用配置页面,然后单击 IM即时通讯 专业版下的功能配置按钮进入 IM 即时通讯配置页。

    2. 在顶部选择基础功能页签,选择第三方厂商消息分类,并单击子功能配置

    3. 选择对应的第三方厂商,单击编辑,选择类型后保存

  • 也可以通过配置云信 NIM SDK 中消息体的 pushPayload 来实现。

    在其中添加以hwField为key的 Map 或者 JSONObject 数据即可,数据格式请参照华为推送AndroidNotification

    • 透传消息示例

      // hwPassThroughField 结构示例
      // "hwPassThroughField": {
      //     "data":"{\"1111\":\"22222\"}",//自定义消息负载,只支持字符串或json格式字符串
      //     "android": {
      //         "collapse_key":-1,//用户设备离线时,Push服务器对离线消息缓存机制,默认为-1,详见官方文档AndroidConfig.collapse_key
      //         "urgency":"NORMAL",//透传消息投递优先级,详见官方文档AndroidConfig.urgency
      //         "category":"IM",//标识消息类型,用于标识高优先级透传场景,,详见官方文档AndroidConfig.category
      //     }
      // }
      pushPayload.put("pushTitle", "Set push title here");
      pushPayload.put("hwPassThroughField", hwPassThroughField);
      
    • 普通消息示例

      // hwField 结构示例
      // "hwField": {
      //     "click_action": { "type": 1}
      // }
      pushPayload.put("pushTitle", "Set push title here");
      pushPayload.put("hwField", hwField);
      

对于传给华为推送平台的消息类型优先级:

  • 您上传的消息体的 pushPayload中有分类(category)字段,则使用 pushPayload中的字段值。
  • 如果消息体的 pushPayload中未传入分类(category)字段,则使用默认的推送消息类型(在云信控制台设置的消息类型)。
  • 如果消息体的 pushPayload中未传入分类(category)字段,也没有在云信控制台上配置推送消息类型,则该推送消息不会添加分类字段,应用的推送消息将通过华为智能分类进行自动归类。

限额说明

每日推送数量上限要求

根据消息分类标准,华为推送服务将通知消息分为资讯营销、服务与通讯两大类别。资讯营销类消息的每日推送数量自2023年01月05日起根据应用类型对推送数量进行上限管理,服务与通讯类消息每日推送数量不受限。

消息分类 类型说明 推送数量限制
资讯营销类消息
  • 内容资讯:内容推荐,新闻,财经动态,生活资讯,社交动态,调研,其他
  • 营销活动:产品促销,功能推荐,运营活动
具体类别请参见资讯营销类消息场景说明
根据应用类别限制每日推送数量,具体要求参见不同应用类别的推送数量上限要求
服务与通讯类消息
  • 社交通讯:即时聊天,音频、视频通话
  • 服务提醒:订阅,出行,健康,工作事项提醒,帐号动态,订单&物流,财务,设备提醒,系统提示,邮件
具体类别请参见服务与通讯类消息场景说明
无限制

不同应用类别的推送数量上限要求

针对接入华为推送服务设备上的通知栏中的资讯营销类消息,将根据应用类别对每日推送数量进行上限管理。

二级分类 三级分类 单个应用每日每设备通知推送数量(单位:条)
新闻阅读 新闻(需具备《互联网新闻信息服务许可证》) 5
电子书、杂志、有声读书、动漫、幽默、体育、分类信息 2
其他 所有 2
此文档是否对你有帮助?
有帮助
去反馈
  • 集成流程
  • 步骤 1:在华为推送服务平台创建应用并启用推送服务
  • 步骤 2:在云信控制台添加华为推送证书
  • 步骤 3:下载华为服务配置文件
  • 步骤 4:导入华为推送 SDK
  • 步骤 5:AndroidManifest.xml 配置
  • 步骤 6:防止代码混淆
  • 集成须知:推送兼容性
  • 华为平台限制
  • 消息分类
  • 消息分类方式
  • 消息推送类型配置
  • 限额说明
  • 每日推送数量上限要求
  • 不同应用类别的推送数量上限要求