官方给出的步骤是对的,就是一时不知道从何下手,自己整了下,按照这个来就行

1.步骤

打开 APP 通知功能

        1.先按照这个页面进行配置SDK 集成指南 - 极光文档,主要就是下载极光sdk,然后在AGC里开通推送服务,配置调试证书,配置签名,配置应用 client_id
        2.在极光平台配置包名和 appKey(Server Key  在AGC里可以下载JSON)一定要启用,包名需要和AGC的一样(json文件可以在这个文档按照配置厂商参数申请指南 - 极光文档)
        3.创建新的一个Ability在product中,和EntryAbility.ets同级(就是在Entry模块中),Ability的代码下面会有,然后在module.json5中配置srcEntry字段  "srcEntry": "./ets/entryability/MyAbilityStage.ets", ,这样才可以启动这个Ability  (点击通知消息打开应用的话,还是在module.json5配置actions为:"action.system.home")这个文件现在有两个Ability。一个在module下面,一个是默认的在abilities下面,module是自己新加的
        4.在EntryAbility里也需要调用个方法,还需要写个方法,下面代码也有
        5.在页面中使用eventhub来进行获取Registration ID
        6.拿到Registration ID以后就说明成功了,这样就可以测试是否可以推送成功了
        这个是测试地址极光推送,里面有个字段是HarmonyOS category 可以根据自己需求看文档填写文档中心这里需要注意(如果app在前台可以推送,后台不可以推送的话是因为AGC上没有开通消息权益,下面会详细写)
这里也有官方给出的demo感兴趣的可以自己看看资源下载 - 极光文档

2.代码

        1. MyAbilityStage.ets  这个直接复制就能用,就是setAppKey这个key需要替换自己的
