搜狐新闻HarmonyOS Push开发实践

214825ffd1b3f4edc761c21b32ebcbd7.gif

本文字数:1795字

预计阅读时间:15分钟


01

背景

搜狐新闻作为HarmonyOS的合作伙伴,于2023年12月成功上架鸿蒙单框架应用市场,成为首批鸿蒙应用矩阵的一员。

5e9e89a697e1351e67d5065fe384e9b5.jpeg

推送作为新闻类应用的重要组成部分,我们将其纳入到二期功能开发中。本文将推送集成过程中的步骤和经验分享给大家。

02

开发环境

IDE:DevEco Studio NEXT Developer Beta2 Build Version: 5.0.3.502, built on July 28, 2024

SDK:HarmonyOS NEXT Developer Beta2 SDK, based on OpenHarmony SDK Ohos_sdk_public 5.0.0.22 (API Version 12 Canary3)。

03

集成步骤

1.生成签名证书

在主菜单栏单击Build > Generate Key and CSR。先生成P12证书,后生成CSR证书,这和iOS证书生成顺序恰好相反。

(1)生成p12证书

432584fd5619d7f73594a0ec71576b7e.png

Key Store File:设置密钥库文件存储路径,并填写p12文件名; Alias:密钥的别名信息,用于标识密钥名称。请记住该别名,后续签名配置需要使用; Validity:证书有效期,默认25年; Certificate:输入证书基本信息,如组织、城市或地区、国家码等;

(2)生成CSR证书

6ddd6932a63c88e0128930a57201169a.png

两者都生成完后的结果如图:

a2776eb13c193071a500e5b807cae3a8.jpeg

2.申请开发和发布证书

登录AppGallery Connect,选择“用户与访问”。

d1df9dd1ff05918d34f82b5c7aa9c213.png

在左侧导航栏点击“证书管理”,进入“证书管理”页面,点击“新增证书”。

0fa0f0b7d305d9b34dec85c836f51dc3.png

在弹出的“新增证书”窗口填写要申请的证书信息,点击“提交”。可建最多两个开发证书,一个发布证书。

00912a939b58c48246370c36ae22eb34.png

3.申请开发和发布Profile

选择“HarmonyOS应用 > HAP Provision Profile管理”,进入“管理HAP Provision Profile”页面,点击右上角“添加”。

d9c6d282265e4e2bc5f5193293739d2e.png

4.配置应用签名证书指纹

打开DevEco Studio,进入配置工程的签名信息的界面,点击“Store file(*.p12)”后的指纹图标。弹出的“Certificate Fingerprint”窗口将展示自动生成的签名证书指纹,复制保存此信息。

71158b5de01fda0bbb81103e8d85b56e.png

在“项目设置 > 常规”页面的“应用”区域,点击“SHA256证书/公钥指纹”后的“添加公钥指纹(HarmonyOS API 9及以上)”。指纹配置成功后大约10分钟左右生效。

31421f26e4c395bfb9f930e9c885e8f3.png

5.开通推送服务

登录AppGallery Connect网站,选择“我的项目”,在项目列表中找到您的项目,在左侧导航栏选择“增长 > 推送服务”,点击“立即开通”,在弹出的提示框中点击“确定”。开通后页面如下:

d0f2b941e86013fa8a4846a2790c0d3a.png

6.配置Client ID和action

在项目模块级别下的src/main/module.json5(例如entry/src/main/module.json5)中,新增metadata并配置client_id和action,如下所示:

aaec81de05c7f2ae2c92ae1c77544582.png

其中client_id可在AppGallery Connect中查看,action值自定义,但是要和服务端推送消息体中action值保持一致。

7.申请用户推送权限

在 onWindowStageCreate(windowStage: window.WindowStage) 方法中申请推送权限弹窗。代码如下:

notificationManager.requestEnableNotification(this.context).then(() => {console.info("requestEnableNotification success");}).catch((err: Base.BusinessError) => {console.error(requestEnableNotification fail: ${JSON.stringify(err)});});

bef8b8ed31f5cb2eed4f7910b275071d.png

8.获取PushToken

在 EntryAbility类中的onCreate,添加上获取pushToken方法,调用此方法,需保持设备网络畅通。

export default class EntryAbility extends UIAbility {async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');GlobalContext.getContext().setObject("context", this.context);try {const pushToken: string = await pushService.getToken();hilog.info(0x0000, 'testTag', 'Get push token successfully: %{public}s', pushToken);//保存pushToken 并 上传至应用服务端} catch (err) {let e: BusinessError = err as BusinessError;hilog.error(0x0000, 'testTag', 'Get push token catch error: %{public}d %{public}s', e.code, e.message);}}

45f5d30c87b8025ea533131aa681389f.png

将获取到的pushToken在合适的时机上传至应用服务端。

9.收到推送

(1)冷启动

通过EntryAbility文件中的onCreate方法,want.parameters方法可以获取到推送的详细数据。在搜狐新闻中,跳转的落地页链接存放在uri字段中,拿到该链接,我们将它暂存在一个单例对象中,在首页加载完后,从该单例对象,取出链接,完成落地页跳转动作。

onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');//处理push,获取push中的数据let pushLink: string = (want.parameters as Record<string, string>)['uri'] || '';//跳转落地页:单例存储跳转链接,在首页加载完成后,读取链接完成跳转SNPushManager.instance().pushLink = pushLink;
}

