从Push SDK 4.0.4版本开始Push Kit提供了发送上行消息的能力,即支持从终端设备上发送消息给您的服务器。
Push端侧支持消息的缓存重发能力,即App发送的上行消息由于网络不可用等原因导致消息发送失败时,消息会缓存在终端设备上,待合适时机后进行重发。App可以通过RemoteMessage.Builder中的setSendMode(int sendMode)方法来设置,sendMode设置为1,则表示需要缓存重发(默认不支持缓存重发)。若消息的缓存时间超过设置的ttl值或者缓存条数超过20条,则丢弃该条消息,并通过错误码告知App。为避免缓存重发的消息被覆盖,需要开发者的App保证messageId的唯一性。并且缓存重发不保证消息顺序,如果开发者对消息有顺序要求,则需要自己做保序处理。
Push端侧支持消息的回执能力,即App发送的上行消息如果成功发送给您的服务器,您的服务器应答之后,这个应答消息会通过HmsMessageService类的onMessageDelivered()方法回执给您的App。如果要支持回执能力通过RemoteMessage.Builder中setReceiptMode(int receiptMode)方法来设置,receiptMode设置为1,则表示需要回执能力(默认不支持回执)。
您的服务器如何接入华为Push服务器请参考服务端开发指导章节。上行消息的交互流程如下:
基于HTTPS协议发送上行消息的主要开发步骤如下:
1、在AppGallery Connect上开通HTTPS上行消息接收能力。
登录AppGallery Connect网站,单击“我的项目”。
在项目列表中找到您的项目,在项目中单击需要开通接收上行消息的应用。
在左侧导航栏选择“增长 > 推送服务”,在“配置”页签下找到“接收上行消息”点击“开通”。
配置“接收地址”和PEM格式的“HTTPS证书”。
2、应用App携带指定的uri调用HmsMessaging.send()方法发送上行消息。
- String messageId = String.valueOf(System.currentTimeMillis());
- RemoteMessage remoteMessage = new RemoteMessage.Builder("push.hcm.upstream")
- .setMessageId(messageId)
- .addData("key1", "data1")
- .addData("key2", "data2")
- .build();
- try {
- HmsMessaging.getInstance(this).send(remoteMessage);
- Log.i(TAG, "sending...");
- } catch (Exception e) {
- Log.e(TAG, "send exception:" + e);
- }
3、应用App处理上行消息发送结果。
App继承HmsMessageService类,开发者可以实现onMessageSent和onSendError回调函数以检查上行消息的发送状态。发生错误时,onSendError会返回一个带有错误码的BaseException对象,开发者可以调用getErrorCode方法获取错误码。例如,如果客户端在发送消息体过大(1KB)时,则会返回ERROR_SIZE(907122041)。
- public class DemoHmsMessageService extends HmsMessageService {
- @Override
- public void onMessageSent(String msgId) {
- Log.i(TAG,"message sent ok");
- }
- @Override
- public void onSendError(String msgId, Exception exception) {
- Log.e(TAG,"message sent err, msgid " + msgId + ", exception " + exception.getMessage());
- }
- }
4、您的服务器接收上行消息并进行校验。
Push服务器收到上行消息时,会将收到上行消息时的时间戳与冒号与上行消息组合成一个待加密的字符数组(比如:“123456789:your_data”),将此数组使用HMAC验签密钥进行HmacSHA256加密后,再经Base64编码后得到一个签名。然后将此签名通过HTTPS请求header的“X-HW-SIGNATURE”字段传递给应用的服务器,同时在同一个请求报文中,将收到上行消息的时间戳信息,通过HTTPS请求header的“X-HW-TIMESTAMP”字段传递给应用服务器。您的服务器需要通过HTTPS请求header信息与HMAC验签密钥进行签名校验,以验证上行消息的合法性。
5、您的服务器需要回复上行消息响应报文,响应报文参数请参考HTTPS上行消息。