Tidyvo 基于线上 v1.0.5 的竞品同构通知系统具体执行方案#
产品:Tidyvo: Deep Storage Cleaner(桌面名称:Tidyvo Cleaner)
包名:com.tidyvo.cleaner
当前线上基线:v1.0.5;本方案不擅自指定下一 App 版本号,正式启动新版本时再写入对应 PRD
方案日期:2026-08-13
竞品基线:Photo Recovery V1.0.3
配置真源:Tidyvo 自有中台;FCM 负责消息送达与配置刷新
产品现状:Notification Cleaner 已在上一线上版本加入,本方案按现有能力继续配置,不重复定义为新增功能 协作边界:本文只定义产品需求、中台规则、通知文案和验收口径,不代表实现状态;Codex 不开发业务代码,具体实现由开发团队基于线上 v1.0.5 代码完成
1. 执行结论#
Tidyvo 按竞品相同的系统结构执行:
自有中台下发策略、素材和灰度
→ 客户端保存 Offline_A / Online_B 或远程策略组
→ Service / Job / WorkManager / Alarm / FCM 维持调度和恢复入口
→ 时间窗口内按全局间隔循环尝试
→ 检查全局上限、通知栏数量和单素材频控
→ 从当前可用场景中选择通知
→ 本地通知或 FCM 展示
→ 统一跳板记录点击并进入 Tidyvo 对应功能
→ 在启动、功能完成和退出节点承接现有广告链路
“全盘复刻竞品”指:完整保留竞品已确认的调度模型、两套策略、17 个通知 ID、四类通知、特殊通知属性、后台恢复链、Notification Cleaner 和广告转化结构。
结合 Tidyvo 产品时,只做必要的业务语义替换:竞品的照片/视频/文档“恢复”场景,映射为 Tidyvo 已具备的照片整理、视频压缩、私密空间、联系人、To clean 和通知清理场景;不下发 Tidyvo 实际无法承接的恢复承诺。
2. 当前能力基线#
| 模块 | Tidyvo v1.0.5 现有/已确认能力 | 本方案使用方式 |
|---|---|---|
| Home | 存储状态、Smart Clean、六类媒体入口 | 综合召回、扫描、存储不足落地页 |
| Duplicate photos | 重复照片选择 | 照片整理场景 |
| Similar photos | 相似照片选择 | 照片整理场景 |
| Blurry photos | 模糊照片清理 | 照片整理场景 |
| Screenshots | 截图列表和清理 | 截图轮询与截图事件场景 |
| Large photos | 大照片复核 | 大文件/空间场景 |
| Large videos | 大视频复核 | 大文件/空间场景 |
| To clean | 用户选中内容的删除前汇总 | 待处理召回场景 |
| Compress | 视频压缩 | 视频场景 |
| Contacts | 重复联系人整理 | 联系人场景 |
| Private Space | 私密内容入口 | 隐私内容召回场景 |
| Charging Animation | 充电动画与后台通知 | 事件通知与高优先级展示能力复用 |
| Storage Widget | 桌面组件 | 长期曝光和回访入口 |
| Records | 操作历史 | 已处理内容召回场景 |
| Notification Cleaner | 已上线的通知清理、隐藏和历史能力 | 竞品 ID 17 和常驻监听链 |
| FCM / 中台 | 按本方案补齐 Token、配置和消息闭环 | 即时通知、配置刷新和恢复入口 |
3. 后台策略组#
3.1 竞品同构基线#
| 字段 | Offline_A | Online_B | 客户端含义 |
|---|---|---|---|
normal_enabled |
true | true | 普通通知总开关 |
upper_limit |
5 | 99 | 统计周期内普通通知总上限 |
interval_time_minutes |
30 | 2 | 全局循环尝试最短间隔 |
repetitions |
1 | 3 | 同一素材允许重复次数 |
continuous_ntf_num |
未确认 | 12 | 单轮连续通知数量 |
ntf_cooling_time_minutes |
未确认 | 2 | 一轮后的冷却时间 |
max_visible_ntf |
未确认 | 5 | 通知栏最大可见数 |
android_16_max_visible |
未确认 | 1 | Android 16 单独可见数 |
ad_ntf_upper_limit |
-1 | -1 | 广告通知不设客户端上限 |
未确认值不得编造成竞品事实。Tidyvo 后台字段保留 null,由远程策略显式填写;不因为未确认而删除能力。
3.2 Tidyvo 首次发布配置#
首次发布必须同时建立 Offline_A 和 Online_B,两组均可直接分配用户。中台必须支持按以下条件分组:
- 首个支持本方案的 App 版本及以上;具体版本号在常老大正式启动下一版本时写入对应 PRD;
- 国家/地区;
- App 当前语言;
- Android 版本;
- 厂商;
- 安装时长;
- 最后活跃时间;
- Notification Cleaner 授权状态;
- 远程百分比。
发布配置:
| 字段 | 初始值 |
|---|---|
master_switch |
true |
emergency_stop |
false |
strategy_group |
Offline_A 或 Online_B |
start_time |
08:00 |
end_time |
21:30 |
timezone_mode |
device_local |
min_install_age_minutes |
5 |
require_post_notifications |
true |
require_screen_on |
后台可配 |
require_device_unlocked |
后台可配 |
require_portrait |
后台可配 |
future_when_days |
非小米 365 |
fallback_locale |
en |
4. 统一落地页契约#
中台对外使用以下产品级枚举;开发团队负责映射到线上 v1.0.5 的真实内部路由。本文不以本地 v1.0.0 代码中的路由名称判断线上实现。未知值、参数缺失、当前页面不存在或权限不足时回退 Home。
| 中台路由 | Tidyvo 落地页 | 必要参数 | 无数据/无权限降级 |
|---|---|---|---|
home |
Home | 无 | Home |
smart_clean |
Smart Clean 结果或扫描 | 无 | 无有效缓存时先扫描 |
duplicates |
Duplicate photos | 无 | 无权限先走媒体权限;无结果显示空态 |
similar |
Similar photos | 无 | 同上 |
blurry |
Blurry photos | 无 | 同上 |
screenshots |
Screenshots | 无 | 同上 |
large_photos |
Large photos | 无 | 同上 |
large_videos |
Large videos | 无 | 同上 |
to_clean |
To clean | 无 | 为空时显示现有空态 |
compress |
Compress | 无 | 无视频权限先授权 |
contacts |
Contacts | 无 | 无联系人权限先授权 |
private_space |
Private Space | 无 | 进入现有解锁链 |
charging |
Charging Animation | 无 | 进入现有说明页 |
widget |
Storage Widget | 无 | 进入现有安装说明页 |
records |
Records | 无 | 无记录显示现有空态 |
notification_cleaner |
Notification Cleaner | 无 | 无通知使用权进入现有授权链 |
notification_access |
Notification Cleaner 权限说明 | 无 | 打开系统通知使用权设置 |
settings_notifications |
Settings 通知区域 | 无 | Settings |
5. 17 个通知 ID 的 Tidyvo 具体配置#
5.1 总表#
| ID | Tidyvo 场景 | 触发类型 | 触发条件 | 路由 | 单素材上限 | 单素材间隔 | 优先级 |
|---|---|---|---|---|---|---|---|
| 1 | 首页综合召回 | 轮询 | 已安装满5分钟,通知权限有效 | home |
5 | 15分钟 | 30 |
| 2 | 重复/相似照片 | 轮询 | 最近扫描存在重复或相似照片;无缓存时允许通用素材 | duplicates / similar |
5 | 15分钟 | 70 |
| 3 | 大视频与压缩 | 轮询 | 存在大视频或最近使用过 Compress;无缓存时允许通用素材 | large_videos / compress |
3 | 15分钟 | 65 |
| 5 | 私密空间 | 轮询 | Private Space 可用 | private_space |
3 | 15分钟 | 45 |
| 6 | 截图整理 | 轮询 | 最近扫描存在截图;无缓存时允许通用素材 | screenshots |
2 | 15分钟 | 75 |
| 7 | 联系人整理 | 轮询 | Contacts 功能可用 | contacts |
3 | 15分钟 | 50 |
| 8 | 已处理内容/记录 | 轮询 | Records 存在历史;无记录时回退 Home | records |
2 | 15分钟 | 35 |
| 9 | Smart Clean 主池 | 轮询 | Smart Clean 可用;允许固定宣称素材 | smart_clean |
5 | 15分钟 | 80 |
| 10 | 模糊照片提醒 | 轮询 | 最近扫描存在模糊照片;无缓存时允许通用素材 | blurry |
3 | 15分钟 | 72 |
| 11 | To clean 待确认 | 轮询 | To clean 有项目;无项目时使用首页综合素材 | to_clean / home |
5 | 15分钟 | 90 |
| 12 | 长时间未扫描 | 轮询 | 距离最近一次扫描达到后台变量 {days};首次无记录用安装时长 |
smart_clean |
3 | 15分钟 | 55 |
| 13 | 长时间未清理/容量 | 轮询 | 距离最近一次成功清理达到 {days},或存储达到 {used_percent} |
smart_clean |
3 | 15分钟 | 85 |
| 17 | Notification Cleaner | 轮询 | 已授权且本地通知历史存在记录;或使用通用通知过载素材 | notification_cleaner |
2 | 15分钟 | 88 |
| 18 | 大文件/空间不足 | 轮询 | 存在大照片/大视频,或系统剩余空间低 | large_videos / large_photos |
3 | 15分钟 | 95 |
| 14 | 新增媒体/文件事件 | 事件 | MediaStore 观察到新增媒体或大文件;用 Tidyvo 等价事件替换竞品 APK 安装包事件 | smart_clean |
后台可配 | 事件触发 | 78 |
| 15 | 删除后残留待确认 | 事件 | 删除/清理结束后 To clean 或扫描仍有待处理项;用 Tidyvo 等价事件替换竞品卸载残留事件 | to_clean |
后台可配 | 事件触发 | 92 |
| 16 | 新截图事件 | 事件 | MediaStore 观察到新截图,达到事件阈值 | screenshots |
后台可配 | 事件触发 | 82 |
5.2 选择顺序#
每次循环只选择当前优先级最高的一条合格素材:
ID 18 空间/大文件
→ ID 15 删除后仍有待处理
→ ID 11 To clean
→ ID 17 Notification Cleaner
→ ID 13 长时间未清理
→ ID 16 新截图
→ ID 9 Smart Clean
→ ID 14 新增媒体
→ ID 6 截图
→ ID 10 模糊照片
→ ID 2 重复/相似照片
→ ID 3 大视频/压缩
→ ID 12 长时间未扫描
→ ID 7 联系人
→ ID 5 私密空间
→ ID 8 Records
→ ID 1 首页综合召回
这个顺序是 Tidyvo 的业务映射规则,不声称是竞品代码已确认的选择顺序;它只负责在竞品同构调度器中决定 Tidyvo 场景优先级。
5.3 逐 ID 执行规则#
| ID | 准入与数据选择 | 排除/停发 | 模板池 | 点击与广告承接 |
|---|---|---|---|---|
| 1 | 安装满5分钟、通知权限有效、当前没有更高优先级场景;不依赖扫描数据 | 总开关关闭、达到全局或素材上限、超出时段 | TIDY_01_* |
进入 Home;按线上广告层执行通知唤醒的启动广告判断 |
| 2 | 优先选择有最新结果且容量更大的 Duplicate 或 Similar;无最新结果仍可使用无变量素材 | 媒体权限不可用时允许展示,但点击后先进入现有权限链;同素材冷却时换素材 | TIDY_02_* |
进入 Duplicate/Similar;进入列表后承接现有原生广告,操作结果承接现有插屏判断 |
| 3 | 有大视频时进入 Large Videos;否则进入 Compress;允许无变量通用素材 | 当前设备不支持对应视频处理时回退 Home | TIDY_03_* |
大视频列表或 Compress;压缩完成/退出按现有广告层请求广告 |
| 5 | Private Space 为线上可用功能时准入;无需读取私密内容数量 | 功能被中台关闭或设备不可用时不选该 ID | TIDY_05_* |
进入 Private Space 现有解锁链;禁止通知携带私密文件信息 |
| 6 | 有截图扫描结果时优先;没有结果时仍可使用无变量素材 | 场景关闭、素材冷却或全局上限达到时停发 | TIDY_06_* |
进入 Screenshots;列表和操作结果承接现有广告逻辑 |
| 7 | Contacts 功能存在即可;不要求预先读取联系人内容 | 功能关闭或设备不支持联系人能力时不发 | TIDY_07_* |
进入 Contacts;无权限走现有授权,通知和中台不携带联系人数据 |
| 8 | Records 有记录时优先;无记录可使用无变量素材但点击回退 Home | Records 功能关闭时不发 | TIDY_08_* |
有记录进入 Records,无记录进入 Home;退出按现有广告逻辑判断 |
| 9 | 作为 Smart Clean 主召回池始终可参与;动态素材与固定宣称素材均可选 | 只受总开关、策略组、全局/素材频控和通知栏数量限制 | TIDY_09_* |
进入 Smart Clean;若需扫描先显示扫描,再进入结果与广告链 |
| 10 | 有 Blurry 结果时优先;无结果可用无变量素材 | 媒体能力不可用时点击先走权限链 | TIDY_10_* |
进入 Blurry;操作完成和退出承接现有广告逻辑 |
| 11 | To clean 有项目时填 {count};为空时改用无变量素材并把路由设为 Home |
用户完成删除、清空选择或本地数据失效后变量素材立即失效 | TIDY_11_* |
有项目进入 To clean;删除完成进入现有报告并承接完成广告 |
| 12 | 最近扫描时间存在时计算 {days};没有记录时按安装时长计算并使用无变量素材 |
用户完成新扫描后,本轮旧变量素材失效,下一循环重新计算 | TIDY_12_* |
进入 Smart Clean 并启动/展示扫描结果 |
| 13 | 最近清理天数和存储使用率二选一;优先使用可用的动态变量,否则用无变量素材 | 用户完成清理后重新计算,不要求当天永久停发 | TIDY_13_* |
进入 Smart Clean;结果、清理完成和退出承接广告链 |
| 17 | Notification Cleaner 已授权时读取本地历史数量;无数量或未授权时使用无变量素材 | Notification Cleaner 中台开关关闭时停发;权限失效时路由改为权限说明 | TIDY_17_* |
已授权进入 Notification Cleaner,未授权进入现有授权链;退出请求现有 Notification Cleaner 广告场景 |
| 18 | 优先用真实剩余空间、扫描容量或最大类目;没有变量时使用 Large File Alert | 存储状态恢复后重新计算,不补发已过期动态素材 | TIDY_18_* |
大视频优先,其次大照片,再次 Smart Clean;列表与退出承接广告逻辑 |
| 14 | MediaStore 观察到新增媒体;达到中台配置的大小/数量阈值立即建立候选 | 事件过期、文件已不存在或已被处理时取消 | TIDY_14_* |
进入 Smart Clean;这是 Tidyvo 对竞品“安装包事件”的等价场景 |
| 15 | 删除/清理结束后重新扫描,仍存在 To clean 或推荐项时触发 | 剩余项目为0、用户已再次处理或事件超过有效期时取消 | TIDY_15_* |
进入 To clean;这是 Tidyvo 对竞品“卸载残留事件”的等价场景 |
| 16 | 观察到新截图并达到中台配置阈值;可选择固定100+素材 | 截图已删除、场景过期或达到素材上限时取消 | TIDY_16_* |
进入 Screenshots;列表和操作结果承接广告逻辑 |
5.4 统计周期和过期规则#
| 项目 | 规则 |
|---|---|
| 全局上限周期 | 按设备当地时间 00:00–23:59 统计,跨日重置 |
| 单素材上限周期 | 与全局周期一致;后台可为事件素材设置独立生命周期 |
| 轮询素材有效期 | 无变量素材默认到本统计周期结束;动态变量素材每次发送前重新校验 |
| 事件素材有效期 | ID 14、15、16 默认2小时,后台可配置 |
| 通知栏数量 | 发送前读取 Tidyvo 当前活动通知数;达到策略上限时等待下一循环 |
| 用户清除通知 | 记录 notification_dismiss;常驻通知按竞品恢复链处理,普通通知继续服从下一循环 |
| Force Stop | 不承诺系统强停后仍能恢复;用户重新打开 App 后补齐调度链 |
5.5 广告承接规则#
| 节点 | 需求 |
|---|---|
| 通知冷启动 | 进入统一跳板并完成初始化后,调用线上广告层已有的启动广告判断;广告不可用时直接落地,不阻断通知点击 |
| 通知热启动 | 不重新创建业务状态;调用线上热启动广告判断后进入目标页 |
| 扫描完成 | ID 2、6、9、10、12、13、18 进入扫描结果时请求现有结果广告场景 |
| 操作完成 | 删除、压缩、联系人合并等完成后请求线上现有完成广告场景 |
| 页面退出 | Smart Clean、媒体列表、Compress、Contacts、Records、Notification Cleaner 退出时请求线上对应退出广告场景 |
| 原生广告 | 复用线上列表/结果页已有原生广告位置,不因通知入口重复插入第二套原生位 |
| 去重 | 同一次通知点击只产生一次启动广告判断和一次落地,不因 Activity 重建重复请求 |
5.6 每轮决策顺序#
客户端每次被任一调度入口唤起后,按固定顺序判断:
读取最后一份校验通过的中台配置
→ 检查 master_switch / emergency_stop
→ 检查当前 App 版本是否命中发布范围
→ 选择用户所属策略组
→ 检查当地时间窗口
→ 检查 POST_NOTIFICATIONS
→ 检查安装时长门槛
→ 检查全局 upper_limit 与 interval_time
→ 检查当前活动通知数
→ 收集当前合格的17个ID候选
→ 按第5.2节优先级排序
→ 检查候选ID的 upper_limit / interval
→ 检查模板语言、enabled、weight、repetitions
→ 校验动态变量;无效时切换同ID无变量模板
→ 生成对应 normal/ad/res/filter 通知
→ 保存通知ID、模板、策略组、展示时间和次数
任一步不满足时记录抑制原因;轮询通知等待下一循环,事件通知在有效期内等待下一可执行机会。
5.7 本地与服务端职责#
| 判断 | 执行位置 |
|---|---|
| App 版本、国家、语言、灰度、策略组 | 中台下发,客户端校验 |
| 当前媒体数量、容量、To clean、Records、Notification Cleaner 数量 | 只在客户端本地判断 |
| 通知总开关、时段、频控、素材、路由、权重 | 中台配置,客户端执行 |
| 即时运营通知 | 中台通过 FCM 下发 |
| 配置更新 | FCM 发送刷新信号,客户端再向中台取完整配置 |
| 本地周期通知 | 客户端调度;中台不能远程读取用户文件来替客户端判断 |
| 展示、点击、落地和转化埋点 | 客户端脱敏上报 |
6. 英文生产文案池#
英文为 fallback_locale,所有其他语言缺失或解析失败时使用本表。fixed_claim=true 的素材按竞品固定宣称方式保留,不要求本地实时扫描值。
| 模板 ID | 通知 ID | 标题 | 正文 | 变量/标记 | 路由 |
|---|---|---|---|---|---|
TIDY_01_A |
1 | View now | Keep your storage organized with Tidyvo Cleaner. | 无 | home |
TIDY_01_B |
1 | Clean Now | Open Tidyvo for a quick storage check. | 无 | home |
TIDY_02_A |
2 | View now | Similar photos may be taking up your storage. | 无 | similar |
TIDY_02_B |
2 | Start Cleaning | Review duplicate photos and keep the ones you want. | 无 | duplicates |
TIDY_03_A |
3 | View now | Large videos may be using more space than you expect. | 无 | large_videos |
TIDY_03_B |
3 | Handle Now | Compress videos to reduce their storage size. | 无 | compress |
TIDY_05_A |
5 | View now | Keep selected photos and videos in Private Space. | 无 | private_space |
TIDY_05_B |
5 | Handle Now | Review your private files in Tidyvo. | 无 | private_space |
TIDY_06_A |
6 | View now | Clean up your screenshots regularly to make your phone run more smoothly! | 无 | screenshots |
TIDY_06_B |
6 | Clean Now | Let’s clean up your screenshots! | 无 | screenshots |
TIDY_07_A |
7 | View now | Duplicate contacts detected? Review and merge them now. | 无 | contacts |
TIDY_07_B |
7 | Handle Now | Keep your contact list organized with Tidyvo. | 无 | contacts |
TIDY_08_A |
8 | View now | Come see your recent cleanup records. | 无 | records |
TIDY_08_B |
8 | View now | Your recent storage activity is ready to review. | 无 | records |
TIDY_09_A |
9 | Clean Now | Junk Files Detected | fixed_claim=true |
smart_clean |
TIDY_09_B |
9 | Start Cleaning | Too many junk files! Clean them up now! | fixed_claim=true |
smart_clean |
TIDY_09_C |
9 | Handle Now | Junk files are slowing down your device. | fixed_claim=true |
smart_clean |
TIDY_09_D |
9 | Clean Now | 1.8GB Junk Detected! Free Up Space Now → Speed Boost up to 35%↑ | fixed_claim=true |
smart_clean |
TIDY_09_E |
9 | Start Cleaning | Deep Scan Complete! Junk Files Found - Tap to Eliminate Lag ➤ | fixed_claim=true |
smart_clean |
TIDY_09_F |
9 | Handle Now | 23 Rarely Used Apps Detected! Uninstall to Free 8.5GB ➔ | fixed_claim=true |
smart_clean |
TIDY_10_A |
10 | View now | Blurry photos are ready for your review. | 无 | blurry |
TIDY_10_B |
10 | Clean Now | Review low-quality photos and choose what to remove. | 无 | blurry |
TIDY_11_A |
11 | Handle Now | {count} selected items are still waiting for confirmation. | {count} |
to_clean |
TIDY_11_B |
11 | Clean Now | Finish reviewing the items in To clean. | 无 | to_clean |
TIDY_12_A |
12 | View now | You haven't scanned your storage for a long time. | 无 | smart_clean |
TIDY_12_B |
12 | Start Cleaning | {days} days since your last storage scan. | {days} |
smart_clean |
TIDY_13_A |
13 | Clean Now | You haven't cleaned up your phone junk for a long time. | 无 | smart_clean |
TIDY_13_B |
13 | Handle Now | Storage {used_percent} full! Clear junk now. | {used_percent} |
smart_clean |
TIDY_13_C |
13 | Start Cleaning | {days} days with no junk cleared! Clean now. | {days} |
smart_clean |
TIDY_14_A |
14 | Clean Now | New media detected. Scan your storage now. | 无 | smart_clean |
TIDY_14_B |
14 | Handle Now | A new large file may be taking up storage. | 无 | smart_clean |
TIDY_15_A |
15 | Clean Now | Cleanup complete. Review the remaining items? | 无 | to_clean |
TIDY_15_B |
15 | Handle Now | More selected files are waiting in To clean. | 无 | to_clean |
TIDY_16_A |
16 | Clean Now | Clean 100+ Old Screenshots? Free up space with one tap. | fixed_claim=true |
screenshots |
TIDY_16_B |
16 | Start Cleaning | New screenshots detected. Review them now. | 无 | screenshots |
TIDY_17_A |
17 | Clean Now | {count} unread notifications! Manage notifications bar. | {count} |
notification_cleaner |
TIDY_17_B |
17 | Start Cleaning | Notification overload? Declutter notifications now. | 无 | notification_cleaner |
TIDY_17_C |
17 | Handle Now | Unread notifications! Manage notifications bar. | 无 | notification_cleaner |
TIDY_18_A |
18 | Clean Now | Only {free_space} space left! Clear data now. | {free_space} |
large_videos |
TIDY_18_B |
18 | Start Cleaning | {size} junk to be cleaned up! Clean junk instantly. | {size} |
smart_clean |
TIDY_18_C |
18 | Handle Now | Large File Alert! | 无 | large_videos |
7. 文案选择和变量规则#
7.1 文案选择#
- 先按 App 当前语言筛选模板;没有对应语言时使用英语。
- 同一 ID 中只选择
enabled=true且未超过自身频控的模板。 - 按
weight加权随机;首次录入时同一 ID 各模板权重平均。 repetitions控制同一模板可连续出现次数;超过后必须换该 ID 的其他模板。- 模板全部冷却时跳过该 ID,继续选择下一优先级场景。
7.2 变量#
| 变量 | 来源 | 格式 | 缺失处理 |
|---|---|---|---|
{count} |
本地扫描、To clean 或通知历史 | 本地化整数 | 换同 ID 无变量模板 |
{size} |
本地扫描结果 | MB / GB 自动格式化 | 换无变量模板 |
{free_space} |
系统可用存储 | MB / GB | 换 Large File Alert! |
{used_percent} |
系统存储使用率 | 本地化百分比 | 换无变量模板 |
{days} |
本地最近扫描/清理时间 | 本地化整数 | 换无变量模板 |
fixed_claim=true 不读取本地变量,直接展示素材中固定数字。
8. Notification Cleaner 联动#
Notification Cleaner 已上线,本方案只补齐其与同构通知系统的联动:
| 环节 | 规则 |
|---|---|
| 权限状态 | 客户端记录 Notification access 是否有效 |
| 全局开关 | 保留已上线“通知隐藏”总开关 |
| 白名单 | 沿用线上版本现有白名单/逐 App 开关;若线上已按竞品约280包名实现,直接作为配置基线 |
| 通知处理 | 非 ongoing 且不在白名单的通知取消并写入本地历史 |
| ID 17 条件 | 本地历史数量可用时填 {count};不可用时选择无变量模板 |
| ID 17 路由 | notification_cleaner |
| 权限失效 | 点击路由降级到 notification_access |
| 常驻通知 | 通知 ID 2084960406,竞品同构属性见第10章 |
8.1 权限需求#
| 权限/状态 | 产品要求 |
|---|---|
POST_NOTIFICATIONS |
按竞品方式在首次冷启动完成基础初始化后直接请求;系统未授权时不展示普通通知 |
| 用户拒绝通知权限 | 不伪造授权成功;后续进入通知相关功能时可再次引导或打开系统设置 |
| Notification access | 沿用线上 v1.0.5 已有 Notification Cleaner 授权入口和页面,不重复新建功能 |
| Notification access 已授权 | 启动通知监听、隐藏规则、本地历史和常驻恢复链 |
| Notification access 被撤销 | 停止监听;ID 17 点击改进入已有权限说明/系统设置链 |
| 其他既有权限 | Notification Cleaner 已上线,本方案不改动其现有权限顺序、页面和授权结果处理 |
权限状态只决定能否执行对应能力,不改变 Offline_A / Online_B、17个ID和文案池的建档范围。
9. FCM Token 与中台联动#
9.1 Token 注册#
App 首次获取或刷新 Token 后上传:
{
"installation_id": "install_uuid",
"fcm_token": "token",
"app_version": "{current_app_version}",
"platform": "android",
"locale": "en",
"country": "US",
"timezone": "America/New_York",
"notification_permission": true,
"notification_access": true,
"strategy_group": "Online_B"
}
9.2 两类消息#
即时通知:中台筛选 Token 后通过 FCM HTTP v1 发送完整通知和路由。
配置刷新:
{
"type": "config_refresh",
"config_version": "tidyvo-ntf-001"
}
客户端比较版本后从中台拉取完整配置,校验、保存并重新安排本地任务。
9.3 统一 payload#
{
"message_id": "msg_uuid",
"campaign_id": "campaign_id",
"notification_id": "9",
"template_id": "TIDY_09_D",
"type": "ad_ntf",
"route": "smart_clean",
"config_version": "tidyvo-ntf-001",
"expire_at": "1786636800000"
}
服务账号和 HTTP v1 凭证只存在服务端,不进入 APK、中台前端、Git 或配置 payload。
10. 四类通知与特殊属性#
| 类型 | Tidyvo 用途 | 规则 |
|---|---|---|
normal_ntf |
ID 1~18 普通轮询/事件通知 | 使用策略组总上限和素材频控 |
ad_ntf |
运营或广告召回素材 | 保留 -1 无上限能力和独立频道 |
res_ntf |
大样式通知 | 支持 RemoteViews、放大数字/关键词和图片 |
filter_ntf |
Notification Cleaner 常驻通知 | ongoing、no-clear、foreground-service |
特殊属性:
| 属性 | 配置 |
|---|---|
非小米 when |
当前时间加365天 |
| 删除动作 | restart_foreground_service |
| 自动取消 | 常驻通知 false |
| 可见性 | public |
| 提醒 | 高优先级、声音、震动、灯光由频道配置 |
| 常驻通知 ID | 2084960406 |
| 服务返回值 | START_STICKY |
11. 后台维持和恢复链#
| 能力 | 竞品同构参数 | Tidyvo 职责 |
|---|---|---|
| NotificationListenerService | 系统绑定 | Notification Cleaner 监听、取消和入库 |
| 前台 Service | START_STICKY |
常驻通知、通知调度与恢复中心 |
| 快速 Job | 3999–5999ms |
Service 启动失败后的快速补拉 |
| WorkManager | 目标约18分钟 | 周期检查、配置同步和恢复入口 |
| 持久 Job | 1446000–1449999ms |
约24分钟心跳恢复 |
| Alarm | 28799365ms |
约8小时长周期兜底 |
| Boot receiver | BOOT_COMPLETED |
开机后重新安排链路 |
| Update receiver | MY_PACKAGE_REPLACED |
App 更新后重新安排链路 |
| FCM | normal / high 分支 | 即时通知、配置刷新和恢复入口 |
| Activity resume | App 进入前台 | 检查并补齐任务和配置 |
Android 及厂商系统可能延迟或限制这些能力;测试报告记录实际结果,但不删除对应实现。
12. 中台字段#
12.1 全局字段#
| 字段 | 类型 |
|---|---|
config_version |
string |
master_switch |
boolean |
emergency_stop |
boolean |
strategy_group |
string |
start_time / end_time |
local time |
timezone_mode |
enum |
upper_limit |
integer |
interval_time_minutes |
integer |
repetitions |
integer |
continuous_ntf_num |
integer/null |
ntf_cooling_time_minutes |
integer/null |
max_visible_ntf |
integer/null |
android_16_max_visible |
integer/null |
ad_ntf_upper_limit |
integer |
future_when_days |
integer |
12.2 场景字段#
| 字段 | 类型 |
|---|---|
notification_id |
integer |
enabled |
boolean |
trigger_type |
interval / local_event / fcm |
condition |
JSON rule |
route |
enum |
upper_limit |
integer |
interval_minutes |
integer |
priority |
integer |
template_pool_id |
string |
expire_minutes |
integer/null |
notification_type |
normal_ntf / ad_ntf / res_ntf / filter_ntf |
12.3 模板字段#
| 字段 | 类型 |
|---|---|
template_id |
string |
notification_id |
integer |
locale |
BCP 47 tag |
title |
string |
body |
string |
route |
enum |
variables |
string array |
fixed_claim |
boolean |
weight |
integer |
enabled |
boolean |
13. 埋点#
| 事件 | 关键字段 |
|---|---|
notification_eligible |
notification_id, strategy_group |
notification_suppressed |
notification_id, reason |
notification_scheduled |
notification_id, template_id |
notification_shown |
notification_id, template_id, type |
notification_open |
notification_id, template_id, route |
notification_dismiss |
notification_id, template_id |
notification_landing |
notification_id, route, result |
notification_conversion |
notification_id, action |
config_fetch |
config_version, result |
service_restore |
source, result, elapsed_ms |
Notification Cleaner 内容只在本机处理;埋点不上传通知标题、正文、发送者、验证码、图片或原始 PendingIntent。
14. 中台配置示例#
{
"config_version": "tidyvo-ntf-001",
"master_switch": true,
"emergency_stop": false,
"strategy_groups": {
"Offline_A": {
"upper_limit": 5,
"interval_time_minutes": 30,
"repetitions": 1,
"ad_ntf_upper_limit": -1
},
"Online_B": {
"upper_limit": 99,
"interval_time_minutes": 2,
"repetitions": 3,
"continuous_ntf_num": 12,
"ntf_cooling_time_minutes": 2,
"max_visible_ntf": 5,
"android_16_max_visible": 1,
"ad_ntf_upper_limit": -1
}
},
"assignment": {
"strategy_group": "Online_B",
"app_version_scope": "{feature_enabled_app_version}",
"percentage": 100
},
"global_rule": {
"start_time": "08:00",
"end_time": "21:30",
"timezone_mode": "device_local",
"min_install_age_minutes": 5,
"future_when_days": 365
},
"scenes": [
{
"notification_id": 17,
"enabled": true,
"trigger_type": "interval",
"condition": {
"notification_access": true,
"notification_cleaner_enabled": true
},
"upper_limit": 2,
"interval_minutes": 15,
"priority": 88,
"route": "notification_cleaner",
"template_pool_id": "POOL_TIDY_17",
"notification_type": "normal_ntf"
}
]
}
15. 开发交付需求顺序#
本章只规定需求交付顺序,不执行开发。
- 开发团队以线上
v1.0.5代码为唯一实现基线,不使用本地 v1.0.0 覆盖线上功能。 - 开发团队回填线上 Notification Cleaner 的真实内部路由、白名单、数据库和权限链映射;产品验收按本文行为,不按类名或代码结构验收。
- 中台提供策略、场景、模板、语言、灰度和回滚配置能力。
- 客户端支持配置解析、版本校验、本地缓存和失败兜底。
- 中台建立17个通知 ID及完整生产素材,并按确定语言范围导入多语言。
- 客户端提供统一通知跳板,并只接受第4章产品级落地页枚举。
- 完成 FCM Token 注册、配置刷新和即时通知需求。
- 完成 Service、Job、WorkManager、Alarm、开机/升级与 FCM 恢复链需求。
- 完成四类通知和特殊通知属性需求。
- 测试团队逐 ID、逐策略、逐语言和逐 ROM 验收。
16. 验收清单#
- 开发团队确认实现基线为线上
v1.0.5,Notification Cleaner 现有能力未被旧代码覆盖。 - Offline_A 和 Online_B 参数可由中台直接分配。
- 17 个通知 ID 全部建档且各有 Tidyvo 场景、条件、路由和英文素材。
- ID 14、15、16 能按 Tidyvo 等价本地事件触发。
- App 12种现有语言均可选到对应文案,缺失时回退英语。
- 全局、场景、素材、通知栏数量和重复次数同时生效。
- Online_B 2分钟间隔、99条上限和广告
-1能力可验证。 - 统一跳板拒绝未知路由并回退 Home。
- Notification Cleaner 权限、隐藏、历史、ID 17 和常驻服务形成闭环。
- Service、快速 Job、18分钟 Work、24分钟 Job、8小时 Alarm、开机/升级和 FCM 均有测试结果。
- 非小米未来365天时间戳和删除通知恢复服务按设备记录结果。
- Token 刷新、解绑和失效清理可验证,APK及日志不暴露服务端凭证。
- 每个 ID 验证展示、点击、落地、广告请求和埋点链路。
- Pixel、Samsung、Xiaomi 至少各一台记录实际系统表现;未测设备明确标记未验证。