以下示例为 SNPushManager单例中的部分业务代码,pushSpecialPage()为首页加载完后的跳转落地页方法,以供大家参考。

export class SNPushManager {
private static manager: SNPushManager;public static instance(): SNPushManager {if (!SNPushManager.manager) {SNPushManager.manager = new SNPushManager();}return SNPushManager.manager;}private constructor() {}
public pushLink:string = '';
// push 跳转对应的落地页public pushSpecialPage() {if(this.pushLink.length > 0) {openProtocolURL(this.pushLink);this.pushLink = '';}}
}

(2)热启动

与冷启动不同的是,热启动在onNewWant方法中,取出推送的落地页链接,因此时应用已处于运行阶段,可以直接完成跳转。代码中的openProtocolURL(pushLink),为搜狐新闻处理落地页跳转的统一方法。

onNewWant(want: Want): void {let pushLink: string = (want.parameters as Record<string, string>)['uri'] || '';hilog.info(0x0000, 'testTag', 'Get message data successfully: %{public}s', JSON.stringify(want.parameters));//跳转落地页openProtocolURL(pushLink);}

10.推送消息体

为了方便更好的完成推送的集成开发,大家可以参照搜狐新闻的服务端发送push时的消息体结构:

{"pushOptions": {"testMessage": true},"payload": {"notification": {"category": "MARKETING","title": "搜狐新闻","body": "推送内容","clickAction": {"actionType": 1,"data": {"uri": "端内跳转链接"},"action": "和客户端action保持一致"}}},"target": {"token": ["push token"]}
}

其中testMessage在开发阶段设置为ture,测试阶段每日上限1000条,上架商店后为false。action需要和前文中客户端的action保持一致,除去用户订阅、IM消息,新闻类的推送每天同一用户上限5条。

04

结语

通过以上步骤,即可完成HarmonyOS推送开发。HarmonyOS的SDK还在不断迭代完善中,截止本文发表前,该步骤和集成方法尚未变更,搜狐新闻HarmonyOS二期也已经成功上架华为商店。文中如有不足或者错误的地方,欢迎大家指出,一起学习提高。鸿蒙千帆起,希望大家抓住机遇,迎接挑战。

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

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

相关文章

资本相信人形机器人

文&#xff5c;刘俊宏 编&#xff5c;王一粟 闷热的场馆里&#xff0c;兴奋的议论声&#xff0c;所有人生怕错过这场AI让机器人进化的盛宴。 人山人海的会展现场 光锥智能拍摄 8月21日&#xff0c;2024世界机器人大会&#xff08;WRC&#xff09;在北京开幕。在这场由169家…

vue3 element-plus el-table 多层级表头动态渲染。

效果图: html: <el-table :data"arrlist" border style"width: 100%"><template v-for"(i, index) in currentFieldData" :key"index"><el-table-column :label"i.label" :header-D"i.headerAlign&q…

TCP系列相关内容

一、TCP上传文件 loop——本地回环测试地址。 void *memset&#xff08;void *s,int c,size_t n&#xff09;——给一个变量设定一个值。 1、“粘包”问题 两次分别发送的数据&#xff0c;被一起接收形成该现象。 原因&#xff1a;TCP流式套接字&#xff0c;数据与数据间没…

分布式锁 redis与zookeeper

redis实现分布式锁 原理 基于redis命令setnx key value来实现分布式锁的功能&#xff0c;只有当key不存在时&#xff0c;setnx才可以设置成功并返回1&#xff0c;否则设置失败返回0。 方案1&#xff1a; 方案1存在的问题 假如在加锁成功&#xff0c;释放锁之前&#xff0c;…

飞书怎么关联任意两段话

最近开始用飞书记文档&#xff0c;体验实在是非常的丝滑&#xff0c;对我来说感觉没有找到更好的竞品了。废话不多说&#xff0c;接下来简单介绍一下怎么关联任意两段话吧。 首先说明&#xff0c;关联可以单向&#xff0c;也可以双向。 直接举例。 我想要将蓝字关联到最下面的…

自适应学习率(Datawhale X 李宏毅苹果书 AI夏令营)

传统的梯度下降方法在优化过程中常常面临学习率设置不当的问题。固定的学习率在训练初期可能过大&#xff0c;导致模型训练不稳定&#xff0c;而在后期可能过小&#xff0c;导致训练速度缓慢。为了克服这些问题&#xff0c;自适应学习率方法应运而生。这些方法通过动态调整学习…

微服务通信

目录 一、Feign远程调用 1、Feign简介 2、基本使用 二、Dubbo 1、基本简介 2、基础实现 一、Feign远程调用 先来看我们以前利用RestTemplate发起远程调用的代码&#xff1a; //通过restTemplate调用商品微服务String url "service-product";Product product …

proc文件的写操作机制

“一切皆是文件”。 Linux的基本哲学之一。它是指linux系统中的所有一切都可以通过文件的方式访问、管理&#xff0c;即便不是文件&#xff0c;也以文件的形式来管理。例如硬件设备、进程、套接字等都抽象成文件&#xff0c;使用统一的用户接口&#xff0c;虽然文件类型各不相同…

qt-内置图片遍历-Lambda按钮

内置图片遍历-Lambda按钮 知识点widget.hwidget.cppmain.cpp运行图 知识点 使用新的connect语法连接信号和槽 --Lambda 使用 connect(btn, &QToolButton::clicked, this, [this, btn,index]() { onToolButtonClicked(btn)}); // Lambda表达式中调用成员函数&#xff0c;并…

Springboot打包、部署

一、导入maven打包插件 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins> </build> 二、执行打包操作&#xff08;…

基于imx6ull平台opencv的图像采集和显示屏LCD显示功能(不带Qt界面)

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境 三、开发流程3.1 编写测试3.2 验证功能 一、概述 本文档是针对imx6ull平台opencv的图像采集和显示屏LCD显示功能&#xff0c;opencv通过摄像头采集视频图像&#xff0c;将采集的视频图像送给显示屏LCD进行显示。 测试结果…

【数据结构3】哈希表、哈希表的应用(集合与字典、md5算法和文件的哈希值)

1 哈希表 哈希表一个通过哈希函数来计算数据存 储位置的数据结构&#xff0c;通常支持如下操作: 插入(键&#xff0c;值):插入键值对(键&#xff0c;值) Get(key):如果存在键为键的键值对则返回其值&#xff0c;否则返回空值 删除(键):删除键为键的键值对哈希表(Hash Table&am…

使用kafka改造分布式事务

文章目录 1、kafka确保消息不丢失&#xff1f;1.1、生产者端确保消息不丢失1.2、kafka服务端确保消息不丢失1.3、消费者确保正确无误的消费 2、生产者发送消息 KafkaService3、UserInfoServiceImpl -> login()4、service-account - > AccountListener.java 1、kafka确保消…

Renesa Version Board开发RT-Thread 之UART驱动应用

目录 概述 1 硬件介绍 2 软件配置 2.1 RT-Thread Studio配置参数 2.2 FSP配置MCU 3 RT-Thread中UART的接口介绍 3.1 RT-Thread UART简介 3.2 RT-Thread 下的UART接口 4 UART的应用 4.1 应用功能实现 4.2 源代码文件 5 测试 程序下载地址&#xff1a; RenesaVersio…

应用层协议(上)Http(URL、Cookie、Session)内含逻辑图解通俗易懂!

绪论​ “少年没有乌托邦 心向远方自明朗”&#xff0c;本章是应用层常用且重要的协议htttp&#xff0c;没看过应用层建议一定先看那一篇后再看本章才能更好的去从上到下的理解应用层。 话不多说安全带系好&#xff0c;发车啦&#xff08;建议电脑观看&#xff09;。 1.Http协…

Linux rocky 9.2 安装mysql-8.0.39-linux-glibc2.28-x86_64.tar.xz

数据库官方下载&#xff1a;MySQL :: Download MySQL Community Server 本文也绑定该资源包&#xff0c;免费提供下载学习。 1.系统版本 2.新建目录&#xff0c;存放数据库安装包&#xff0c;并且上传 需要用到的工具&#xff1a;yum -y install vim lrzsz tar 上传解压&…

探索Python交互式编程的新境界:Python-prompt-toolkit的魔法

文章目录 探索Python交互式编程的新境界&#xff1a;Python-prompt-toolkit的魔法背景&#xff1a;为何选择Python-prompt-toolkit&#xff1f;Python-prompt-toolkit是什么&#xff1f;如何安装Python-prompt-toolkit&#xff1f;简单使用&#xff1a;Python-prompt-toolkit的…

C++,std::queue 详解

文章目录 1. 概述2. 包含头文件3. 基本操作3.1 构造函数3.2 赋值操作3.3 成员函数 4. 迭代器5. 示例6. 注意事项参考 1. 概述 std::queue 是 C 标准模板库&#xff08;STL&#xff09;中的一个容器适配器&#xff0c;它提供了一种先进先出&#xff08;FIFO&#xff09;的数据结…

【研发日记】嵌入式处理器技能解锁(五)——TI C2000 DSP的中断系统

文章目录 前言 背景介绍 中断框架 外设中断 ePIE模块 CPU中断 中断嵌套 应用实例 总结 参考资料 前言 见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》 见《【研发日记】嵌入式处理器技能解锁(二)——TI C2000 DSP的SCI(串口)通信》 见…

基于Java的小区物业管理系统APP的设计与实现(论文+源码)_kaic

摘 要 小区物业管理系统是现代社会中非常热门的软件&#xff0c;伴随着社区规模的不断扩大和住户的不断增多&#xff0c;本系统的主要目的是辞别帐本以及传统的单一数据管理系统&#xff0c;快捷的保存用户各种数据信息。本系统针对Java系统展开&#xff0c;使用Java、SpringB…