import AbilityStage from '@ohos.app.ability.AbilityStage';
import { hilog } from '@kit.PerformanceAnalysisKit';
import {CallBackMsg,JAliasMessage,JCmdMessage,JCustomMessage,JMessage,JMessageExtra,JMessageVoIP,JMobileNumberMessage,JPushInterface,JTagMessage
} from '@jg/push';
import { common } from '@kit.AbilityKit';const TAG: string = 'JPUSH-JLog-MyAbilityStage'class MyCallBackMsg extends CallBackMsg {context: common.ApplicationContextconstructor(co: common.ApplicationContext) {super();this.context = co}/*** 注册成功后回调rid* @param registrationId 注册成功后回调rid*/onRegister(registrationId: string): void {hilog.info(0x0000, TAG, '%{public}s', 'onRegister registrationId:' + registrationId);this.context.eventHub.emit('jPush_event_rid', registrationId);this.context.eventHub.emit('jPush_event', "registrationId:" + registrationId);}/*** 长连接登陆 回调* @param isConnected true:成功,false:失败*/onConnected(isConnected: boolean): void {hilog.info(0x0000, TAG, '%{public}s', 'onConnected isConnected:' + isConnected);this.context.eventHub.emit('jPush_event_isConnected', isConnected);this.context.eventHub.emit('jPush_event', "isConnected:" + isConnected);}/*** 操作 tag 接口回调* @param jTagMessage* export class JTagMessage {* sequence?: number //对应操作id,全局不要重复* code?: number //0成功,JTagMessage.CODE_TIME_OUT超时* op?: string* tags?: string[] //对应数据* curr?: number //数据当前页数,页数从1开始* total?: number //数据总页数* msg?: string* }*/onTagOperatorResult(jTagMessage: JTagMessage): void {hilog.info(0x0000, TAG, '%{public}s', 'onTagOperatorResult JTagMessage code:' + jTagMessage.code);hilog.info(0x0000, TAG, '%{public}s', 'onTagOperatorResult JTagMessage:' + JSON.stringify(jTagMessage));this.context.eventHub.emit('jPush_event', "onTagOperatorResult:" + JSON.stringify(jTagMessage));}/*** 操作 Alias 接口回调* @param jAliasMessage* export class JAliasMessage {* sequence?: number //对应操作id,全局不要重复* code?: number //0成功,JAliasMessage.CODE_TIME_OUT超时* op?: string* alias?: string //对应数据* curr?: number* total?: number* msg?: string* }*/onAliasOperatorResult(jAliasMessage: JAliasMessage): void {hilog.info(0x0000, TAG, '%{public}s', 'onAliasOperatorResult jAliasMessage:' + JSON.stringify(jAliasMessage));this.context.eventHub.emit('jPush_event', "onAliasOperatorResult:" + JSON.stringify(jAliasMessage));}onMobileNumberOperatorResult(jMobileNumberMessage: JMobileNumberMessage) {hilog.info(0x0000, TAG, '%{public}s','onMobileNumberOperatorResult jMobileNumberMessage:' + JSON.stringify(jMobileNumberMessage));this.context.eventHub.emit('jPush_event', "onMobileNumberOperatorResult:" + JSON.stringify(jMobileNumberMessage));}/*** 通知点击事件回调* @param jMessage** export class JMessage {* msgId?: string //通知id* title?: string //通知标题* content?: string//通知内容* extras?: string//自定义数据* }*/onClickMessage(jMessage: JMessage) {hilog.info(0x0000, TAG, '%{public}s', 'onClickMessage jMessage:' + JSON.stringify(jMessage));this.context.eventHub.emit('jPush_event', "onClickMessage:" + JSON.stringify(jMessage));}onArrivedMessage(jMessage: JMessage) {hilog.info(0x0000, TAG, '%{public}s', 'onArrivedMessage jMessage:' + JSON.stringify(jMessage));this.context.eventHub.emit('jPush_event', "onArrivedMessage:" + JSON.stringify(jMessage));}/*** 自定义信息通知回调*  回调一:冷启动调用sdk初始化后回调之前还没有回调的信息*  回调二:app存活时会直接回调信息* @param jCustomMessage** export class JCustomMessage {*  msgId?: string //通知id*  title?: string //通知标题*  content?: string //通知内容*  contentType?: string //通知内容类型*  extras?: Record<string, Object> //通知自定义键值对*  ttl?: number //后台下发的信息过期时间,单位秒*  stime?: number //后台下发时间,毫秒* }*/onCustomMessage(jCustomMessage: JCustomMessage) {hilog.info(0x0000, TAG, '%{public}s', 'onCustomMessage jCustomMessage:' + JSON.stringify(jCustomMessage));this.context.eventHub.emit('jPush_event', "onCustomMessage:" + JSON.stringify(jCustomMessage));}/*** 通知扩展消息回调* @param jMessageExtra** export class JMessageExtra {* msgId?: string //通知id* title?: string //通知标题* content?: string//通知内容* extras?: Record<string, Object>//自定义数据* extraData?: string//通知扩展消息的自定义数据* }*/onJMessageExtra(jme: JMessageExtra) {hilog.info(0x0000, TAG, '%{public}s', 'onJMessageExtra jme:' + JSON.stringify(jme));this.context.eventHub.emit('jPush_event', "onJMessageExtra:" + JSON.stringify(jme));}/*** VoIP呼叫消息回调* export class JMessageVoIP {* msgId?: string //通知id* extraData?: string //VoIP自定义数据}* @param jmVoIP*/onJMessageVoIP(jmVoIP: JMessageVoIP) {hilog.info(0x0000, TAG, '%{public}s', 'JMessageVoIP jmVoIP:' + JSON.stringify(jmVoIP));this.context.eventHub.emit('jPush_event', "JMessageVoIP:" + JSON.stringify(jmVoIP));}/*** 交互事件回调* @param cmdMessage* export class JCmdMessage {* public static CMD_PUSH_STOP = 2007 //通知停止 设置回调* public static CMD_PUSH_RESUME = 2006 //  通知恢复 设置回调** cmd?: number  //操作事件,2007通知停止,2006恢复通知* errorCode?: number //0表示成功,其他为错误* msg?: string //内容信息* extra?: Record<string, Object>* }*/onCommandResult(cmdMessage: JCmdMessage) {hilog.info(0x0000, TAG, '%{public}s', 'onCommandResult cmdMessage:' + JSON.stringify(cmdMessage));this.context.eventHub.emit('jPush_event', "onCommandResult:" + JSON.stringify(cmdMessage));}
}export default class MyAbilityStage extends AbilityStage {onCreate() {// 应用的HAP在首次加载的时,为该Module初始化操作hilog.info(0x0000, TAG, '%{public}s', 'MyAbilityStage onCreate');JPushInterface.setChannel("demo")JPushInterface.setAppKey("你自己的key")JPushInterface.setDebug(true)JPushInterface.setCallBackMsg(new MyCallBackMsg(this.context.getApplicationContext()))}
}
2.EntryAbility.ets
import {abilityAccessCtrl,AbilityConstant,common,PermissionRequestResult,Permissions,UIAbility,Want
} from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';
import { PreferencesUtils } from 'common';
import { notificationManager } from '@kit.NotificationKit';
import { JMessage, JPushInterface } from '@jg/push';
import { BusinessError } from '@kit.BasicServicesKit';
import { pushCommon, pushService } from '@kit.PushKit';const TAG: string = 'JPUSH-JLog-PushMessageAbility'export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {this.setClickWant(want)JPushInterface.init(this.context)hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');}onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {hilog.info(0x0000, TAG, '%{public}s', 'Ability onNewWant');super.onNewWant(want, launchParam)this.setClickWant(want);}private async setClickWant(want: Want) {let j: JMessage | undefined = await JPushInterface.setClickWant(want);hilog.info(0x0000, TAG, '%{public}s', 'setClickWant: ' + JSON.stringify(j));}onDestroy(): void {hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');}onWindowStageCreate(windowStage: window.WindowStage) {// Main window is created, set main page for this abilityhilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');// 读取本地token(异步)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 resourceshilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');}onForeground(): void {// Ability has brought to foregroundhilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');}onBackground(): void {// Ability has back to backgroundhilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');}
}

