文档管理中心
我的

您当前正在浏览新版开发者文档中心,目录分类和层级有所调整。点击左侧当前文档分类名称前的“☰”图标,可切换文档分类。 了解新版目录

指南与API参考指南应用服务Push Kit(推送服务)开发准备获取Push Token

获取Push Token

场景介绍

说明

Push Kit对Push Token进行了权益校验,请在进行开发前先阅读开通推送服务章节,完成相关配置。

Push Token标识了每台设备上每个应用,开发者调用getToken接口向Push Kit服务端请求Push Token,获取到之后使用Push Token来推送消息。

Push Token一般情况不会变化,仅下列场景会导致之前的Push Token发生变化而失效:

  • 卸载应用后重新安装。

  • 设备恢复出厂设置。

  • 应用显式调用deleteToken接口后重新调用getToken接口。

  • 应用显式调用deleteAAID接口后重新调用getToken接口。

  • 将设备(仅涉及Wearable设备)拿到海外其他国家或者地区后,系统会更新设备的token。更新后的token通过pushService.on('tokenUpdate')接口的回调返回。

因此,建议您在应用启动时调用getToken接口,若设备的Push Token发生变化,及时上报到您的应用服务器更新Push Token,以防由于Push Token失效导致收不到消息。

约束与限制

获取Push Token能力支持Phone、Tablet、PC/2in1设备。并且从5.1.0(18)版本开始,新增支持Wearable设备;从5.1.1(19)版本开始,新增支持TV设备。

注意事项

  • 请勿使用Push Token跟踪标记用户。

  • 应用不要固定判断Push Token长度,因为Push Token长度可能会变化。

  • 禁止应用频繁申请Push Token。建议应用每次启动时获取Push Token。

  • 只有在AppGallery Connect平台开通推送服务后,getToken方法才会返回Push Token。

接口说明

接口返回值有两种返回形式:Callback和Promise回调。下表中仅展示Promise回调形式的接口,Promise和Callback只是返回值方式不一样,功能相同。

展开
接口名 描述
getToken(): Promise<string> 以Promise形式获取Push Token。
deleteToken(): Promise<void> 以Promise形式删除Push Token。

获取Push Token

  1. Push Kit对Push Token进行了权益校验,请在进行开发前先阅读开通推送服务章节,完成相关配置。

  2. 导入pushService模块及相关公共模块。

    收起
    自动换行
    深色代码主题
    复制
    1. import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
    2. import { pushService } from '@kit.PushKit';
    3. import { hilog } from '@kit.PerformanceAnalysisKit';
    4. import { BusinessError } from '@kit.BasicServicesKit';
  3. 建议在您的UIAbility(例如EntryAbility)的onCreate()方法中调用getToken接口获取Push Token并上报到您的服务端,方便您的服务端向终端推送消息。代码示例:

    收起
    自动换行
    深色代码主题
    复制
    1. const DOMAIN = 0x0000;
    2. export default class EntryAbility extends UIAbility {
    3. // ...
    4. // 入参want与launchParam并未使用,为初始化项目时自带参数
    5. onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    6. // ...
    7. // 获取Push Token
    8. pushService.getToken().then(token => {
    9. hilog.info(DOMAIN, 'testTag', 'Succeeded in getting push token.');
    10. // 将获取的Push Token上报至服务端
    11. }).catch((err: BusinessError) => {
    12. hilog.error(DOMAIN, 'testTag', 'Failed to get push token: %{public}d %{public}s', err.code, err.message);
    13. });
    14. }
    15. // ...
    16. }
说明

若您获取Push Token时发生APP身份验证失败错误(1000900010),请参考ArkTS API错误码排查。

删除Push Token

说明

