# MeowOS 通知系统设计(M2 通知存储 + 分发,阶段 B/D 前置) > 状态:设计稿定稿讨论中(2026-08-29,用户已给定多数决策)。按 FREWORKS §4/附C + 用户约定,遵循 freedesktop.org 通知规范。**实施前仅剩"应用配额"细节待深入讨论**(见 §7)。 ## 1. 定位 - MeowOS 通知中心的后端(存储+分发),是阶段 B 通知中心 UI + 阶段 D(M2 通知存储)的前提。 - 生产者 = MeowAPP(原生 IPC)+ **系统事件(系统抽象为 App)** + 外部桌面 app(D-Bus 桥)。 ## 2. 通知标准(freedesktop.org Desktop Notifications,用户约定) 遵循 `org.freedesktop.Notifications`(D-Bus 接口),字段严格按标准: - **app_name**(来源应用名) - **replaces_id**(更新/替换通知 id;0=新建) - **app_icon**(图标,指 icon name 或 path) - **summary**(标题,单行) - **body**(正文,可多行) - **actions[]**(按钮,可选;动作回调) - **hints{}**(提示,含 `x-canonical-*`/progress/图片数据等;我们用 `hints` 传 target Activity、进度 percent 等) - **expire_timeout**(超时 ms;-1=常驻/ONGOING,0=不自动过期) - 返回新版通知 **id**。 **MeowOS 扩展**:`hints` 内加 MeowOS 专有键(如 `meow.target_activity`、`meow.progress`)用于通知中心点击跳转/进度条显示。媒体通知走 MPRIS(`org.mpris.MediaPlayer2`,另行)。 ## 3. 双接口(FREWORKS 附C,已定) 1. **原生 IPC**:MeowAPP 经 AF_UNIX socket 发 `MSG_NOTIFY`(FREWORKS §4 通定协议 0x0020)+ `MSG_NOTIFY_ACK`(0x0021)/`DISMISS`(0x0022)/`LIST`(0x0023)。 2. **D-Bus 桥** `meow_notify_dbus`(独立小守护,链 libdbus/GDBus,系统总线注册 `org.freedesktop.Notifications`):收到标准 `Notify()` → 经 MeowOS IPC 后端入通知存储;后端关闭/动作 → 回发信号。libdbus-1/libdbus-glib/libgio 已确认可用。 ## 4. 通知数据结构(存内存 + 转储) 每通知字段(对齐 freedesktop + MeowOS): ``` id(uint32) / app_name / app_icon / summary / body / actions[] / hints{} expire_timeout / created_ms / dismissed / ongoing(bool) target_activity(可选, 来自 hints) / progress(可选 int) ``` 统一从 IPC/D-Bus 两路解析入该结构。 ## 5. 存储分层(用户已定 2026-08-29) - **关键配置优先板载**:设置类(notify.* 配额等)存板载 `/usr/data/meow/settings.conf`(B2a),确保**无卡时系统正常工作**。 - **实时通知 → 本地内存**(板载,动态分配/ring)。 - **超时/转储 → TF 卡** `MeowOS/notifications/`(**系统约定:系统文件统一放 MeowOS/ 下**,非 MeowData/——MeowData 是应用专属数据根)(转储区,如 notifications/.json 或 appended 日志)。 - **无 TF 卡可运行**(本地内存态即可,不依赖卡;TF 卡在时才转储)。转储/日志类是可降级数据(无卡用 /tmp 回退),配置类永远板载。 - **本地数据清理策略**: - 关机/重启前 → 清理本地内存通知数据(正常关机路径)。 - 异常关机(重启后)→ 开机时识别并清理本地残留。 - **TF 卡转储区**:保留**最新 10MB**(ring/截断),**不被电源事件清理**(持久留存)。 ## 6. 通知生命周期(FREWORKS §4 已定,作参考) - 内存态:每应用**配额**(待讨论 §7),满丢最旧;ttl 过期(1s 粒度);ONGOING 常驻(服务死随清)。 - 转储:超时/入 TF 卡区。 ## 7. 【已定】应用配额(用户拍板,2026-08-29) - **每个 App 最多申请 4 个通知类型(category)**。 - **每个类型活跃(未过期)通知上限 4 条**。 - **媒体通知除外**:单个 App 只允许保留 1 个媒体通知;允许多个媒体 App 同时(多应用同时播放场景),UI/逻辑后期处理好。 - 数据类型:`notify.category`(App 声明用哪些类型,≤4) / `notify.category_quota`(每类型 4,默认)。 - 系统事件:系统也抽象为 App(`app_id=system`),同样走配额(系统通知也占"系统"App 的类型/条数配额)。 - 配额只管**内存活跃态**;转储到 TF 的历史不受配额限制(只受 10MB 总量)。 ## 8. 转储规则(用户拍板,2026-08-29) - **通知创建 10 秒后自动转储到 TF 卡**(无论是否过期/被清)——通知中心显示"最近 10 秒内活跃" + TF 归档历史。 - **正常电源事件(关机/重启)触发清除板载通知数据之前**:先转储所有未上卡的通知,再清除板载。 - **异常关机**:开机时清理板载残留通知数据。 - TF 卡转储区 `MeowOS/notifications/`:保留**最新 10MB**(ring/截断),**不被电源事件清理**(持久留存)。 - **无 TF 卡**:系统可运行(内存态通知即可),不依赖卡。 ## 9. 通知中心 UI(阶段 B) - 状态栏下滑打开通知中心(用户已定),列表显示通知(app 图标 + summary + body + target Activity),点击按路由表解析跳转(M3 导航栈),下拉关闭/清除。**此部分依赖 M2 存储 + M3,后置。** ## 10. 分步实施建议 1. **M2a 通知存储 + 原生 IPC**:按上面的配额(category 级)+ TTL 10s 转储钩子 + 系统事件源(系统作 App)。→ 可先落地。 2. **M2b D-Bus 桥 meow_notify_dbus**(org.freedesktop.Notifications 桥接)。 3. **M2c 转储 TF 卡 + 10MB 保留 + 关机前转储/开机清理**。 4. M5 通知中心 UI(阶段 B)+ media 通知(MPRIS)。