3个步骤轻松集成Push Kit,实现App消息推送
推送通知作为App重要的消息传递工具,广泛应用于电子商务、社交媒体、旅游交通等领域的通知场景。比如当应用有新功能或安全补丁时,系统将推送消息提醒用户及时更新;如果是航班出行类的应用,会发送最新的班次时间表给用户,以确保及时提醒。推送通知是App与用户建立联系,保持信任和满意度的重要方式,那么App怎样才能实现发送通知消息给用户呢?
HarmonyOS SDK推送服务(Push Kit)是华为提供的消息推送平台,建立了从云端到终端的消息推送通道,通过集成推送服务,HarmonyOS应用就可以实现向用户实时推送通知消息。其显示场景主要包括通知中心、锁屏、横幅、桌面图标角标与通知图标。

业务流程

实现推送通知消息的业务流程包括申请并获取Push Token、上报Token等信息至应用服务端、发送推送消息请求、下发消息到Push Kit和处理消息5个步骤。
名词解释
在学习实现推送通知消息的能力之前,我们先来学习几个专有名词。
Push Token标识了每台设备上的每个应用,开发者调用getToken()接口向Push Kit服务端请求Token,在获取到Token后,需要使用Push Token来推送消息。当在应用启动时调用getToken()接口时,如果设备的Token发生变化,开发者需要及时上报到应用服务器更新Token。
通知消息类别。为了改善终端用户推送体验,Push Kit对通知消息进行分类管理,category的取值不同,标识的消息类型则不同,不同的通知消息类型影响消息展示和提醒方式,开发者在推送消息前,需先申请通知消息自分类权益。
开发步骤
实现通过Push Kit推送通知消息主要分为三个步骤,分别为获取Push Token、告知用户需要允许接收通知消息、推送通知消息。
1.获取Push Token。
首先导入pushService模块,建议在您的UIAbility(例如EntryAbility)的onCreate()方法中调用getToken()接口获取Push Token并上报到您的服务端,方便您的服务端向终端推送消息。
import { pushService } from '@kit.PushKit';
//导入pushService模块。
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit';
export default class EntryAbility extends UIAbility {
// 入参 want 与 launchParam 并未使用,为初始化项目时自带参数
async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): Promise<void> {
// 获取Push Token
try {
const pushToken: string = await pushService.getToken();
hilog.info(0x0000, 'testTag', 'Succeeded in getting push token');
} catch (err) {
let e: BusinessError = err as BusinessError;
hilog.error(0x0000, 'testTag', 'Failed to get push token: %{public}d %{public}s', e.code, e.message);
}
// 上报Push Token并上报到您的服务端
}
}
2.应用需要获取用户授权才能发送通知,为确保应用可正常收到消息,建议应用发送通知前调用requestEnableNotification()方法,弹窗让用户选择是否允许发送通知。
import { notificationManager } from '@kit.NotificationKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { common } from '@kit.AbilityKit';
const TAG: string = '[PublishOperation]';
const DOMAIN_NUMBER: number = 0xFF00;
let context = getContext(this) as common.UIAbilityContext;
notificationManager.isNotificationEnabled().then((data: boolean) => {
console.info("isNotificationEnabled success, data: " + JSON.stringify(data));
if(!data){
notificationManager.requestEnableNotification(context).then(() => {
hilog.info(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification success`);
}).catch((err : BusinessError) => {
if(1600004 == err.code){
hilog.error(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification refused, code is ${err.code}, message is ${err.message}`);
} else {
hilog.error(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification failed, code is ${err.code}, message is ${err.message}`);
}
});
}
}).catch((err : BusinessError) => {
hilog.error(DOMAIN_NUMBER, TAG, `isNotificationEnabled fail: ${JSON.stringify(err)}`);
});
3.应用服务端调用Push Kit服务端的REST API推送通知消息。
// Request URL
POST https://push-api.cloud.huawei.com/v3/[projectId]/messages:send
// Request Header
Content-Type: application/json
Authorization: Bearer eyJr*****OiIx---****.eyJh*****iJodHR--***.QRod*****4Gp---****
push-type: 0
// Request Body
{
"payload": {
"notification": {
"category": "MARKETING",
"title": "普通通知标题",
"body": "普通通知内容",
"clickAction": {
"actionType": 0
"data": {"testKey": "testValue"}
},
"notifyId": 12345
}
},
"target": {
"token": ["IQAAAA**********4Tw"]
},
"pushOptions": {
"testMessage": true
}
}
在推送通知消息的这段示例代码中,projectId为项目ID,可登录AppGallery Connect网站,选择"我的项目",在项目列表中选择对应的项目,左侧导航栏选择"项目设置",在该页面获取;push-type为0表示通知消息场景;actionType为0表示点击消息打开应用首页。
此外,当actionType为1时,则代表点击消息打开应用内自定义页面,如果要实现点击消息打开指定的应用内页面,需要先设置待跳转Ability的skills标签中的actions或uris值。
设置actions参数完成点击消息进入应用内页的示例如下:
{
"name": "TestAbility",
"srcEntry": "./ets/abilities/TestAbility.ets",
"exported": false,
"startWindowIcon": "$media:icon",
"startWindowBackground": "$color:start_window_background",
"skills": [
{
"actions": [
"com.test.action"
]
}
]
}
如果要通过设置uris参数完成点击消息进入应用内页,skills中必须同时设置actions参数,且actions参数为空。
"skills": [
{
"actions": [""],
"uris": [
{
"scheme": "https",
"host": "www.xxxx.com",
"port": "8080",
"path": "push/test"
}
]
}
]
设置完skills标签后,在发送消息时,clickAction中需携带data字段并设置actionType字段为1,则可实现点击消息进入指定的应用内页面。
// Request URL
POST https://push-api.cloud.huawei.com/v3/[projectId]/messages:send
// Request Header
Content-Type: application/json
Authorization: Bearer eyJr*****OiIx---****.eyJh*****iJodHR--***.QRod*****4Gp---****
push-type: 0
// Request Body
{
"payload": {
"notification": {
"category": "MARKETING",
"title": "普通通知标题",
"body": "普通通知内容",
"clickAction": {
"actionType": 1,
"action": "com.test.action",
"uri": "https://www.xxxx.com:8080/push/test",
"data": {"testKey": "testValue"}
}
}
},
"target": {
"token": ["IQAAAA**********4Tw"]
},
"pushOptions": {
"testMessage": true
}
}
其中需要注意的是,在获取消息中传递的data数据时,如果是点击消息首次进入应用首页或应用内页,可以在onCreate()方法中获取消息data数据。
import { UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
export default class MainAbility extends UIAbility {
onCreate(want: Want): void {
// 获取消息中传递的data数据
const data = want.parameters;
hilog.info(0x0000, 'testTag', 'Succeeded in getting message data');
// 根据实际业务场景对data进行处理
}
}
如果当前应用进程存在时,点击消息进入应用首页或应用内页,可以在onNewWant()方法中获取消息data数据,且onNewWant()方法仅在单例(singleton)模式下可用。
import { UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
export default class MainAbility extends UIAbility {
onNewWant(want: Want): void {
// 获取消息中传递的data数据
const data = want.parameters;
hilog.info(0x0000, 'testTag', 'Succeeded in getting message data');
// 根据实际业务场景对data进行处理
}
}
在实际开发过程中,以上两种方式都需要注意到。在成功发送消息后,可以检查设备是否收到了通知消息,至此,通过Push Kit发送通知消息的步骤就结束了。
在推送通知消息时,还存在一种情况,那就是当推送的通知消息有错误或者存在违规情况时,可能会引起用户投诉或面临监管风险。基于此,Push Kit还提供消了息撤回功能,以降低此类推送可能造成的影响。
需要注意的是,消息撤回仅支持还未下发到端侧的消息,或者已在终端展示但用户还未点击的消息,并且仅支持使用Token和notifyId撤回。
在成功推送通知消息后,如果需要撤回消息,需要确保应用可正常收到通知消息,并且在推送消息时设置了notifyId字段,这样应用服务端就可以调用REST API撤回通知消息了。
// Request URL
POST https://push-api.cloud.huawei.com/v1/[clientId]/messages:revoke
// Request Header
Content-Type:application/json
Authorization:Bearer eyJr*****OiIx---****.eyJh*****iJodHR--***.QRod*****4Gp---****
push-type: 0
// Request Body
{
"notifyId": 1234567,
"token": [
"pushToken1",
"pushToken2",
"pushToken3"
]
}
这里代码中的clientId需要替换为应用的Client ID,获取方式与projectId一样。notifyId作为消息ID,是消息的唯一标识。
通过以上步骤,我们就可以实现通过Push Kit推送和撤回普通通知消息了,在此能力的基础上,我们还可以继续探索Push Kit的更多个性化服务能力,为应用的拉新促活创造更多可能性。
了解更多详情>>
访问推送服务联盟官网
3个步骤轻松集成Push Kit,实现App消息推送的更多相关文章
- APP消息推送机制的实现(PUSH)
出于好奇,想了解一下消息推送机制,在网上搜索到了几篇文章,感觉还不错,粘贴下来,等真正用到的时候再仔细研究 以下两篇是关于ios的 1.http://blog.csdn.net/xyxjn/artic ...
- [置顶] 手把手教你iOS消息推送证书生成以及Push消息
iOS推送消息是许多iOS应用都具备的功能,今天在给应用加推送功能,在生成证书的过程中,发生了各种令人蛋痛的事.下面就把步骤拿出来分享下: iOS消息推送的工作机制可以简单的用下图来概括: Provi ...
- java服务端集成极光消息推送--详细开发步骤
1.极光推送账号准备 要使用极光消息推送必须先在官方网站上注册账号,并添加应用. 产品介绍:https://docs.jiguang.cn/jpush/guideline/intro/ 注册开发者账号 ...
- Android消息推送 SDK 集成指南
使用提示 本文是 Android SDK 标准的集成指南文档. 匹配的 SDK 版本为:r1.8.0及以后版本. 本文随SDK压缩包分发.在你看到本文时,可能当前的版本与本文已经不是很适配.所以建议关 ...
- umeng友盟消息推送功能集成
umeng友盟消息推送功能集成(本人使用的是eclipse开发) 1.首先请自行观看友盟消息推送集成的API文档. 观看地址如下: http://dev.umeng.com/push/android/ ...
- Push:iOS基于APNS的消息推送
1. Push的三个步骤,如下图所示: (1)Push服务应用程序把要发送的消息.目的iPhone的标识打包,发给APNS: (2)APNS在自身的已注册Push服务的iPhone列表中,查找有相应标 ...
- 为友盟消息推送开发的PHP SDK(composer版):可以按省发Android push
一直以来APP希望按省市县推送Android push,只能自己分析用户经纬度,打tag发送. 现在终于有服务商提供了. 友盟消息推送 可以“按省推送”,很方便. 我为友盟做了PHP SDK(comp ...
- [Erlang 0106] Erlang实现Apple Push Notifications消息推送
我们的IOS移动应用要实现消息推送,告诉用户有多少条消息未读,类似下图的效果(笑果),特把APNS和Erlang相关解决方案笔记于此备忘. 上面图片中是Apple Notif ...
- (转)在SAE使用Apple Push Notification Service服务开发iOS应用, 实现消息推送
在SAE使用Apple Push Notification Service服务开发iOS应用, 实现消息推送 From: http://saeapns.sinaapp.com/doc.html 1,在 ...
- 了解iOS消息推送一文就够:史上最全iOS Push技术详解
本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表. 1.引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ.微信等IM界面处于前台时,聊天消息和指 ...
随机推荐
- Python获取指定网段正在使用的IP
Python获取指定网段正在使用的IP #!/usr/bin/env python # -*- coding: utf-8 -*- ''''' 使用方法样例 python test20.py 192. ...
- VScode配置PHP开发环境
vscode配置php开发环境 使用vscode配置PHP开发环境,首先要下载vscode, vscode下载 下载完vscode之后,可以在扩展里面下载中文版本 将vscode下载完之后,需要下载x ...
- SpringBoot整合knife4j(swagger)
关于knife4j Knife4j是一个基于Swagger的Java接口文档生成工具,它提供了一套可视化的界面来展示和测试API接口.Knife4j通过解析接口代码中的Swagger注解,自动生成接口 ...
- 【MySQL】全库调整表大小写语句
统一修改字段成小写+下划线的命名规则: V1上线后,重新看SQL调整的较可行的写法: # = = = = = = = = = = = = = = = 统一更改全库所有字段大小写脚本SQL(会删除字段原 ...
- wandb原来是可以网络直连的,国内可以无障碍使用
一直不是很常使用神经网络训练可视化的工具,包括:tensorboard,等等,wandb平时也是直接就忽略,不过最近无意间看了看这个效果,感觉还是不错的,于是尝试了一下. 网上很多人说这个工具服务器在 ...
- 一个专为量化投资开发的强化学习算法框架:ElegantRL
链接: https://github.com/AI4Finance-Foundation/ElegantRL 这是一个专为量化投资开发的强化学习算法框架. 相关论文: ElegantRL-Podrac ...
- Tensorflow1.14中placeholder.shape和tf.shape(placeholder)的区别
最近在看TensorFlow的代码,还是1.14版本的TensorFlow的,代码难度确实比pytorch的难上不是多少倍,pytorch的代码看一遍基本能看懂个差不多,TensorFlow的代码看一 ...
- AtCoder Beginner Contest 314
AtCoder Beginner Contest 314 - AtCoder A - 3.14 (atcoder.jp) 题目提供了100位,所以直接用字符串输出 #include <bits/ ...
- 编译stvo-pl报错error: ‘random_device’ was not declared in this scope 解决方案
近来在研究PL-SLAM时,由于要安装stvo-pl库,所以我下载安装了这个库.在编译阶段我遇到了一个让人头大的问题. 即红框标出的地方报错:error: 'random_device' was no ...
- AntSK:在无网络环境中构建你的本地AI知识库的终极指南
亲爱的读者朋友们,我是许泽宇,今天我将深入探讨一个引人注目的开源工具--AntSK.这个工具让您在没有互联网连接的情况下,仍然能够进行人工智能知识库的对话和查询.想象一下,即使身处无网络环境中,您也可 ...