删除Push Token后,本应用下的所有Push Kit历史数据会一并删除。非必要情况,请您不要主动调用deleteToken接口。

  1. 导入pushService模块及相关公共模块。

    收起
    自动换行
    深色代码主题
    复制
    1. import { pushService } from '@kit.PushKit';
    2. import { hilog } from '@kit.PerformanceAnalysisKit';
    3. import { BusinessError } from '@kit.BasicServicesKit';
    4. const DOMAIN = 0x0000;
  2. 调用deleteToken接口删除Push Token。代码示例:

    收起
    自动换行
    深色代码主题
    复制
    1. try {
    2. pushService.deleteToken((err: BusinessError) => {
    3. if (err) {
    4. hilog.error(DOMAIN, 'testTag', 'Failed to delete push token: %{public}d %{public}s', err.code, err.message);
    5. } else {
    6. hilog.info(DOMAIN, 'testTag', 'Succeeded in deleting push token.');
    7. }
    8. });
    9. } catch (err) {
    10. let e: BusinessError = err as BusinessError;
    11. hilog.error(DOMAIN, 'testTag', 'Failed to delete push token: %{public}d %{public}s', e.code, e.message);
    12. }

Push Token更新回调

说明

Push Token更新回调能力支持Wearable设备。并且从6.1.0(23)版本开始,新增支持Phone、Tablet、PC/2in1设备。

当设备离开当前国家或地区时,可能会触发Push Token自动更新,如果应用期望感知到Push Token更新事件,需要调用on接口进行回调注册;对应的,可以调用off接口解除回调注册,解除后当Push Token更新时,应用将不会收到回调。

  1. 导入pushService模块及相关公共模块。

    收起
    自动换行
    深色代码主题
    复制
    1. import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
    2. import { pushService } from '@kit.PushKit';
    3. import { hilog } from '@kit.PerformanceAnalysisKit';
    4. import { BusinessError } from '@kit.BasicServicesKit';
  2. 在您项目的ability(下以PushMessageAbility为例)内调用pushService.on()方法接收token更新的消息。注意,您仅能使用UIAbility接收token更新消息。代码示例:

    收起
    自动换行
    深色代码主题
    复制
    1. const DOMAIN = 0x0000;
    2. export default class PushMessageAbility extends UIAbility {
    3. onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    4. // ...
    5. const callBack = (data: string) => {
    6. try {
    7. hilog.info(DOMAIN, 'testTag', 'update token: %{public}s', data);
    8. } catch (e) {
    9. let err: BusinessError = e as BusinessError;
    10. hilog.error(DOMAIN, 'testTag', 'Failed to update data: %{public}d %{public}s', err.code, err.message);
    11. }
    12. }
    13. try {
    14. // 注册token更新回调场景
    15. pushService.on('tokenUpdate', this, callBack);
    16. hilog.info(DOMAIN, 'testTag', 'Register on success');
    17. } catch (e) {
    18. let err: BusinessError = e as BusinessError;
    19. hilog.error(DOMAIN, 'testTag', 'Register on error: %{public}d %{public}s', err.code, err.message);
    20. }
    21. }
    22. onDestroy(): void {
    23. hilog.info(DOMAIN, 'testTag', '%{public}s', 'PushMessageAbility onDestroy');
    24. try {
    25. // 解除注册token更新回调场景
    26. pushService.off('tokenUpdate');
    27. hilog.info(DOMAIN, 'testTag', 'Register off success');
    28. } catch (e) {
    29. let err: BusinessError = e as BusinessError;
    30. hilog.error(DOMAIN, 'testTag', 'Register off error: %{public}d %{public}s', err.code, err.message);
    31. }
    32. }
    33. // ...
    34. }
  3. 在项目工程的 src/main/module.json5文件的abilities模块的skills标签中配置actions内容为action.ohos.push.listener(有且只能有一个ability定义该action,若同时添加uris参数,则uris内容需为空)。

    收起
    自动换行
    深色代码主题
    复制
    1. {
    2. "name": "PushMessageAbility",
    3. "srcEntry": "./ets/abilities/PushMessageAbility.ets",
    4. "description": "$string:PushMessageAbility_desc",
    5. "icon": "$media:layered_image",
    6. "label": "$string:PushMessageAbility_label",
    7. "startWindowIcon": "$media:startIcon",
    8. "startWindowBackground": "$color:start_window_background",
    9. "launchType": "singleton",
    10. "exported": false,
    11. "skills": [
    12. // 保持现有skill对象不变
    13. {
    14. "actions": [
    15. "com.app.action"
    16. ]
    17. },
    18. // 新增一个独立的skill对象,配置actions参数
    19. {
    20. "actions": [
    21. "action.ohos.push.listener"
    22. ]
    23. }
    24. ]
    25. // ...
    26. }