#HarmonyOS NEXT体验官# 推送服务卡片开发中获取PushToken
推送服务卡片开发中获取Push Token
Push Kit
提供稳定、及时、高效的消息Push服务,助力应用精准触达用户,有效提升用户的感知度和活跃度。
Push Token(推送令牌)是一个唯一标识符,用于标识某个特定的设备或应用实例,以便服务器可以向该设备或应用实例发送推送通知。Push Token 通常由推送通知服务(如 Apple Push Notification Service (APNs) 对于 iOS,或者 Firebase Cloud Messaging (FCM) 对于 Android 和 iOS)在设备首次注册推送通知时生成,并发送给应用开发者。Push Token标识了每台设备上每个应用,开发者可以调用场景化消息接口,根据Token来推送消息。
约束与限制
1.HarmonyOS系统:HarmonyOS NEXT Developer Beta1及以上。
2.DevEco Studio版本:DevEco Studio NEXT Developer Beta1及以上。
3.HarmonyOS SDK版本:HarmonyOS NEXT Developer Beta1 SDK及以上。
基于HarmonyOS实现申请PushToken功能
添加公钥指纹
当应用需要使用以下开放能力的一种或多种时,为正常调试运行应用,需要预先添加公钥指纹。
添加公钥指纹的步骤如下:
1.申请应用证书(.cer)、Profile(.p7b)文件,具体操作请参见请添加链接描述。
2.添加公钥指纹,具体操作请参见请添加链接描述。
配置Client ID
配置应用签名证书指纹后,还需要配置项目的Client ID。
在项目模块级别下的src/main/module.json5文件中,metadata里配置client_id。
"module": {
"name": "entry",
"type": "xxx",
"description": "xxxx",
"mainElement": "xxxx",
"deviceTypes": [],
"pages": "xxxx",
"abilities": [],
"metadata": [ // 配置如下信息
{
"name": "client_id",
"value": "xxxxxx"
}
]
}
获取Push Token
创建应用后,将应用的包名替换到AppScope/app.json5文件中
// app.json5
{
"app": {
"bundleName": "xxx.xxxx.xxxxx", // 替换为您的包名
"vendor": "demo",
"versionCode": 1000000,
"versionName": "1.0.0",
"icon": "$media:app_icon",
"label": "$string:app_name"
}
}
接口名:getToken(): Promise<string>
描述: 以Promise形式获取推送服务的Token
pushService:
本模块提供Push Kit的基础能力,包括获取和删除Push Token、绑定和解绑帐号和接收场景化消息的功能。
导入pushService模块
import { pushService } from '@kit.PushKit';
pushService.getToken
getToken(): Promise<string>
获取推送服务的Token,使用Promise异步回调。
模型约束:此接口仅可在Stage模型下使用。
系统能力:SystemCapability.Push.PushService
起始版本:4.0.0(10)
返回值:类型 Promise<string> ; 说明 Promise对象,返回Token。
import { pushService } from '@kit.PushKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
try {
pushService.getToken().then((data: string) => {
hilog.info(0x0000, 'testTag', 'Succeeded in getting push token.');
}).catch((err: BusinessError) => {
hilog.error(0x0000, 'testTag', 'Failed to get push token: %{public}d %{public}s', err.code, err.message);
});
} 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能力,跳转到“申请Token能力”页面。
点击Button按钮会调用getToken方法,路由到申请Token页面
private getToken = () => {
router.pushUrl({ url: 'pages/GetTokenPage' });
}
在EntryAbility的onCreate()方法中调用getToken()接口获取Push Token并上报到您的服务端,方便您的服务端向终端推送消息。
import { pushService } from '@kit.PushKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
//点击申请Token按钮,调用push组件的getToken方法获取Token
private getTokenSyn = async () => {
try {
const pushToken = await pushService.getToken();
hilog.info(0x0000, 'testTag', 'Get push token successfully!');
this.showFlag = 'Successfully got push token, please save it.';
} catch (err) {
this.showFlag = 'Failed to get push token, please check the error log!';
let e: BusinessError = err as BusinessError;
hilog.error(0x0000, 'testTag', 'Get push token catch error: %{public}d %{public}s', e.code, e.message);
}
}
点击申请Token按钮,申请成功后页面会出现成功提示,自行保存获取的Token。
Push Token标识了每台设备上每个应用,开发者调用getToken()方法向Push服务端请求Token,获取到Token后可以将Token上报到您自己的应用服务器。一旦应用开发者获得了PushToken,就可以将其存储在服务器上,以便在需要时向特定设备发送推送通知。每当服务器想要发送推送通知时,它会将通知内容、目标PushToken和其他相关信息发送给推送通知服务,然后由推送通知服务负责将通知推送到相应的设备上。
服务卡片开发
推送卡片刷新消息
如今衣食住行娱乐影音应用占据了大多数人的手机,一部手机可以满足日常大多需求,但对需要经常查看或进行简单操作的应用来说,总需要用户点开应用体验较繁琐。针对此种场景,HarmonyOS提供了Form Kit(卡片开发服务),您可以将应用的重要信息或操作前置到卡片,以达到服务直达、减少体验层级的目的。
通过获取上面方式获取Push Token,基于Push Kit的系统级通道,便可以在合适场景向用户即时推送卡片内容,从而提升用户的感知度和活跃度。
将pushToken等信息上报到应用服务端,用于向应用发送卡片刷新消息
// 以下为伪代码
import { Want } from '@kit.AbilityKit';
import { pushService } from '@kit.PushKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { formInfo } from '@kit.FormKit';
async function saveFormInfo(want: Want): Promise<void> {
try {
const formId = want.parameters![formInfo.FormParam.IDENTITY_KEY] as string;
const moduleName = want.moduleName;
const abilityName = want.abilityName;
const formName = want.parameters![formInfo.FormParam.NAME_KEY] as string;
const pushToken: string = await pushService.getToken();
// 将formId, moduleName, abilityName, formName, pushToken 上报到应用服务端
} catch (err) {
let e: BusinessError = err as BusinessError;
hilog.error(0x0000, 'testTag', 'Failed to save form info: %{public}d %{public}s', e.code, e.message);
}
}