【HarmonyOS】关于鸿蒙消息推送的心得体会 (一)

【HarmonyOS】关于鸿蒙消息推送的心得体会(一)

前言

这几天调研了鸿蒙消息推送的实现方式,形成了开发设计方案,颇有体会,与各位分享。

虽然没做之前觉得很简单的小功能,貌似只需要和华为服务器通信,发送通知即可,然后做做通知栏的UI设置,应用接收关键字处理跳转or展示表现。

但是万万没想到,光是摸了一下官方文档就感觉水很深。更别说第三方厂商封装的推送SDK了。

私聊讨论的事宜

最近很多同学私聊问我开发相关的问题,我是比较喜欢和别人讨论问题,毕竟真理越辩越明,和别人讲解讨论的过程,我也在持续成长。

但是不要上班时间崔我问,这让我有点难顶。私聊问我,一般工作日只会下班看下CSDN,看到就会回复,不用着急。

如果真是特别急的开发问题,我觉得可以换个渠道去请教。像手机上这些应用,除了wx这种即时通讯的软件。

我一般都会把通知关闭。减少外界信息的打扰。各位也可以试试,这样能提升专注力。

但是APP当然是期望通知功能开启,把信息及时推送给用户,达到拉日活儿,拉流量的效果。

那鸿蒙中如何实现呢?废话不多说了,下面参见。

鸿蒙Push Kit的效果和功能表现

学习和了解一个事物,我本人喜欢先研究其背景,知其然才能知其所以然。这样我们才能有具体的事务框架思路,在细节上才能有的放矢。若一上来就看API写代码,就像打游戏不看全地图一样,效率会很低。

首先我们要知道,在鸿蒙中使用的推送服务,是华为HMS能力中的推送服务。

HMS Core - App Services - PushKit。

(1) 服务定义:
推送服务(Push Kit)是华为提供的消息推送平台,建立了从云端到终端的消息推送通道。您通过集成推送服务,可以向客户端应用实时推送消息,构筑良好的用户关系,提升用户的感知度和活跃度。

在这里插入图片描述

(2) 服务表现:
通知栏消息通过推送服务通道直接下发,在终端设备的通知中心呈现,不需要应用进程驻留后台。用户点击通知栏消息后触发相应的动作,如打开应用、打开网页等。

可以自定义通知栏消息样式(小图、按钮等)和提醒方式(锁屏、横幅和角标)来吸引用户,从而提高应用的日活跃用户数量。

服务常用场景:即时通讯消息传送、帐号动态等。

AGC平台开通推送服务,配置推送设置项

首先要去华为AGC平台去将你的应用开通推送服务,一般应用是不会有推送,必须去平台开通才行。
在这里插入图片描述
开通服务之后,点击配置tab,进去配置页面。可以看到如图所示内容,刚才我们已经完成第一步,现在需要进行第二步和第三步。
在这里插入图片描述
华为的推送包括标准默认的推送类型 和 自分类权益。如果不开通第三步,每天最多只能推送两条通知。当然自分类权益是需要申请,点击去看要求傻瓜操作即可。

代码讲解

在这里插入图片描述

    "metadata": [
      {
        "name": "client_id",
        "value": "xxxxxx" // AGC平台上的clientid
      },
    ],