3.页面调用
onEventhub() {// 获取eventHublet eventhub = this.context.getApplicationContext().eventHub;hilog.info(0x0000, TAG, '%{public}s', 'jPush_event on');// 执行订阅操作eventhub.on('jPush_event_rid', (data: string) => {// 触发事件,完成相应的业务操作hilog.info(0x0000, TAG, 'jPush_event_rid:' + JSON.stringify(data));Logger.log(data)this.rid = "rid: " + data;}); // 执行订阅操作eventhub.on('jPush_event_isConnected', (data: boolean) => {// 触发事件,完成相应的业务操作hilog.info(0x0000, TAG, 'jPush_event_isConnected:' + JSON.stringify(data));this.rid = "rid: " + JPushInterface.getRegistrationId();Logger.log(JPushInterface.getRegistrationId() + 'hhhhhhhhh')});// 执行订阅操作eventhub.on('jPush_event', (data: string) => {// 触发事件,完成相应的业务操作hilog.info(0x0000, TAG, '%{public}s', 'jPush_event:' + data);this.message = this.message + "\n" + JSON.stringify(data)this.message = this.message + "\n" + "============================"});}aboutToAppear(): void {this.onEventhub()}

4.前台推送,后台不推送Bug

是因为AGC消息权益没有开通激活,根据自己的业务需求开通,激活以后需要根据业务类型取值

自分类权益生效后,应用的推送消息将根据category字段进行归类。

官方文档:文档中心

5.常用的几个接受消息的Emit       

1.这个是Ability里的监听收到消息的函数
 onArrivedMessage(jMessage: JMessage) {hilog.info(0x0000, TAG, '%{public}s', 'onArrivedMessage jMessage:' + JSON.stringify(jMessage));this.context.eventHub.emit('jPush_event', "onArrivedMessage:" + JSON.stringify(jMessage));}
 2.这个是页面调用收到消息的消息体
   eventhub.on('jPush_event', (data: string) => {// 设置到 JPushLogger.log('1231132123121' + data)});
3.这个是点击通知栏跳转进app以后的函数(我这边自己更换了emite的title)不和接受消息的emit同一个
  onClickMessage(jMessage: JMessage) {Logger.log(jMessage)hilog.info(0x0000, TAG, '%{public}s', 'onClickMessage jMessage:' + JSON.stringify(jMessage));this.context.eventHub.emit('jPush_event_delete', JSON.stringify(jMessage));}
4.在页面这个进行跳转到app之后的操作(包括跳转哪个页面之类)

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ruoyi_wvp流媒体[海康 大华 GB1812 onvif rtsp]

ZLMediaKitxiaz: https://download.csdn.net/download/jinhuding/91775096 webrtc: https://download.csdn.net/download/jinhuding/91764243 yoloonnx(v3,v7,v8s,v9c)&#xff1a;https://download.csdn.net/download/jinhuding/91775170 项目部署步骤 1.后端目录结构 2.前端…

强化学习笔记(二):有限马尔可夫决策过程(一)

有限马尔可夫决策过程 基本概念 多臂老虎机仅涉及评价性反馈&#xff0c;即动作的即时奖励&#xff0c;估计每个动作 aaa 的价值 q∗(a)q_*(a)q∗​(a)。 有限马尔可夫决策过程&#xff08;Finite MDP&#xff09;引入了关联性因素&#xff0c;即在不同状态&#xff08;情境&am…

Maven项目中settings.xml终极优化指南

文章目录1. 基础优化2. 镜像源优化&#xff08;国内推荐&#xff09;3. 插件仓库优化4. 并行构建提升 30%-80%5. 下载可靠性优化6. CI/CD 环境优化7. 进阶&#xff1a;依赖锁定与预下载8. 实现效果Maven settings.xml 终极优化指南&#xff0c;重点是&#xff1a;构建速度提升、…

RCC_APB2PeriphClockCmd

RCC_APB2PeriphClockCmd 函数在STM32的标准外设库中扮演着“电源开关”的角色。要理解这个函数&#xff0c;我们需要明白STM32微控制器的几个关键概念&#xff1a;1. 外设时钟与低功耗设计STM32内部有非常多的外设&#xff0c;如GPIO&#xff08;A, B, C...D&#xff09;、USAR…

用大语言模型实现语音到语音翻译的新方法:Scheduled Interleaved Speech-Text Training

用大语言模型实现语音到语音翻译的新方法:Scheduled Interleaved Speech-Text Training 在人工智能领域,语音到语音翻译(Speech-to-Speech Translation, S2ST)一直是极具挑战性的任务。传统的做法是将语音识别、文本翻译和语音合成三个步骤串联起来,而近年来,端到端的S2…

LLM学习:langchain架构——模型IO

1、什么是模型IO模型 I/O&#xff08;Model I/O&#xff09; 是 LangChain 框架中最核心的模块之一&#xff0c;负责处理与语言模型&#xff08;LLM&#xff09;交互的输入构建、模型调用和输出解析全流程。它主要分为三个模块&#xff1a;Prompts&#xff08;输入构建&#xf…

Windows系统下python新一代三方库管理工具uv及VSCode配置

python新一代三方库管理工具uv uv是什么&#xff1f; uv是用RUST语言写的一个python三方库和项目管理工具&#xff0c;详见官网&#xff08;uv&#xff09;。 uv的安装 官网上提供了两种安装方式&#xff0c;第一种需要在PS终端里运行一下命令进行安装&#xff1a; powersh…

Node.js 多版本管理工具 nvm 的安装与使用教程(含镜像加速与常见坑)

适用人群&#xff1a;前端/后端/全栈开发者&#xff0c;Mac/Linux/Windows&#xff08;nvm-windows&#xff09;用户&#xff1b;需要在多项目间快速切换 Node 版本、或在国内网络环境下稳定安装 Node。一、为什么要用 nvm&#xff1f;一机多版本&#xff1a;不同项目依赖不同 …

Unity Shader unity文档学习笔记(二十一):几种草体的实现方式(透明度剔除,GPU Instaning, 曲面细分+几何着色器实现)

1.透明度剔除&#xff08;性能较差&#xff0c;不同颜色时需要不同材质会导致多个dc&#xff09; clip(_Color.a - _Cutoff); 传入值为0时 剔除 类似的草体效果&#xff1a; 2.GPU Instaning(可以自定义一次性合批最多1023个&#xff0c;能够传递颜色值等等&#xff08;做草…

UX 设计入门终章:让洞察落地!用用户流程图、IA 和旅程图,设计用户与产品的互动故事

欢迎来到本系列课程的最后一课。 如果你把之前的学习比作是绘制一份建筑蓝图&#xff0c;那么今天&#xff0c;你将根据自己收集到的所有用户数据&#xff0c;描绘出空间布局&#xff08;用户流程图&#xff09;、理清结构关系&#xff08;信息架构&#xff09;&#xff0c;并最…

【RAG知识库实践】向量数据库VectorDB

一、概述 1.1 什么是向量库 向量数据库是一种专门为存储、索引和查询高维向量数据而优化的数据库系统。与传统的关系型数据库不同,向量数据库将数据映射到向量空间中,使得数据的相似性计算、聚类、分类和检索变得更加高效和精确 向量数据库一般包括以下几个部分:索引、查询…

EasyExcel 3.x 导出动态表头,动态sheet页

动态导出sheet页Overridepublic void exportAnswerListV1(HttpServletResponse response, SmtSurveyUserAnswerRecord smtSurveyUserAnswerRecord) {// 1. 准备问卷数据String formType smtSurveyUserAnswerRecord.getFormType();if (ObjectUtil.isEmpty(formType)) {throw ne…

重学JS-004 --- JavaScript算法与数据结构(四)JavaScript 表单验证

文章目录HTMLlabel 属性input 属性button 属性fieldset 属性select 属性option 属性div 属性scriptgetElementByIdquerySelectorAllnull循环模版文字函数事件监听器regex举例StringMathArrayHTML HTML 属性应该用双引号引起来。 label 属性 for“” input 属性 id“” typ…

本地搭建 Redis/MySQL 并配置国内镜像加速(Docker/原生安装 | macOS/Linux/Windows)

适用人群&#xff1a;前端/后端/数据/测试工程师&#xff1b;需要在单机上快速搭建 Redis 与 MySQL 的开发环境&#xff1b;同时在国内网络环境下加速下载&#xff08;容器镜像、系统包仓库&#xff09;。文章结构&#xff1a;一图流 → TL;DR → Docker 方式 → 原生安装&…

SynClub-百度在海外推出的AI社交产品

本文转载自&#xff1a;SynClub-百度在海外推出的AI社交产品 - Hello123工具导航 ** 一、&#x1f916; SynClub 是什么&#xff1f; SynClub 是百度出海的 AI 社交产品&#xff0c;主打 "打造专属 AI 朋友" 的创新概念&#xff0c;让你在虚拟世界拥有真正懂你的贴…

Easy Rules规则引擎:轻量级Java规则处理实践指南

引言:业务规则与代码解耦的艺术 在现代软件开发中,业务规则频繁变更与核心逻辑稳定性之间的矛盾日益突出。传统硬编码的if-else语句在面对复杂业务场景时会导致: 代码臃肿:成百上千的条件分支难以维护 耦合度高:业务逻辑与系统架构深度绑定 变更成本高:微小规则调整需要…

机器人 - 无人机基础(5) - 飞控中的传感器

目录 一、加速度计 1.1 加速度计原理 1.2 加速度计校准 1.2.1 误差模型 1.2.2 关于MPU6050校准方式 与 代码思路 二、陀螺仪 2.1 陀螺仪原理 2.1.1 科里奥利力 2.1.2 陀螺仪原理 2.2 陀螺仪校准 三、加速度计与陀螺仪滤波部分 四、磁力计 4.1 磁力计原理 4.2 磁力…

PHP - 线程安全 - 疑问与答案

线程安全问题&#xff08;多线程环境需加锁&#xff09; 怎么理解 php有线程安全问题吗要理解 PHP 中的线程安全问题&#xff0c;需要结合 PHP 的运行模式和线程安全的本质来分析&#xff1a;1. 线程安全的本质线程安全问题的核心是&#xff1a;当多个线程同时访问共享资源&…

使用脚本进行监测以nginx状态页为例

1、首先打开nginx的状态页 location /nginx_status {stub_status on;}2、进行访问测试 curl http://127.0.0.1/nginx_statusActive connections: 1 server accepts handled requests1 1 1 Reading: 0 Writing: 1 Waiting: 03、在客户端编写脚本进行数据采集 编写脚本方便采集不…

prettier、eslint、stylelint在项目中使用

prettier 1&#xff09;vscode中使用 a. 安装插件(Prettier)安装成功后&#xff0c;在你打开支持的文件时&#xff0c;下方文件信息状态栏会有prettier标致&#xff1a;双击它或者直接在输出命令窗口那里查看prettier的日志信息&#xff1a;从日志这里可以看出&#xff0c;它是…