华为推送服务

华为推送服务

Huawei PUSH(华为推送服务)是华为为开发者提供的消息推送平台


1. 华为服务简介

划重点:

1.1 是什么服务?
云端终端的消息推送通道。PUSH通道拥有高到达率,推送速度每秒最高可达百万级,消息量每日百亿级,并且支持实时消息回执

1.2 存在或提供该服务意义?
可以将最新信息即时通知用户,构筑良好的用户关系,提升用户的感知度和活跃度

1.3 开发者需要做什么?

Step 1:开发者通过在APP服务器端调用PUSH接口,向Huawei PUSH平台发送推送消息
Step 2:Huawei PUSH平台将消息发给安装了相应APP的终端设备


2. 华为服务功能

2.1 终端设备收到消息的形式有?
Huawei PUSH可发送两种类型的消息给终端:通知栏消息和透传消息

2.2 PUSH主要功能

  1. 支持单发群发机制,可以一次给一个或者多个用户发送PUSH消息
  2. 当终端用户不在线时,支持消息缓存能力(消息缓存是指当消息到达华为PUSH平台后,如果设备不在线华为PUSH平台会将消息缓存起来,等到设备上线后华为PUSH平台会将缓存的消息再次推送给用户。如果用户很长时间不在线,这些缓存的消息默认保存24小时,最大保存15天,超期的消息会被PUSH平台丢弃)
  3. 支持实时消息回执
  4. 支持通知栏消息和透传消息两种方式。华为推荐用户尽量使用通知栏消息

2.3 通知栏或透传消息区别?

  1. 终端用户点击对应的通知栏消息触发相应的动作,如打开应用、打开一个网页、打开应用内某界面

  2. 透传消息由开发者的APP自主解析自定义内容,并触发相关动作,华为PUSH仅仅提供通道能力。利用此功能开发者可以实现好友邀请、IP呼叫等功能

2.4 华为推荐用户尽量使用通知栏消息的原因?

通知栏消息的优势如下

  1. 降低PUSH业务的功耗
    传统的Push功能都需要应用的进程存在时才能显示通知栏消息,但是应用进程很难常驻在系统,一般系统出于功耗的考虑会停止后台长时间没有活动的进程,这种情况下当收到通知栏消息需要展示时就需要拉起应用进程,频繁的操作会增加耗电影响手机续航能力

  2. 通知栏消息到达率通常比透传消息高(不受低功耗方案对广播拉起应用的限制)

2.5 消息送达率如何?

影响PUSH消息送达率的因素有

  1. 终端设备是否在线
  2. 用户手机上集成HMS SDK的应用是否被卸载
  3. 移动网络是否稳定
  4. 终端手机的安全控制策略
  5. 不同终端厂商设备的支持度

2.6 不同终端平台对PUSH消息的限制?

原则上安装了HMS APK(华为移动服务)的Android终端设备即可支持华为PUSH业务

  1. 华为Android终端设备(设备出厂自带HMS APK)

Tips:华为手机管家可以拦截Android广播消息,Push消息因此也会被拦截

  1. 非华为Android手机(小米、VIVO、OPPO、三星、酷派、中兴等)

Tips:需要终端设备先安装HMS APK。 某些厂商手机可能会删除华为进程,导致消息不可达

2.7 PUSH消息大小限制

PUSH消息支持的Android APP包名称最大为128个字节,消息内容最大限制为2K

2.8 PUSH消息流控限制

目前华为PUSH服务会对如下两个场景进行流控

  1. 服务端申请Access Token
    开发者应用服务器短时间内频繁申请Access Token会被网关流控,返回error=6错误码

  2. 服务端发送PUSH消息api.push.hicloud.com
    开发者应用服务器短时间内发送大量的推送消息会被流控,返回HTTP 503状态码

2.9 华为PUSH开放API认证方式

目前华为PUSH的开放API存在两种鉴权模式

  1. 用户级鉴权模式
    开发者使用开发者帐号登录华为开发者联盟后,使用PUSH控制台进行通知消息发送时采用用户级鉴权模式