然后我们需要获取Push Kit提供的Token,用于后续推送处理。然后推送,当然有唯一标识来进行推送。我们自己的APP有用户id作为唯一标识,设备也有自己id。这时我们就需要将设备id和用户id进行绑定,用于华为的PushKit 顺利推送给用户。

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';
import { AAID, pushCommon, pushService } from '@kit.PushKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');

    try {
      // 获取应用匿名标识符(AAID,Anonymous Application Identifier)的能力。AAID用于标识应用身份。
      AAID.getAAID((err: BusinessError, data: string) => {
        if (err) {
          hilog.error(0x0000, 'testTag', 'Failed to get AAID: %{public}d %{public}s', err.code, err.message);
        } else {
          hilog.info(0x0000, 'testTag', 'Succeeded in getting AAID');
        }
      });
    } catch (err) {
      let e: BusinessError = err as BusinessError;
      hilog.error(0x0000, 'testTag', 'Failed to get AAID: %{public}d %{public}s', e.code, e.message);
    }

    try {
      // 获取推送服务的Token
      pushService.getToken((err: BusinessError, data: string) => {
        if (err) {
          hilog.error(0x0000, 'testTag', 'Failed to get push token: %{public}d %{public}s', err.code, err.message);
        } else {
          // 成功获取到Token 说明AGC平台设置相关操作都OK
          hilog.info(0x0000, 'testTag', 'Succeeded in getting push token');
        }
      });
    } 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);
    }

    // 定义需要绑定的profileId
    // 帐号匿名标识,不可为空字符串。不建议使用真实的帐号id,推荐使用帐号id自行生成对应的匿名标识,能与该账号id建立唯一映射关系即可,生成算法无限制。
    const profileId: string = '1****9';
    try {
      // pushCommon.AppProfileType 应用内帐号类型,分为华为帐号和应用帐号。我这里选择后者,根据业务需求选择的。
      pushService.bindAppProfileId(pushCommon.AppProfileType.PROFILE_TYPE_APPLICATION_ACCOUNT, profileId, (err: BusinessError) => {
        if (err) {
          hilog.error(0x0000, 'testTag', 'Failed to bind app profile id: %{public}d %{public}s', err.code, err.message);
        } else {
          hilog.info(0x0000, 'testTag', 'Succeeded in binding app profile id.');
        }
      });
    } catch (err) {
      let e: BusinessError = err as BusinessError;
      hilog.error(0x0000, 'testTag', 'Failed to bind app profile id: %{public}d %{public}s', e.code, e.message);
    }
  }

  onDestroy(): void {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    // Main window is created, set main page for this ability
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

    windowStage.loadContent('pages/Index', (err) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.');
    });
  }

  onWindowStageDestroy(): void {
    // Main window is destroyed, release UI related resources
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground(): void {
    // Ability has brought to foreground
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  }

  onBackground(): void {
    // Ability has back to background
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  }
}

Push Kit API下沉HarmonyOS,应用可免SDK集成。通过提供系统级长链接,即使应用进程不在也能实时推送消息。
Push Kit API下沉HarmonyOS,应用可免SDK集成。通过提供系统级长链接,即使应用进程不在也能实时推送消息。
Push Kit API下沉HarmonyOS,应用可免SDK集成。通过提供系统级长链接,即使应用进程不在也能实时推送消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/802180.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

玩转HarmonyOS NEXT之AppStorage应用全局UI状态存储

概述 AppStorage是应用全局的UI状态存储,是和应用的进程绑定的,由UI框架在应用程序启动时创建,为应用程序UI状态属性提供中央存储。 AppStorage是在应用启动的时候会被创建的单例。它的目的是为了提供应用状态数据的中心存储,这…

【HarmonyOS学习】Calendar Kit日历管理

简介 Calendar Kit提供日历与日程管理能力,包括日历的获取和日程的创建能力。 Calendar Kit为用户提供了一系列接口来获取日历账户,并使用特定的接口向日历账户中写入日程。 如果写入的日程带有提醒时间则系统会在时间到达时向用户发送提醒。 约束点…

Linux编程(通信协议---udp)

UDP(用户数据报协议)是一种无连接的网络协议,主要用于快速传输数据。以下是UDP协议的一些主要特点: 1. **无连接**:UDP是无连接的协议,这意味着在数据传输之前不需要建立连接。每个UDP数据包都是独立的&am…

remote: ERROR: commit b81ea84: missing Change-Id in message footer

