3个步骤轻松集成Push Kit,实现App消息推送

news2024/12/23 18:36:34

推送通知作为App重要的消息传递工具,广泛应用于电子商务、社交媒体、旅游交通等领域的通知场景。比如当应用有新功能或安全补丁时,系统将推送消息提醒用户及时更新;如果是航班出行类的应用,会发送最新的班次时间表给用户,以确保及时提醒。推送通知是App与用户建立联系,保持信任和满意度的重要方式,那么App怎样才能实现发送通知消息给用户呢?

HarmonyOS SDK推送服务(Push Kit)是华为提供的消息推送平台,建立了从云端到终端的消息推送通道,通过集成推送服务,HarmonyOS应用就可以实现向用户实时推送通知消息。其显示场景主要包括通知中心、锁屏、横幅、桌面图标角标与通知图标。

业务流程

实现推送通知消息的业务流程包括申请并获取Push Token、上报Token等信息至应用服务端、发送推送消息请求、下发消息到Push Kit和处理消息5个步骤。

名词解释

在学习实现推送通知消息的能力之前,我们先来学习几个专有名词。

Push Token:

Push Token标识了每台设备上的每个应用,开发者调用getToken()接口向Push Kit服务端请求Token,在获取到Token后,需要使用Push Token来推送消息。当在应用启动时调用getToken()接口时,如果设备的Token发生变化,开发者需要及时上报到应用服务器更新Token。

Category:

通知消息类别。为了改善终端用户推送体验,Push Kit对通知消息进行分类管理,category的取值不同,标识的消息类型则不同,不同的通知消息类型影响消息展示和提醒方式,开发者在推送消息前,需先申请通知消息自分类权益。

开发步骤

实现通过Push Kit推送通知消息主要分为三个步骤,分别为获取Push Token、告知用户需要允许接收通知消息、推送通知消息。

1.获取Push Token。

首先导入pushService模块,建议在您的UIAbility(例如EntryAbility)的onCreate()方法中调用getToken()接口获取Push Token并上报到您的服务端,方便您的服务端向终端推送消息。

import { pushService } from '@kit.PushKit';
//导入pushService模块。
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit';

export default class EntryAbility extends UIAbility {
  // 入参 want 与 launchParam 并未使用,为初始化项目时自带参数
  async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): Promise<void> {
    // 获取Push Token
    try {
      const pushToken: string = await pushService.getToken();
      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);
    }
    // 上报Push Token并上报到您的服务端
  }
}

2.应用需要获取用户授权才能发送通知,为确保应用可正常收到消息,建议应用发送通知前调用requestEnableNotification()方法,弹窗让用户选择是否允许发送通知。

import { notificationManager } from '@kit.NotificationKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { common } from '@kit.AbilityKit';

const TAG: string = '[PublishOperation]';
const DOMAIN_NUMBER: number = 0xFF00;