Tips:PUSH控制台是华为为开发者提供的PUSH消息发送测试平台,可以在线编辑并发送PUSH消息用于测试应用是否正确集成Push服务

  1. 应用级鉴权模式
    开发者在应用服务器调用开放API发送的通知消息采用的是基于应用的鉴权模式,在使用前必须获取对应级别的Access Token才能进行正常的消息下发

更多详细信息,点我查看


3. 使用华为Push场景介绍

开发一个APP产品,通过接入华为PUSH服务,用来实现如下功能:

  1. 推送最新消息至消费者终端上的APP
  2. 消费者点击消息可实现如下3个场景

2.1 用户点击通知栏消息后打开指定APP
2.2 用户点击通知栏消息后跳转指定网页
2.3 用户点击通知栏消息后跳转APP的某个指定页面


4. 华为Push服务集成步骤

官方集成文档:华为推送服务

4.1 准备工作

  1. 注册认证成为开发者
  2. 配置应用签名
  3. 创建产品和应用
  4. 开通推送服务
  5. 获取推送服务参数
  6. 下载SDK
  7. 集成工程

详情可参考:点我查看

4.2 接下来依次讲解4.1

开发者接入HMS服务时需要同时集成HMS SDK Agent(简称Agent)和HMS SDK

HMS SDK:提供了原生的接口
HMS SDK Agent:是对HMS SDK原生接口的二次封装,处理了部分必要的接入逻辑而不再将它们暴露给开发者。

开发者仅需要了解并调用HMS SDK Agent接口即可,大大提升接入效率,降低出错几率

APP -> HMS SDK Agent -> HMS SDK 的关系如图所示
华为推送服务_第1张图片

  1. 注册成为开发者(开通Push服务)

  2. 项目根目录build.gradle中

	allprojects {
            repositories {
                jcenter()
                maven {url 'http://developer.huawei.com/repo/'}
            }
	} 
  1. 打开子工程app下的build.gradle文件
 dependencies {
	 //  {version} 替换为实际的版本号
	 // 如:compile 'com.huawei.android.hms:push:2.6.3.301' 
    compile 'com.huawei.android.hms:push:{version}'         
 }   
  1. 配置manifest文件(在application节点下增加APPID)

4.1 在application节点下增加APPID

<meta-data  
    android:name="com.huawei.hms.client.appid"  
    <!-- value的值“xxx”用实际申请的应用ID替换,来源于开发者联盟网站应用的服务详情。-->  
    android:value="appid=xxx">  
</meta-data>  

4.2 配置application的name属性(用于在application启动的时候调用HMSAgent.init()接口初始化HMS Agent)

<application
    <!-- “xxx”用实际的应用包名替换-->
    android:name="xxx.xxx.xxx.MyApplication"
    ......
    android:theme="@style/AppTheme">

4.3 BridgeActivity定义了HMS SDK中一些跳转所需要的透明页面

<activity  
    android:name="com.huawei.hms.activity.BridgeActivity"  
    android:configChanges="orientation|locale|screenSize|layoutDirection|fontScale"  
    android:excludeFromRecents="true"  
    android:exported="false"  
    android:hardwareAccelerated="true"  
    android:theme="@android:style/Theme.Translucent" >  
    <meta-data  
        android:name="hwc-theme"  
        android:value="androidhwext:style/Theme.Emui.Translucent" />  
</activity>   

// AppUpdateActivity和PackageInstallActivity是应用自升级接口所需要使用的页面

<activity
    android:name="com.huawei.updatesdk.service.otaupdate.AppUpdateActivity"
    android:configChanges="orientation|screenSize"
    android:exported="false"
    android:theme="@style/upsdkDlDialog" >

    <meta-data
        android:name="hwc-theme"
        android:value="androidhwext:style/Theme.Emui.Translucent.NoTitleBar" />
</activity>

<activity
    android:name="com.huawei.updatesdk.support.pm.PackageInstallerActivity"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:exported="false"
    android:theme="@style/upsdkDlDialog" >
    <meta-data
        android:name="hwc-theme"
        android:value="androidhwext:style/Theme.Emui.Translucent" />
</activity> 

4.4 在application节点下增加UpdateProvider(用于HMS SDK引导升级HMS APK,提供给系统安装器读取升级文件)