首次拉取代码后,在本地已经编辑添加了代码并且想要提交到远端仓库 git add . git commit 当commit之后想要pull的时候报错了 git pull 执行到git pull 时出现这个问题,这是由于Change-Id没了,提示: ! [remote rejected] HEAD -> refs/for/master (commit b81ea84: mis…

git回退分支版本git reset --hard HEAD

git回退分支版本git reset --hard HEAD git reset --hard HEAD 上面命令清除本地所有修改,与下面相似: git reset --hard origin/master 等同于: git reset --hard HEAD~0 说明: HEAD 当前版本 HEAD^ 上一个版本 HEAD^^ 上上…

JVM---对象是否存活及被引用的状态

1.如何判断对象是否存活 1.1 引用计数算法 概念:在对象头部增加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。 优点&#xff1…

LabVIEW学习-LabVIEW储存Excel表格

上述实现了将格式化的时间和正弦波的频率振幅相位以及正弦波数据输入到excel表格中。 下面介绍其中使用到的函数: 1. 所在位置,函数选板->定时->获取日期/时间(秒) 2. 将获取的时间进行格式化处理,输出格式化的日期/时间字符串。 函…

AI赋能基础设施巡检,技术革新助力水泥建筑缺陷检测分析,基于YOLOv8模型开发构建水泥建筑场景下裂缝缺陷分割检测识别系统

在现代化城市建设的宏伟蓝图中,公路、隧道、桥梁、大坝等水泥类基础设施如同城市的血脉,支撑着社会的正常运转与经济的蓬勃发展。然而,时间的侵蚀与自然的考验使得这些建筑不可避免地面临老化与损坏的问题,裂缝作为其中最为常见的…

AV1 编码标准环路滤波和后处理技术概述

AV1 环路滤波 去块滤波器 在视频编码的环路滤波管道中,去块滤波器(deblocking filter)用于减少量化引起的变换块边界处的块状伪影。 总结: 去块滤波器的应用: 对于亮度(luma)色度分量&#xff…

minIO集成springboot

问题 minIO与spring集成。 步骤 创建桶 创建key 找到创建账号页面,如下图: 点击创建,如下图: 设置如下权限: {"Version": "2012-10-17","Statement": [{"Effect": &q…

华为OD算法题汇总

60、计算网络信号 题目 网络信号经过传递会逐层衰减,且遇到阻隔物无法直接穿透,在此情况下需要计算某个位置的网络信号值。注意:网络信号可以绕过阻隔物 array[m][n],二维数组代表网格地图 array[i][j]0,代表i行j列是空旷位置 a…

如何在所有docker命令前加上一个sudo

如果当前登录用户不是root不用,使用docker命令的时候,需要在前面加上一个sudo 提升权限。 但是每次都加,就感觉特别的麻烦,如何简化呢? 解决办法 打开你的shell配置文件(例如,如果你使用bash&am…

Spring Cloud Eureka快读入门Demo

1.什么是Eureka? Eureka 由 Netflix 开发,是一种基于REST(Representational State Transfer)的服务,用于定位服务(服务注册与发现),以实现中间层服务的负载均衡和故障转移&#xff…

C语言 | Leetcode C语言题解之第239题滑动窗口最大值

题目&#xff1a; 题解&#xff1a; int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize) {int prefixMax[numsSize], suffixMax[numsSize];for (int i 0; i < numsSize; i) {if (i % k 0) {prefixMax[i] nums[i];} else {prefixMax[i] fmax(pref…

甄选范文“论软件维护方法及其应用”软考高级论文,系统架构设计师论文

论文真题 软件维护是指在软件交付使用后,直至软件被淘汰的整个时间范围内,为了改正错误或满足 新的需求而修改软件的活动。在软件系统运行过程中,软件需要维护的原因是多种多样的, 根据维护的原因不同,可以将软件维护分为改正性维护、适应性维护、完善性维护和预防性 维护…

Mindspore框架CycleGAN模型实现图像风格迁移|(三)损失函数计算

Mindspore框架&#xff1a;CycleGAN模型实现图像风格迁移算法 Mindspore框架CycleGAN模型实现图像风格迁移|&#xff08;一&#xff09;CycleGAN神经网络模型构建 Mindspore框架CycleGAN模型实现图像风格迁移|&#xff08;二&#xff09;实例数据集&#xff08;苹果2橘子&…

JAVA 异步编程(异步,线程,线程池)一

目录 1.概念 1.1 线程和进程的区别 1.2 线程的五种状态 1.3 单线程,多线程,线程池 1.4 异步与多线程的概念 2. 实现异步的方式 2.1 方式1 裸线程&#xff08;Thread&#xff09; 2.1 方式2 线程池&#xff08;Executor&#xff09; 2.1.1 源码分析 2.1.2 线程池创建…

新的“SCALE”软件允许为 AMD GPU 原生编译 CUDA 应用程序

虽然已经有各种努力&#xff0c;如HIPIFY来帮助将CUDA源代码转换为AMD GPU的可移植C代码&#xff0c;然后是之前AMD资助的ZLUDA&#xff0c;允许CUDA二进制文件通过CUDA库的直接替代品在AMD GPU上运行&#xff0c;但有一个新的竞争者&#xff1a;SCALE。SCALE现在作为GPGPU工具…

超算网络体系架构-资源层-平台层-服务层-应用层

目录 超算网络体系架构 我国超算基础设施 超算互联网相关标准研制方面 技术架构 资源层 基础资源 芯片多样 体系异构 高效存储 高速互连 资源池化 可隔离 可计量 互联网络 高带宽 低时延 高安全 平台层 算力接入 资源管理 算力调度 用户管理 交易管理 模…

基于springboot和mybatis的RealWorld后端项目实战二之实现tag接口

修改pom.xml 新增tag数据表 SET FOREIGN_KEY_CHECKS0;-- ---------------------------- -- Table structure for tags -- ---------------------------- DROP TABLE IF EXISTS tags; CREATE TABLE tags (id bigint(20) NOT NULL AUTO_INCREMENT,name varchar(255) NOT NULL,PR…