# 获取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模块及相关公共模块。
    
    ```
    import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
    import { pushService } from '@kit.PushKit';
    import { hilog } from '@kit.PerformanceAnalysisKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    ```
    
3.  建议在您的UIAbility（例如EntryAbility）的onCreate()方法中调用getToken接口获取Push Token并上报到您的服务端，方便您的服务端向终端推送消息。代码示例：
    
    ```
    const DOMAIN = 0x0000;
    
    export default class EntryAbility extends UIAbility {
      // ...
      // 入参want与launchParam并未使用，为初始化项目时自带参数
      onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
        // ...
        // 获取Push Token
        pushService.getToken().then(token => {
          hilog.info(DOMAIN, 'testTag', 'Succeeded in getting push token.');
          // 将获取的Push Token上报至服务端
        }).catch((err: BusinessError) => {
          hilog.error(DOMAIN, 'testTag', 'Failed to get push token: %{public}d %{public}s', err.code, err.message);
        });
      }
      // ...
    }
    ```
    

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

#### 删除Push Token

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

1.  导入pushService模块及相关公共模块。
    
    ```
    import { pushService } from '@kit.PushKit';
    import { hilog } from '@kit.PerformanceAnalysisKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    const DOMAIN = 0x0000;
    ```
    
2.  调用deleteToken接口删除Push Token。代码示例：
    
    ```
    try {
      pushService.deleteToken((err: BusinessError) => {
        if (err) {
          hilog.error(DOMAIN, 'testTag', 'Failed to delete push token: %{public}d %{public}s', err.code, err.message);
        } else {
          hilog.info(DOMAIN, 'testTag', 'Succeeded in deleting push token.');
        }
      });
    } catch (err) {
      let e: BusinessError = err as BusinessError;
      hilog.error(DOMAIN, 'testTag', 'Failed to delete push token: %{public}d %{public}s', e.code, e.message);
    }
    ```
    

#### Push Token更新回调

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

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

1.  导入pushService模块及相关公共模块。
    
    ```
    import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
    import { pushService } from '@kit.PushKit';
    import { hilog } from '@kit.PerformanceAnalysisKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    ```
    
2.  在您项目的ability（下以PushMessageAbility为例）内调用pushService.on()方法接收token更新的消息。注意，您仅能使用UIAbility接收token更新消息。代码示例：
    
    ```
    const DOMAIN = 0x0000;
    
    export default class PushMessageAbility extends UIAbility {
      onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
        // ...
        const callBack = (data: string) => {
          try {
            hilog.info(DOMAIN, 'testTag', 'update token: %{public}s', data);
          } catch (e) {
            let err: BusinessError = e as BusinessError;
            hilog.error(DOMAIN, 'testTag', 'Failed to update data: %{public}d %{public}s', err.code, err.message);
          }
        }
    
        try {
          // 注册token更新回调场景
          pushService.on('tokenUpdate', this, callBack);
          hilog.info(DOMAIN, 'testTag', 'Register on success');
        } catch (e) {
          let err: BusinessError = e as BusinessError;
          hilog.error(DOMAIN, 'testTag', 'Register on error: %{public}d %{public}s', err.code, err.message);
        }
      }
    
      onDestroy(): void {
        hilog.info(DOMAIN, 'testTag', '%{public}s', 'PushMessageAbility onDestroy');
    
        try {
          // 解除注册token更新回调场景
          pushService.off('tokenUpdate');
          hilog.info(DOMAIN, 'testTag', 'Register off success');
        } catch (e) {
          let err: BusinessError = e as BusinessError;
          hilog.error(DOMAIN, 'testTag', 'Register off error: %{public}d %{public}s', err.code, err.message);
        }
      }
      // ...
    }
    ```
    
3.  在项目工程的 src/main/module.json5文件的abilities模块的**skills**标签中配置**actions**内容为**action.ohos.push.listener**（有且只能有一个ability定义该action，**若同时添加uris参数，则uris内容需为空**）。
    
    ```
    {
      "name": "PushMessageAbility",
      "srcEntry": "./ets/abilities/PushMessageAbility.ets",
      "description": "$string:PushMessageAbility_desc",
      "icon": "$media:layered_image",
      "label": "$string:PushMessageAbility_label",
      "startWindowIcon": "$media:startIcon",
      "startWindowBackground": "$color:start_window_background",
      "launchType": "singleton",
      "exported": false,
      "skills": [
        // 保持现有skill对象不变
        {
          "actions": [
            "com.app.action"
          ]
        },
        // 新增一个独立的skill对象，配置actions参数
        {
          "actions": [
            "action.ohos.push.listener"
          ]
        }
      ]
    // ...
    }
    ```