鸿蒙 消息推送:Push Token的获取(四)

一、Push Token

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

Push Token变化场景

Push Token一般情况不会变化,以下场景会导致Push Token发生变化而失效:

场景 说明
卸载后重新安装 Push Token失效
设备恢复出厂设置 Push Token失效
显式调用deleteToken()后重新调用getToken() Push Token发生变化
显式调用deleteAAID()后重新调用getToken() Push Token发生变化
设备(仅Wearable)拿到海外其他国家或地区 系统自动更新token,通过tokenUpdate回调返回

建议 :在应用启动时调用getToken()接口,若Push Token发生变化,及时上报到应用服务器更新,以防收不到消息。

二、版本支持情况

设备类型 支持版本
Phone 支持
Tablet 支持
PC/2in1 支持
Wearable 5.1.0(18)+
TV 5.1.1(19)+

三、注意事项

注意事项 说明
不要用于用户跟踪 请勿使用Push Token跟踪标记用户
不要固定长度判断 Push Token长度可能会变化
申请频率 禁止频繁申请,建议每次启动时获取
前提条件 只有在AGC平台开通推送服务后,getToken才会返回Push Token

四、核心接口

接口 描述
getToken() 获取Push Token(Promise/Callback)
deleteToken() 删除Push Token(Promise/Callback)
on('tokenUpdate', callback) 注册Token更新回调
off('tokenUpdate') 解除Token更新回调

五、获取Push Token

5.1 开发前提

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

5.2 导入模块

复制代码
import { pushService } from '@kit.PushKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit';

5.3 在UIAbility中获取Push Token

建议在UIAbility(例如EntryAbility)的onCreate()方法中调用getToken()接口获取Push Token并上报到服务端。

复制代码
// 文件路径: src/main/ets/entryability/EntryAbility.ets
export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // 获取Push Token
    pushService.getToken().then(token => {
      hilog.info(0x0000, 'testTag', 'Succeeded in getting push token');
      // 上报Push Token到您的服务端
    }).catch((err: BusinessError) => {
      hilog.error(0x0000, 'testTag', 'Failed to get push token: %{public}d %{public}s', err.code, err.message);
    });
  }
}

六、删除Push Token

复制代码
// 文件路径: src/main/ets/entryability/EntryAbility.ets
export default class EntryAbility extends UIAbility {
  async myDeletePushToken() {
    try {
      await pushService.deleteToken();
      hilog.info(0x0000, 'testTag', 'Succeeded in deleting push token');
    } catch (err) {
      let e: BusinessError = err as BusinessError;
      hilog.error(0x0000, 'testTag', 'Failed to delete push token: %{public}d %{public}s', e.code, e.message);
    }
  }
}

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

七、Push Token更新回调

7.1 支持设备

设备类型 支持版本
Wearable 支持
Phone、Tablet、PC/2in1 6.1.0(23)+

7.2 注册Token更新回调

当设备离开当前国家或地区时,可能会触发Push Token自动更新。应用需要调用on接口进行回调注册。

复制代码
// 文件路径: src/main/ets/abilities/PushMessageAbility.ets
import { UIAbility } from '@kit.AbilityKit';
import { pushService } from '@kit.PushKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';

export default class PushMessageAbility extends UIAbility {
  onCreate(): void {
    const callBack = (data: string) => {
      try {
        hilog.info(0x0000, 'testTag', 'update token: %{public}s', data);
      } catch (e) {
        let err: BusinessError = e as BusinessError;
        hilog.error(0x0000, 'testTag', 'Failed to update data: %{public}d %{public}s', err.code, err.message);
      }
    };

    try {
      // 注册token更新回调场景
      pushService.on('tokenUpdate', this, callBack);
      hilog.info(0x0000, 'testTag', 'Register on success');
    } catch (e) {
      let err: BusinessError = e as BusinessError;
      hilog.error(0x0000, 'testTag', 'Register on error: %{public}d %{public}s', err.code, err.message);
    }
  }

  onDestroy(): void {
    try {
      // 解除注册token更新回调场景
      pushService.off('tokenUpdate');
      hilog.info(0x0000, 'testTag', 'Register off success');
    } catch (e) {
      let err: BusinessError = e as BusinessError;
      hilog.error(0x0000, 'testTag', 'Register off error: %{public}d %{public}s', err.code, err.message);
    }
  }
}

7.3 module.json5配置

src/main/module.json5文件的abilities模块中配置skills标签,添加action.ohos.push.listener(有且只能有一个ability定义该action)。

复制代码
"abilities": [
  {
    "name": "PushMessageAbility",
    "srcEntry": "./ets/abilities/PushMessageAbility.ets",
    "launchType": "singleton",
    "exported": false,
    "skills": [
      {
        "actions": [
          "action.ohos.push.listener"
        ]
      }
    ]
  }
]
相关推荐
思录Echo33 分钟前
自助易AI数字人外挂技术剖析|如何解决政企智能客服的多端适配难题?
人工智能·华为·harmonyos
方白羽1 小时前
为什么 Android 非要用 Intent 传值?
android·ios·harmonyos
不爱吃糖的程序媛8 小时前
从 0 到 1:react-native-transformer-text-input 鸿蒙化适配实录
react native·transformer·harmonyos
不爱吃糖的程序媛8 小时前
React Native 三方库鸿蒙适配实战:react-native-emoji-popup(Fabric 自定义组件)从 0 到 1
react native·harmonyos·fabric
贾伟康8 小时前
【口算王|19】HarmonyOS ArkTS 回归测试实战:覆盖启动、空数据、异常输入和重复点击
软件测试·harmonyos·arkts·回归测试·hypium
贾伟康8 小时前
【句匠|09】HarmonyOS ArkTS 学习统计实战:汇总正确率、连续学习和薄弱类型
harmonyos·arkts·appstorage·学习统计·本地统计
贾伟康8 小时前
【口算王|17】HarmonyOS ArkTS 亮暗色与视觉令牌实战:集中颜色、间距和交互状态避免页面割裂
harmonyos·arkts·arkui·深色模式·ui设计
搬砖的kk8 小时前
从 0 到 1:react-native-screenshot-aware 鸿蒙适配实战(RNOH 0.84)
react native·华为·harmonyos
贾伟康9 小时前
【口算王|15】HarmonyOS ArkTS 本地状态持久化实战:让保存、删除和页面返回后的数据即时一致
harmonyos·arkts·数据持久化·状态管理·preferences
贾伟康9 小时前
【口算王|18】HarmonyOS ArkTS 权限与隐私实战:让 module.json5、功能说明和拒绝路径一致
harmonyos·arkts·权限管理·隐私合规·module.json5