<provider  
    android:name="com.huawei.hms.update.provider.UpdateProvider"  
    <!--“xxx.xxx.xxx”用实际的应用包名替换-->  
    android:authorities="xxx.xxx.xxx.hms.update.provider"  
    android:exported="false"  
    android:grantUriPermissions="true" >  
</provider>

4.5 在application节点下增加UpdateSdkFileProvider,用于应用自升级

<provider
    android:name="com.huawei.updatesdk.fileprovider.UpdateSdkFileProvider"
    <!--“xxx.xxx.xxx”用实际的应用包名替换-->
    android:authorities="xxx.xxx.xxx.updateSdk.fileProvider"
    android:exported="false"
    android:grantUriPermissions="true">
</provider>

4.6 在application节点下增加Service,用于应用自升级

<!-- 应用下载服务 -->
<service android:name="com.huawei.updatesdk.service.deamon.download.DownloadService"
    android:exported="false"/>  

4.7 在manifest节点下增加所需权限

<!--HMS-SDK引导升级HMS功能,访问OTA服务器需要网络权限-->    
<uses-permission android:name="android.permission.INTERNET" />   
 
<!--HMS-SDK引导升级HMS功能,保存下载的升级包需要SD卡写权限-->    
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
  
<!--检测网络状态-->  
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  

<!--检测wifi状态-->  
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>  

<!--为了获取用户手机的IMEI,用来唯一的标识用户。-->  
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 

<!--如果是安卓8.0,应用编译配置的targetSdkVersion>=26,请务必添加以下权限 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

<!-- 接收PUSH TOKEN的广播以及PUSH消息需要定义该权限 ${PACKAGE_NAME} 要替换上您应用的包名 -->
<permission android:name="${PACKAGE_NAME}.permission.PROCESS_PUSH_MSG"
	android:protectionLevel="signatureOrSystem"/>

<!--接收PUSH TOKEN的广播以及PUSH消息需要定义该权限 ${PACKAGE_NAME} 要替换上您应用的包名 -->
<uses-permission android:name="${PACKAGE_NAME}.permission.PROCESS_PUSH_MSG" />

4.8 在application节点下声明2个receiver和1个service,用于接收广播信息

 用来接收PUSH消息的receiver:

  <!-- 接入HMSSDK PUSH模块需要注册,第三方相关 :接收Push消息(注册、透传消息、通知栏点击事件)广播,此receiver类需要开发者自己创建并继承com.huawei.hms.support.api.push.PushReceiver类,参考示例代码中的类:com.huawei.hmsagent.HuaweiPushRevicer-->

  <!--“xxx”用实际的类名替换, ${PACKAGE_NAME} 要替换上您应用的包名-->
  <receiver android:name="xxx"
         android:permission="${PACKAGE_NAME}.permission.PROCESS_PUSH_MSG">
            <intent-filter>
               <!-- 必须,用于接收token -->
               <action android:name="com.huawei.android.push.intent.REGISTRATION" />
               <!-- 必须, 用于接收透传消息 -->
               <action android:name="com.huawei.android.push.intent.RECEIVE" />
               <!-- 必须, 用于接收通知栏消息点击事件 此事件不需要开发者处理,只需注册就可以-->
               <action android:name="com.huawei.intent.action.PUSH_DELAY_NOTIFY"/>
            </intent-filter>
  </receiver>

4.9 在application节点下注册android组件(解决华为移动服务升级问题的透明界面)

<activity
    android:name="com.huawei.android.hms.agent.common.HMSAgentActivity"
    android:configChanges="orientation|locale|screenSize|layoutDirection|fontScale"
    android:excludeFromRecents="true"
    android:exported="false"
    android:hardwareAccelerated="true"
    android:theme="@android:style/Theme.Translucent" >
    <meta-data
        android:name="hwc-theme"
        android:value="androidhwext:style/Theme.Emui.Translucent" />
</activity>
  1. 配置混淆脚本

开发者编译APK时请不要混淆HMS SDK以及HMS SDK的相关资源文件,避免功能异常

加入排除hms的混淆配置

-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.**{*;}

-keep class com.huawei.android.hms.agent.**{*;} 

4.3 客户端开发

