Android

集成华为推送

更新时间: 2024/10/10 11:22:54

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

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

集成流程

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

网易云信兼容华为推送 V2 版本,因此请在华为推送通知(V2)版本下创建应用,以兼容网易云信 IM。

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

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

  2. 登录 AppGallery Connect 创建项目,具体请参考《Harmony Developer》创建项目

  3. 创建完项目后,在目标项目下创建应用,具体请参考《Harmony Developer》创建应用

  4. 选择目标应用,然后在左侧导航栏选择 推送服务 进行开通,具体请参考《HMS Core》开通推送服务

  5. 在项目列表中找到您的项目,选择目标应用,下拉页面,可查看包名、App ID、SHA256 证书指纹、Client ID、Client Secret 等应用信息。具体请参考《HMS Core》查看应用基本信息

    应用的 SHA256 证书指纹 具体请参考《HMS Core》配置应用签名信息

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

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

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

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

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

登录 AppGallery Connect,在项目列表中找到您的项目,选择目标应用,下载华为服务配置文件,并将文件添加到您的应用级根目录下。具体请参考 添加配置文件

步骤 4:导入华为推送 SDK

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

  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 插件配置。

      Groovybuildscript {
          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 地址。

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

    Groovydependencies {
        //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 中添加如下配置:
      Groovyplugins {
          id 'com.android.application'
          // 添加如下配置
          id 'com.huawei.agconnect'
      }
      
  4. 完后以上配置后,完成 build.gradle 文件的同步,将相关依赖下载到本地。

步骤 5:AndroidManifest.xml 配置

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

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 的代码被混淆:

ProGuard    -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 允许清单。

Gradle    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 线程中, 与华为的 PHmsMessageService 方法一一对应。
    * 当开发者自身也接入华为推送,则应将继承 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 即时通讯 下的 功能配置 按钮进入功能配置页。

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

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

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

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

    • 透传消息示例

      Java// 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);
      
    • 普通消息示例

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

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

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

限额说明

每日推送数量上限要求

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

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

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

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

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