音讯推送作为App经营日常应用的用户促活和召回伎俩,是与用户建设继续互动和连贯的良好形式。推送服务(Push Kit)是华为提供的音讯推送平台,建设了从云端到终端的音讯推送通道,本文旨在介绍HarmonyOS(Java)版本的性能及接入领导。
HarmonyOS(Java)版本次要性能为依据token推送告诉栏和透传音讯。HarmonyOS Java SDK为您的HarmonyOS利用开发提供推送音讯相干的接口,实用于手机和平板。
依据Push Token推送音讯
您能够输出指标用户的Push Token来推送音讯,一次最多可填1000个Push Token。
透传音讯
透传音讯是由客户端利用负责解决的音讯。终端设备收到Push云端发送的数据或指令后不间接展现,而是将数据传递给利用,由利用解析内容,并触发相干动作(如跳转网页、利用内页面等等)。您能够自定义音讯款式,从而更高效灵便地推送音讯。
透传音讯的达到率受Android零碎和利用是否驻留在后盾影响,推送服务不保障透传音讯的高达到率。
透传音讯的罕用场景:VoIP呼叫、语音播报、好友互动告诉等。
开发筹备
具体开发筹备请参考官网。
利用开发
获取Push Token
Token是推送令牌,每个设施上的每个利用的Token都是惟一存在的,客户端调用getToken办法向Push服务端申请利用的Token,您能够依据Push服务端返回的Token向利用推送音讯。当getToken办法返回为空时,可通过onNewToken办法获取Token值。
倡议将Push Token上报到您本人的应用服务器,并定时更新Token列表。您能够调用上行音讯API,依据这些Token批量推送音讯。
- 创立一个新的线程,并调用getToken办法获取Push Token(倡议在利用启动后的首个Ability中调用getToken办法)。
public class TokenAbilitySlice extends AbilitySlice {
private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0xD001234,
"TokenAbilitySlice");
private void getToken() {
// 创立新线程
new Thread("getToken") {
@Override
public void run() {
try {
// 从agconnect-services.json文件中读取client/app_id
String appId = "your APP_ID";
// 输出token标识"HCM"
String tokenScope = "HCM";
// 获取Push Token
String token = HmsInstanceId.getInstance(getAbility().getAbilityPackage(), TokenAbilitySlice.this).getToken(appId, tokenScope);
} catch (ApiException e) {
// 获取Push Token失败时,打印错误码
HiLog.error(LABEL_LOG, "get token failed, the error code is %{public}d", e.getStatusCode());
}
}
}.start();
}
}
- 在您的service(已继承HmsMessageService)中,覆写onNewToken办法,当Token发生变化时以onNewToken办法返回。
public class DemoHmsMessageServiceAbility extends HmsMessageService {
private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0xD001234, "DemoHmsMessageServiceAbility");
@Override
// 获取Token
public void onNewToken(String token) {
HiLog.info(LABEL_LOG, "onNewToken called, token:%{public}s", token);
}
@Override
// 获取Token失败,打印错误码
public void onTokenError(Exception exception) {
HiLog.error(LABEL_LOG, "get onNewtoken error, error code is %{public}d", ((ZBaseException)exception).getErrorCode());
}
}
获取透传音讯数据
在您的service(已继承HmsMessageService)中,覆写onMessageReceived办法,只有您发送透传音讯至终端设备,都会取得透传音讯的内容。
public class DemoHmsMessageServiceAbility extends HmsMessageService {
private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0xD001234,
"DemoHmsMessageServiceAbility");
@Override
public void onMessageReceived(ZRemoteMessage message) {
// 打印消息的内容字段
HiLog.info(LABEL_LOG, "get token, %{public}s", message.getToken());
HiLog.info(LABEL_LOG, "get data, %{public}s", message.getData());
ZRemoteMessage.Notification notification = message.getNotification();
if (notification != null) {
HiLog.info(LABEL_LOG, "get title, %{public}s", notification.getTitle());
HiLog.info(LABEL_LOG, "get body, %{public}s", notification.getBody());
}
}
}
发送音讯
• 您能够登录AppGallery Connect网站发送音讯,详情请参见HarmonyOS利用推送音讯。
• 您能够应用服务端API向利用推送音讯:
- 您的服务器调用华为帐号服务器的接口(https://oauth-login.cloud.huawei.com/oauth2/v3/token)申请凭证Token。申请示例如下:
POST /oauth2/v3/token HTTP/1.1
Host: oauth-login.cloud.huawei.com
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&client_id=<客户端ID>&client_secret=<客户端密钥>
响应示例如下:
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
{
"access_token": "<返回的Access Token>",
"expires_in": 3600,
"token_type": "Bearer"
}
- 您的服务端调用API推送音讯,申请示例如下。
HTTPS POST URL:
POST https://push-api.cloud.huawei.com/v1/clientid/messages:send
申请音讯头示例:
Content-Type: application/json; charset=UTF-8
Authorization: Bearer CF3Xl2XV6jMK************************DgAPuzvNm3WccUIaDg==
申请音讯体(告诉栏音讯)示例:
{
"validate_only": false,
"message": {
"android": {
"notification": {
"title": "test title",
"body": "test body",
"click_action": {
"type": 3
}
}
},
"token": ["pushtoken1"]
}
}
自定义点击音讯动作
您能够自定义点击告诉栏音讯的动作,例如:关上利用首页、关上网页URL和关上利用自定义页面。
关上App首页
• 您能够通过AppGallery Connect推送音讯,设置点击告诉动作为关上利用、App页面为首页。
• 您能够通过服务端API推送音讯:
音讯体中携带click_action字段,type取值为3示意点击音讯后关上利用首页。
{
"validate_only": false,
"message": {
"android": {
"notification": {
"title": "test title",
"body": "test body",
"click_action": {
"type": 3
}
}
},
"token": ["pushtoken1"]
}
}
关上网页
• 您能够通过AppGallery Connect推送音讯,设置点击告诉动作为关上网页。
• 您能够通过服务端API推送音讯:
音讯体中携带click_action字段,type取值为2示意点击音讯后关上网页。
{
"validate_only": false,
"message": {
"android": {
"notification": {
"title": "test title",
"body": "test body",
"click_action": {
"type": 2,
"url":"https://www.huawei.com"
}
}
},
"token": ["pushtoken1"]
}
}
关上利用自定义页面
- 客户端利用先创立自定义页面(以“MyActionAbility”为例),在您我的项目的“entry/src/main”目录下的“config.json”文件中增加该Ability的skills字段。其中entities的值为“entity.system.default”不可扭转,actions的值由您自定义(以“com.test.myaction”为例)。
{
"orientation": "unspecified",
"name": "com.test.java.MyActionAbility",
"icon": "$media:icon",
"description": "$string:myactionability_description",
"label": "$string:entry_MyActionAbility",
"type": "page",
"launchType": "standard",
"skills": [
{
"entities": ["entity.system.default"],
"actions": ["com.test.myaction"]
}
]
}
- 您能够通过AppGallery Connect推送音讯,设置点击告诉动作为关上利用、App页面为自定义action页面(action请输出上一步中定义的actions的值)。
您也能够通过服务端API推送音讯。音讯体中携带click_action和action字段,type取值为1示意点击音讯后关上利用自定义页面,action取值为上一步中定义的actions的值。
{
"validate_only": false,
"message": {
"android": {
"notification": {
"title": "test title",
"body": "test body",
"click_action": {
"type": 1,
"action":"com.test.myaction"
}
}
},
"token": ["pushtoken1"]
}
}
传递数据
您推送音讯时可携带data字段,当用户点击音讯时通过下述办法将data中的数据传递至客户端利用。
- 推送音讯时携带data字段:
• 通过AppGallery Connect推送音讯且设置自定义键值对。
• 通过服务端API推送音讯,音讯体中携带data字段。
{
"validate_only": false,
"message": {
"android": {
"notification": {
"title": "test title",
"body": "test body",
"click_action": {
"type": 1,
"action":"com.test.myaction"
}
},
"data": "{'key_data':'value_data'}"
},
"token": ["pushtoken1"]
}
}
- 在客户端利用开发点击音讯跳转的页面获取data字段的性能,此处以点击音讯跳转到利用首页(MainAbilitySlice)获取data字段为例。
public class MainAbilitySlice extends AbilitySlice {
private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0xD001234, "myDemo");
@Override
public void onStart(Intent intent) {
HiLog.info(LABEL_LOG, "MainAbilitySlice get started...");
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
// 调用解析办法
parseIntent(intent);
}
private void parseIntent(Intent intent){
if (intent == null){return;}
IntentParams intentParams = intent.getParams();
if (intentParams == null) {return;}
// 获取data字段中的键值对
String key = "key_data";
Object obj = intentParams.getParam(key);
try{
// 打印data字段中的键值对
HiLog.info(LABEL_LOG, "my key: %{public}s, my value: %{public}s", key, obj);
}catch (Exception e){
HiLog.info(LABEL_LOG, "catch exception : " + e.getMessage());
}
}
}
理解更多详情>>
拜访华为推送服务联盟官网
获取华为推送服务开发领导文档
拜访HMS Core 联盟官网
获取HMS Core 开发领导文档
关注咱们,第一工夫理解 HMS Core 最新技术资讯~
发表回复