当前位置: 首页 > news >正文

搜狐新闻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二期也已经成功上架华为商店。文中如有不足或者错误的地方,欢迎大家指出,一起学习提高。鸿蒙千帆起,希望大家抓住机遇,迎接挑战。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 火绒安全:一款强大且高效的国产杀毒软件
  • C语言基础(十二)
  • kubernetest中wait.Until()方法的源码解读
  • 《黑神话·悟空》是用什么编程语言开发的?
  • 豆包大模型升级:日均Tokens使用量破5000亿,字节跳动打造即刻体验的《Her》式AI
  • yield生成器生成表单字段,并进行验证,利用fetch方法和formData对象传递数据给后端,后端返回成功,返回数据
  • LambdaQueryWrapper 是 MyBatis-Plus超级利器
  • Telegram mini app 本地开发配置
  • 跟着GPT学习 Kubernetes ,简称 K8s -- Kind(三)
  • redis 过期监听:高效管理数据生命周期
  • 回归预测|基于北方苍鹰优化极端梯度提升树的数据回归预测Matlab程序NGO-XGBoost多特征输入单输出
  • 光伏电站设备设施巡视卡之转变二维码登记卡
  • 计算机毕业设计 毕业季旅游一站式定制服务平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • 使用kubeadm快速部署一套K8S集群
  • 设置虚拟机使用主机以太网而不是WiF连接
  • create-react-app项目添加less配置
  • css系列之关于字体的事
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Quartz初级教程
  • 从tcpdump抓包看TCP/IP协议
  • 诡异!React stopPropagation失灵
  • 聊聊redis的数据结构的应用
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 正则表达式
  • 终端用户监控:真实用户监控还是模拟监控?
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​虚拟化系列介绍(十)
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #define、const、typedef的差别
  • %check_box% in rails :coditions={:has_many , :through}
  • (0)Nginx 功能特性
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (void) (_x == _y)的作用
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (十)Flink Table API 和 SQL 基本概念
  • (一)插入排序
  • (转)树状数组
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .equals()到底是什么意思?
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET MVC之AOP
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .NET学习教程二——.net基础定义+VS常用设置
  • @Not - Empty-Null-Blank
  • @RestController注解的使用
  • [12] 使用 CUDA 进行图像处理
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [240527] 谷歌 CEO 承认 AI 编造虚假信息问题难解(此文使用 @gemini 命令二次创作)| ICQ 停止运作
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [Android]Android开发入门之HelloWorld
  • [ArcPy百科]第三节: Geometry信息中的空间参考解析
  • [C#]将opencvsharp的Mat对象转成onnxruntime的inputtensor的3种方法