客户端开发主要的目的:为了向PUSH服务器获取设备的PUSH Token,获取Token后开发者可以在联盟PUSH控制台或者开发者自己的服务器向这些Token发送推送消息

  1. 初始化Agent
HMSAgent.init(this);
  1. 请务必在应用启动后的首个activity的onCreate方法中调用connect接口,确保HMS SDK和HMS APK的连接
 HMSAgent.connect((Activity) context, new ConnectHandler() {
            @Override
            public void onConnect(int rst) {
                CLog.i("HMSAgent", "connectHmsService :" + rst);
                getHuaWeiToken();
            }
        });
  1. 向服务端请求应用的唯一标识——Device Token
// 开发者的服务器根据这个Token发送推送消息
// 每个设备的上每个应用的Token都是唯一存在
HMSAgent.Push.getToken(new GetTokenHandler() {
            @Override
            public void onResult(int rtnCode) {
                CLog.i("HMSAgent", "getToken rtnCode: " + rtnCode);
            }
        });
  1. 调用getToken接口后,Token不是在本接口中直接返回的,而是通过广播的形式通知APP因此需要开发者实现自定义广播的onToken方法来接收Token

PUSH服务器发送的透传消息以及通知栏点击事件的处理都是通过广播来接收

public class HuaweiPushReceiver extends PushReceiver {
    @Override
    public void onToken(Context context, String token, Bundle extras) {
		 // 开发者自行实现Token保存逻辑。
    }
    @Override
    public boolean onPushMsg(Context context, byte[] msg, Bundle bundle) {
		 // 开发者自行实现透传消息处理。
    }    
 }  
  1. 是否接收PUSH通知栏消息
// 如果开发者不调用此方法,默认是接收通知栏消息。
// 在某些情况下,开发者如果想控制应用是否接收通知栏消息,可以调用此接口
void HMSAgent.Push.enableReceiveNotifyMsg(boolean enable, 
		EnableReceiveNotifyMsgHandler handler)
  1. 展示应用角标
    这个具体参看:点我查看

  2. 客户端测试

开发者可以参考PUSH控制台发送测试消息来测试PUSH消息能否正确送达客户端。如需实现服务端自定义发送Push消息


5. 集成常见问题
  1. 推送是否支持非华为手机?
    A:支持,非华为手机必须要安装华为移动服务,请到华为应用市场中搜索下载

  2. 通知栏消息系统版本要求
    A:支持NC(Notification Center)功能的手机:部分EMUI4.0和4.1的手机,以及EMUI5.0及之后的华为手机。建议最好是5.0系统以及以上

  3. 通知栏消息样式
    A:华为通知栏消息的样式只能是系统默认样式,通知栏消息的声音、样式和振动等不可以自定义

  4. 推送是否支持角标
    A:目前不支持通知栏消息和角标的同步,透传消息可以自行实现

  5. 透传消息和通知栏消息的区别
    A:
    透传消息:是华为Push将消息送达手机后不做呈现,直接转给开发者的应用,由应用本身去解析消息和呈现内容
    通知栏消息:是华为Push将消息送达手机后,会在通知栏显示一条消息,点击后触发指定动作,应用不需要去解析消息和控制呈现,减少了应用的开发工作量

  6. 无法收到推送消息
    A:
    Step 1: EMUI版本太低小于4.1.或华为移动服务版本较低
    Step 2:检查CP是否使用的是老版本的的push,老版本sdk会出现消息延时很明显的情况,以及收不到推送,需要尽快切换到新版本
    Step 3:服务端在推送消息到设备时,是否Token失效等,可让服务端配合查发送消息的返回状态码,详情 点我查看

  7. 接收不到消息,抓取相关日志

  • Adb连上手机分别执行下面命令
adb shell setprop log.tag.hwpush VERBOSE

adb logcat –v time > /Users/aaron/Desktop/huawei/hwpush.log

6. 参考
  1. Android集成华为推送的问题总结
  2. Android华为推送自定义动作的实现
  3. Android集成华为推送踩坑问题总结
  4. 消息推送(华为)
  5. 推送开发常见问题 华为官网常见问题
  6. 【重要】Huawei Push 的Token生成规则变化公告
  7. Android集成华为推送踩坑问题总结

你可能感兴趣的:(Android,第三方)