let context = getContext(this) as common.UIAbilityContext;
notificationManager.isNotificationEnabled().then((data: boolean) => {
  console.info("isNotificationEnabled success, data: " + JSON.stringify(data));
  if(!data){
    notificationManager.requestEnableNotification(context).then(() => {
      hilog.info(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification success`);
    }).catch((err : BusinessError) => {
      if(1600004 == err.code){
        hilog.error(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification refused, code is ${err.code}, message is ${err.message}`);
      } else {
        hilog.error(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification failed, code is ${err.code}, message is ${err.message}`);
      }
    });
  }
}).catch((err : BusinessError) => {
    hilog.error(DOMAIN_NUMBER, TAG, `isNotificationEnabled fail: ${JSON.stringify(err)}`);
});

3.应用服务端调用Push Kit服务端的REST API推送通知消息。

// Request URL
POST https://push-api.cloud.huawei.com/v3/[projectId]/messages:send

// Request Header
Content-Type: application/json
Authorization: Bearer eyJr*****OiIx---****.eyJh*****iJodHR--***.QRod*****4Gp---****
push-type: 0

// Request Body
{
  "payload": {
    "notification": {
      "category": "MARKETING",
      "title": "普通通知标题",
      "body": "普通通知内容",
      "clickAction": {
        "actionType": 0
        "data": {"testKey": "testValue"}
      },
      "notifyId": 12345
    }
  },
  "target": {
    "token": ["IQAAAA**********4Tw"]
  },
  "pushOptions": {
    "testMessage": true
  }
}

在推送通知消息的这段示例代码中,projectId为项目ID,可登录AppGallery Connect网站,选择"我的项目",在项目列表中选择对应的项目,左侧导航栏选择"项目设置",在该页面获取;push-type为0表示通知消息场景;actionType为0表示点击消息打开应用首页。

此外,当actionType为1时,则代表点击消息打开应用内自定义页面,如果要实现点击消息打开指定的应用内页面,需要先设置待跳转Ability的skills标签中的actions或uris值。

设置actions参数完成点击消息进入应用内页的示例如下:

{
  "name": "TestAbility",
  "srcEntry": "./ets/abilities/TestAbility.ets",
  "exported": false,
  "startWindowIcon": "$media:icon",
  "startWindowBackground": "$color:start_window_background",
  "skills": [
    {
      "actions": [
        "com.test.action"
      ]
    }
  ]
}

如果要通过设置uris参数完成点击消息进入应用内页,skills中必须同时设置actions参数,且actions参数为空。

"skills": [
  {
    "actions": [""],
    "uris": [
      {
        "scheme": "https",
        "host": "www.xxxx.com",
        "port": "8080",
        "path": "push/test"
      }
    ]
  }
]

设置完skills标签后,在发送消息时,clickAction中需携带data字段并设置actionType字段为1,则可实现点击消息进入指定的应用内页面。

// Request URL
POST https://push-api.cloud.huawei.com/v3/[projectId]/messages:send

// Request Header
Content-Type: application/json
Authorization: Bearer eyJr*****OiIx---****.eyJh*****iJodHR--***.QRod*****4Gp---****
push-type: 0

// Request Body
{
  "payload": {
    "notification": {
      "category": "MARKETING",
      "title": "普通通知标题",
      "body": "普通通知内容",
      "clickAction": {
        "actionType": 1,
        "action": "com.test.action",
        "uri": "https://www.xxxx.com:8080/push/test",
        "data": {"testKey": "testValue"}
      }
    }
  },
  "target": {
    "token": ["IQAAAA**********4Tw"]
  },
  "pushOptions": {
    "testMessage": true
  }
}

其中需要注意的是,在获取消息中传递的data数据时,如果是点击消息首次进入应用首页或应用内页,可以在onCreate()方法中获取消息data数据。

import { UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';

export default class MainAbility extends UIAbility {
  onCreate(want: Want): void {
    // 获取消息中传递的data数据
    const data = want.parameters;
    hilog.info(0x0000, 'testTag', 'Succeeded in getting message data');
    // 根据实际业务场景对data进行处理
   }
}

如果当前应用进程存在时,点击消息进入应用首页或应用内页,可以在onNewWant()方法中获取消息data数据,且onNewWant()方法仅在单例(singleton)模式下可用。

import { UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';

export default class MainAbility extends UIAbility {
  onNewWant(want: Want): void {
    // 获取消息中传递的data数据
    const data = want.parameters;
    hilog.info(0x0000, 'testTag', 'Succeeded in getting message data');
    // 根据实际业务场景对data进行处理
  }
}

在实际开发过程中,以上两种方式都需要注意到。在成功发送消息后,可以检查设备是否收到了通知消息,至此,通过Push Kit发送通知消息的步骤就结束了。

在推送通知消息时,还存在一种情况,那就是当推送的通知消息有错误或者存在违规情况时,可能会引起用户投诉或面临监管风险。基于此,Push Kit还提供消了息撤回功能,以降低此类推送可能造成的影响。

需要注意的是,消息撤回仅支持还未下发到端侧的消息,或者已在终端展示但用户还未点击的消息,并且仅支持使用Token和notifyId撤回。

在成功推送通知消息后,如果需要撤回消息,需要确保应用可正常收到通知消息,并且在推送消息时设置了notifyId字段,这样应用服务端就可以调用REST API撤回通知消息了。

// Request URL 
POST https://push-api.cloud.huawei.com/v1/[clientId]/messages:revoke
 
// Request Header 
Content-Type:application/json
Authorization:Bearer eyJr*****OiIx---****.eyJh*****iJodHR--***.QRod*****4Gp---****
push-type: 0 
 
// Request Body 
{
  "notifyId": 1234567,
  "token": [
    "pushToken1",
    "pushToken2",
    "pushToken3"
  ]
}

这里代码中的clientId需要替换为应用的Client ID,获取方式与projectId一样。notifyId作为消息ID,是消息的唯一标识。

通过以上步骤,我们就可以实现通过Push Kit推送和撤回普通通知消息了,在此能力的基础上,我们还可以继续探索Push Kit的更多个性化服务能力,为应用的拉新促活创造更多可能性。

了解更多详情>>

访问推送服务联盟官网

获取推送通知消息开发指导文档

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

44 C 语言输入输出流、scanf 与 printf 函数详解、清除输入缓冲区

目录 1 文件基本介绍 1.1 文件的主要功能 1.2 输入输出流 2 C 语言中的输入与输出 2.1 输入 2.2 输出 2.3 标准文件与文件指针 3 scanf() 函数详解 3.1 功能描述 3.2 函数原型 3.3 常用格式说明符 3.4 返回值 3.5 注意事项 3.5.1 处理空白字符 3.5.2 防止缓冲区…

基于K-means和RFM模型的电商行业用户画像及商品个性化推荐研究

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍数据概览数据预处理可视化过程展示RFM模型K-means及改进算法每文一语 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍 本研究基于阿里天池…

玩转OurBMC第十一期:kdump原理分析(上)

栏目介绍&#xff1a;“玩转OurBMC”是OurBMC社区开创的知识分享类栏目&#xff0c;主要聚焦于社区和BMC全栈技术相关基础知识的分享&#xff0c;全方位涵盖了从理论原理到实践操作的知识传递。OurBMC社区将通过“玩转OurBMC”栏目&#xff0c;帮助开发者们深入了解到社区文化、…

echarts 中添加图片/图标

let myChart echarts.init(this.$refs.chartOne); // 注意这里的 ref 引用 myChart.setOption({ tooltip: {trigger: item,formatter: {b} : {c}},series: [{type: pie,radius: 50%,data: this.swjList,label: {formatter: (params) > {if (params.name ! ) {let percent…

代码随想录 -- 回溯 -- N皇后

51. N 皇后 - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; 从抽象树中可以看出递归的层数取决于棋盘的行数&#xff0c;for循环的次数取决于棋盘的列数。 递归参数&#xff1a;存放当前棋盘的数组chessboard、当前行row、总行数n。递归终止条件&#xff1a;当 ro…

【C++网络编程】(二)Linux平台下UDP客户/服务端程序

Linux平台下UDP客户/服务端程序 图片来源&#xff1a;https://subingwen.cn/linux/udp/ UDP服务器无法直接检测客户端断开连接。 UDP 服务端 server.cpp #include <iostream> #include <cstdlib> // std::exit #include <cstring> // memset #i…

在线制作PPT图表!这个好用轻量的ppt软件值得推荐!

ppt图表怎么制作&#xff1f; ppt是一种可以承载多种内容形式的媒介&#xff0c;我们在一个ppt页面中添加文本、形状、图片、视频、图表、思维导图等&#xff0c;对于其中的图表&#xff0c;在ppt中应该怎么制作呢&#xff1f; Office Powerpoint是很多人非常熟悉的演示软件&…

【宽搜】5.leetcode 199 二叉树的右视图

1 题目描述 题目链接&#xff1a;二叉树的右视图 2 题目解析 思路&#xff1a; 可以运用 层序遍历&#xff0c; 将每一层的结点值存入到vector< int >中&#xff0c;然后对每一层的vector&#xff0c;将vector的最后一个值加入到结果的vector中去 层序遍历的模板可以…

选择三品软件作为合作伙伴,确保PLM系统成功实施和长期稳定运行

企业在初次实施PLM&#xff08;Product Lifecycle Management&#xff0c;产品生命周期管理&#xff09;系统时&#xff0c;需要细致规划和充分准备。 一、明确需求和目标 战略对齐&#xff1a;首先&#xff0c;企业需要明确PLM系统如何与企业的长期战略相匹配&#xff0c;比如…

Python和C++的差异在哪里

1.编程应用领域 C&#xff1a;广泛应用于系统级开发、嵌入式系统、游戏开发等领域。C的底层控制和高性能使其成为这些领域的理想选择。 Python&#xff1a;广泛应用于数据科学、Web开发、人工智能等领域。Python的简洁语法和强大库支持使其成为这些领域的首选语言。 2.语法风…

基于Arduino的智能避障小车的控制方法

一.工作原理 上图为超声波模块转动角度与探测方向的关系&#xff0c;正常情况下&#xff0c;智能小车会沿直线行驶&#xff0c;当遇到前方有障碍物且小于一定距离时&#xff08;设定距离可根据具体情况调整&#xff09;&#xff0c;智能小车立即停止运行。舵机转动超声波模块探…

精益生产现场管理和改善:从知识到实操的落地

在制造业的广阔天地中&#xff0c;精益生产作为一种追求浪费最小化、效率最大化的生产管理模式&#xff0c;已成为众多企业转型升级的关键路径。本文&#xff0c;深圳天行健企业管理咨询公司将从精益生产现场管理和改善的理论知识出发&#xff0c;深入探讨其从理念导入到实操落…

Windows10如何关闭自动更新

1. 右键"此电脑"&#xff0c;选择"管理"。 2. 选择"服务和应用程序 > 服务"、然后找到"Windows Update"双击打开 3. 在"常规"选项卡下&#xff0c;把启动类型改为 "禁用" 4. 点击"恢复"选项卡&…

AGI|如何构建一个RAG应用?入门新手攻略!

目录 一、概述 二、过程概述 三、如何优化提问&#xff1f; 四、路由和高级查询 五、丰富索引结构 六、重排序上下文 七、总结 一、概述 Retrieval Augmented Generation RAG 检索增强的内容生成。 从字面上来看检索只是一种手段途径&#xff0c;在人工智能领域中存在多种…

【解决】虚拟机VMTool安装程序无法继续,Microsoft Runtime DLL安装程序未能完成安装

这个问题的原因是系统安装服务没有开启 打开任务管理器-服务-打开服务 找到windows installer 服务&#xff0c;开启即可

leetcode-85. 最大矩形

题目描述 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面积。 示例 1&#xff1a; 输入&#xff1a;matrix [["1","0","1","0","0"],["1&…

【Cursor教程】探索Cursor颠覆编程体验的创新工具!教程+示例+快捷键

文章目录 Cursor的全新定义Cursor的灵活订阅模式使用Cursor轻松创建支付页面Cursor的快捷键使用指南Cursor的未来展望Cursor的实际应用案例案例一&#xff1a;快速原型开发示例 案例二&#xff1a;教育培训示例 案例三&#xff1a;企业内部工具开发示例 更多的选择结语 在当今技…

turtlebot3使用

roslaunch turtlebot3_gazebo turtlebot3_house.launch roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:/home/hou/maps/housemap/map.yaml 以下为melodic版本 其他版本的ros命令有区别 …

SQL优化 where谓词条件OR优化

1.测试表&#xff0c;及测试语句where条件中OR对应两个字段选择度很高 create table t618 as select * from dba_objects; select object_name from t618 where (object_id12043 or DATA_OBJECT_ID12043) and STATUSVALID; 2.没有索引情况下&#xff0c;全表扫描逻辑读…

vue项目中使用drive.js元素未定位成功

在使用drive.js时&#xff0c;button我设了一个id 但是在使用时却定位失败 只要在mounted设置setTimeout即可