共计 6167 个字符,预计需要花费 16 分钟才能阅读完成。
音讯推送作为 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 最新技术资讯~