#HarmonyOS NEXT体验官# 推送服务卡片开发中获取PushToken

zut唐白川
发布于 2024-7-12 17:08
浏览
1收藏

推送服务卡片开发中获取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);
  }
}

已于2024-7-12 17:10:41修改
2
收藏 1
回复
举报
回复
    相关推荐