把纯血鸿蒙个人推送从“能收到”做到“敢长期用”,这半年我补了这些坑

ricwangcom 2026-08-11 13:48 1

今年 2 月我在 V 站分享过自己做的纯血鸿蒙个人推送 App“噔噔”。最初的目标很简单:给一个 URL 传标题和内容,就能把服务器告警、脚本结果或日常提醒推到自己的鸿蒙手机。

旧帖:
https://www.v2ex.com/t/1192694

第一版上架后收到过一个很真实的反馈:通知栏里能看到内容,但点进 App 的消息中心可能还是空的,需要再手动下拉刷新。

这个问题让我意识到,“系统通知到了”和“消息可靠地进入本地消息中心”其实是两条链路。后面几个月我没有急着堆通知图标、声音之类的功能,而是先把基础链路补牢。

[这半年主要补了什么]

1. 首次安装一次走通

之前隐私协议、通知权限、窗口创建和 Push 初始化的时序处理得不好,第一次安装后可能要重启几次才能正常工作。1.1.3 把初始化放到 UIContent 就绪之后,并确保只有用户同意隐私协议后才申请权限、获取 Push Token 、检查更新和同步消息。

2. 通知到达与消息入库分开处理

普通通知继续交给 HarmonyOS Push Kit 展示;同时服务端保存一份加密的待同步消息,并发送低频后台唤醒信号,让 App 拉取、解密、写入本地消息中心。后台唤醒失败也不影响普通通知展示,重新打开 App 时仍可继续同步。

3. 消息同步做幂等

最麻烦的情况不是请求完全失败,而是“本地已经保存成功,确认服务端删除时失败”。下次重试如果没有幂等键,就会出现重复消息。现在用“服务来源 + 服务端消息 ID”作为同步键,即使确认阶段重试,也不会重复落库。

4. 私钥不再明文保存

待同步消息使用 RSA/AES 混合加密。本地 RSA 私钥现在先用 AES-256-GCM 加密,包装密钥放入 Asset Store ,并由 HUKS 提供底层保护。这里也不说模糊的“全链路绝对安全”:普通系统通知的标题、正文和点击数据仍需要按 Push Kit 的普通通知链路发送给华为;加密保护的是服务端暂存消息、Push Token 存储和本地私钥。

5. 通知可以直接办事

1.1.3 支持在附加字段里传 __url 。点击通知后可以打开 https 网页,也可以打开已安装 App 的合法 URL Scheme 。

[现在怎么用]

不用注册账号。安装后添加默认服务或自建服务,App 会生成推送链接,也可以直接复制 curl 。下面是脱敏示例:

curl --get "https://你的服务端/api/v1/push/notification" \
--data-urlencode "device_id=你的 DeviceId" \
--data-urlencode "title=构建完成" \
--data-urlencode "content=main 分支部署成功" \
--data-urlencode 'data=[{"key":"__url","value":"https://example.com/build/123"}]'

应用市场:
https://appgallery.huawei.com/app/detail?id=top.yidingyaojizhu.dengdeng

服务端源码和 Docker 部署:
https://github.com/dengdeng-harmonyos/server

[目前的限制]

- 当前重点仍是文字通知、链接和自定义字段,还不支持图片推送;
- 通知到达受网络、系统通知开关和后台策略影响,不承诺“100% 必达”;
- 自建服务端需要自行负责可用性、备份和安全更新。

我接下来准备把实际接入模板补齐。V 友更希望先看到哪一个:MoviePilot/NAS 、GitHub Actions 、服务器监控,还是 Home Assistant ?如果你已经在用,也欢迎把踩到的问题直接丢给我。
最新回复 (0)
    没有回复
* 帖子来源V2EX
返回