Tidyvo 通知系统专项 PRD(竞品 B 单方案)#
1. 产品基本信息#
| 字段 | 内容 |
|---|---|
| 产品名称 | Tidyvo Cleaner(Google Play:Tidyvo: Deep Storage Cleaner) |
| 平台 | Android |
| 包名 | com.tidyvo.cleaner |
| 实现基线 | 线上 v1.0.5;Notification Cleaner(通知清理)已在上一版本加入 |
| 竞品基线 | Photo Recovery V1.0.3,包名 com.files.photo.recovery.restore.pro |
| 文档日期 | 2026-08-14 |
| 文档性质 | 新通知需求包;原通知方案文档不修改 |
| 冲突优先级 | 旧文档中的 A/B 分组、中台多字段通知配置、业务 FCM Token 绑定、文案权重/数值优先级和 12 语言交付均废止;通知需求以本 PRD 为准 |
2. 版本目标#
按照竞品已确认的 Online_B(竞品 APK 内置的高频通知配置,以下简称“竞品 B”)机制,为 Tidyvo 落地一套固定通知方案:
- 不做 A/B 分组,不允许中台修改通知条数、间隔、场景、路由或文案。
- 普通通知的条数、间隔、单 ID 上限、可见数量和后台恢复参数统一采用竞品 B。
- 中台只提供一个“通知下放范围”控制:全部关闭、仅自然量、仅推广用户。
- 同一场景有多条文案时,由客户端用等概率随机数选出一整条“标题+正文”。
- 不建设业务侧 FCM Token(Firebase 设备令牌)上传、绑定和单设备推送;改用 FCM Topic(主题)空数据消息尝试唤醒进程,再由客户端执行本地通知规则。
- 通知源文案只交付中文和英文,其他语言由开发基于这两份源文案翻译。
3. 本次范围及具体需求#
3.1 本次范围#
| 需求编号 | 本次做 | 本次不做 |
|---|---|---|
| R1 | 竞品 B 单套普通通知频控 | 不做两套策略、比例灰度或动态频控 |
| R2 | 14 个周期 ID+3 个事件 ID 的 Tidyvo 映射 | 不新增竞品未出现的通知 ID 和数值优先级 |
| R3 | 同场景中英文文案池,等概率随机 | 不做权重、顺序轮播和 12 语言配置表 |
| R4 | 中台三态下放范围 | 不在中台配置场景、文案、上限、间隔或路由 |
| R5 | FCM Topic 空消息唤醒+本地恢复链 | 不上传、绑定或按业务保存 FCM Token |
| R6 | 复用现有 Notification Cleaner 作为 ID 17 落地页 | 不重做通知清理页面和权限链 |
| R7 | 保留竞品 ad_ntf / res_ntf / filter_ntf 三种通知能力 |
不把三种通知误算进普通通知 99 条上限 |
3.2 总体方案:竞品做法与 Tidyvo 方案#
| 项目 | 竞品已确认做法 | Tidyvo 本次方案 |
|---|---|---|
| 策略配置 | APK 内置不同通知配置,其中 B 为高频配置 | 只实现一套,固定采用竞品 B 参数 |
| 普通通知调度 | 时间窗口内循环检查 ntf_items,一次选出一个可用 ID |
按竞品 B 的 ID 顺序循环查找,一次调度最多展示 1 条 |
| 场景选择 | 配置中没有 30、50、95 之类的数值优先级字段 | 不自建优先级;从上次位置继续循环,找到第一个符合频控的 ID 就展示 |
| 文案选择 | 从同 ID 的标题池、正文池、图标池分别随机取值 | 同一 ID 预先定义完整文案模板;从可用模板中等概率随机取 1 条,标题与正文不拆开 |
| 远程消息 | 已确认存在 FCM Service 和消息分支;服务端实际 Token、Topic 与发送策略无法从 APK 证明 | 客户端订阅来源 Topic;中台只发空数据消息尝试唤醒,不下发通知文案、ID 或路由 |
| 后台维持 | Service、Job、WorkManager、Alarm、开机/升级广播、FCM 多路恢复 | 按竞品已确认参数建立同样的恢复入口;每个入口最终都只启动同一套本地调度器 |
| Notification Cleaner | 监听并管理其他 App 通知;通知 ID 17 路由到 noticlean |
复用线上已有通知清理功能;ID 17 点击进入现有 Notification Cleaner |
证据边界:竞品 B 参数、14 个普通 ID、素材池、循环选择、同 ID 刷新、可见数量和后台恢复入口来自 APK 配置或代码;竞品服务端实际受众、Topic/Token 使用方式和线上实际下发策略不可观测,不能写成竞品事实。
3.3 R1:竞品 B 固定频控#
3.3.1 全局参数#
| 竞品字段 | Tidyvo 固定值 | 白话解释 |
|---|---|---|
ntf_switch |
1 |
普通通知能力开启;最终仍受中台下放范围、系统权限和功能状态拦截 |
upper_limit |
99 |
每个手机本地自然日最多成功展示 99 条普通通知 |
interval_time |
120000ms(2 分钟) |
任意两条普通通知成功展示至少间隔 2 分钟 |
ntf_m_on_upper_limit |
99 |
开启 Notification Cleaner 权限后,普通通知日上限仍为 99,不改变 |
ntf_m_on_interval_time |
120000ms(2 分钟) |
开启 Notification Cleaner 权限后,普通通知间隔仍为 2 分钟,不改变 |
continuous_ntf_num |
12 |
累计成功展示 12 条后记录一次冷却点;不是一次发 12 条 |
ntf_cooling_time |
120000ms(2 分钟) |
达到连续 12 条后至少冷却 2 分钟;由于全局间隔也是 2 分钟,正常情况下不会叠加成 4 分钟 |
start_time / end_time |
00:00 / 24:00 |
全天可尝试,不自创 08:00—21:30 之类的静默时段 |
repetitions |
3 |
首次展示后,同一个通知 ID 可每隔约 4 秒再次刷新,最多刷新 3 次;仍是通知栏中的同一张卡,不是再增加 3 条,也不是连续三轮使用同一句文案 |
max_visible_ntf |
5 |
Android 15 及以下,Tidyvo 普通通知同时最多保留 5 条;再来新通知时先移除最早一条,再显示新的 |
os16_max_visible_ntf |
1 |
Android 16 及以上同时最多保留 1 条;新通知替换上一条 |
统计周期按手机当地日期 yyyyMMdd 计算,00:00 进入新自然日后,普通通知总次数和各 ID 当日次数重新计数。
3.3.2 普通通知之外还有什么#
| 竞品名称 | 白话解释 | 竞品已确认参数 | Tidyvo 本次处理 |
|---|---|---|---|
normal_ntf |
普通召回通知;就是本 PRD 的清理、截图、大文件等 17 个 ID | B:每日 99 条、全局 2 分钟,另有单 ID 频控 | 按第 3.3—3.5 节完整执行 |
ad_ntf |
高优先级广告召回通知,不是普通通知 | 开启;upper_limit=-1、interval_time=-1,表示该兜底配置不限制条数和间隔 |
保留独立类型、频道和竞品参数,不占普通通知 99 条;是否触发仍由对应广告召回入口决定 |
res_ntf |
带多个功能入口的大样式通知 | 开启;一个统计周期上限 2 条,最短间隔 4 小时 | 保留大样式能力;入口替换为 Tidyvo 现有清理功能,不占普通通知 99 条 |
filter_ntf |
前台服务或通知过滤使用的 ongoing(持续显示)通知 | 已确认存在持续通知和过滤点击入口;没有 B 普通通知频控字段 | 用于 Tidyvo 前台服务和现有 Notification Cleaner,不作为营销召回,不占普通通知 99 条 |
因此,“普通通知总开关”只控制 normal_ntf 这一整类,不是给每一条文案单独设置开关,也不等于关闭前台服务通知或 Notification Cleaner。
3.3.3 规则示例#
10:00 展示 ID 12
10:02 最早可以展示另一个合格 ID
10:04 再检查下一 ID
……
累计成功展示到第 12 条
→ 记录连续通知冷却点
→ 至少等 2 分钟后再进入下一次调度
一次调度只会展示一条。即使同一时刻有三个场景满足,也不会同时弹三条;其余场景等待之后的 2 分钟调度。
3.4 R2:ID 循环、单 ID 频控与 Tidyvo 路由#
3.4.1 14 个周期 ID#
客户端按下表顺序组成循环列表。每次从上次停留位置继续检查,遇到第一个未超上限且满足 15 分钟间隔的 ID,就随机选择该 ID 的一条文案并展示;展示后游标移到下一个 ID。若全部不符合,本次不展示。
| 循环顺序 | ID | 竞品场景/路由 | 单 ID 日上限 | 单 ID 间隔 | Tidyvo 场景 | Tidyvo 点击目标 |
|---|---|---|---|---|---|---|
| 1 | 12 | 长时间未扫描 / photo |
3 | 15 分钟 | 长时间未检查存储 | Smart Clean |
| 2 | 10 | 已删除照片风险 / photo |
3 | 15 分钟 | 模糊照片检查 | Blurry |
| 3 | 13 | 长时间未清理 / junkcleaner |
3 | 15 分钟 | 长时间未清理存储 | Smart Clean |
| 4 | 1 | 首页综合召回 / home |
5 | 15 分钟 | 综合存储检查 | Home |
| 5 | 2 | 照片恢复 / photo |
5 | 15 分钟 | 重复/相似照片检查 | Duplicates |
| 6 | 9 | 垃圾清理 / junkcleaner |
5 | 15 分钟 | Smart Clean 召回 | Smart Clean |
| 7 | 3 | 视频恢复 / video |
3 | 15 分钟 | 视频压缩 | Compress |
| 8 | 11 | 已删除文件风险 / home |
5 | 15 分钟 | 待清理项目确认 | To clean |
| 9 | 5 | 文档恢复 / document |
3 | 15 分钟 | 私密文件管理 | Private Space |
| 10 | 6 | 截图清理 / screenshot |
2 | 15 分钟 | 截图清理 | Screenshots |
| 11 | 7 | 联系人备份 / contacts |
3 | 15 分钟 | 重复联系人整理 | Contacts |
| 12 | 8 | 已恢复文件 / recoveryed |
2 | 15 分钟 | 清理记录回访 | Records |
| 13 | 17 | 通知清理 / noticlean |
2 | 15 分钟 | 通知清理召回 | Notification Cleaner |
| 14 | 18 | 大文件清理 / largeclean |
3 | 15 分钟 | 大文件/空间检查 | Smart Clean |
这里没有“哪个场景优先级是 95”这一层。竞品 B 的实际可见规则是:全局最短 2 分钟;同一个 ID 自己还要满足 15 分钟和当日次数上限。
3.4.2 3 个事件 ID#
竞品 ID 14、15、16 不在上述普通 14 项轮询配置中,而是由本地事件触发。Tidyvo 只做产品能力替换,不声称替换后的事件就是竞品原始事件。
| ID | 竞品事件事实 | Tidyvo 对应事件 | 文案消费规则 | 点击目标 |
|---|---|---|---|---|
| 14 | 安装包安装后清理残留 | 检测到新增媒体或大文件 | 每次系统事件只生成 1 个候选,不自动重复 12 次 | Smart Clean |
| 15 | App 卸载后清理残留 | 一次清理完成后仍有 To clean 项目 | 每次完成事件只生成 1 个候选 | To clean |
| 16 | 新截图事件 | 检测到新截图 | 每次截图事件只生成 1 个候选 | Screenshots |
事件候选也必须通过中台受众、通知权限、全局 99 条、全局 2 分钟和通知栏可见数量检查。多个事件同时发生时,不另建优先级;客户端只消费系统最先回调的一条,其余等待下一次调度。
3.5 R3:同场景随机文案#
3.5.1 随机规则#
- 每个模板由“中文标题+中文正文+英文标题+英文正文+固定路由”组成。
- 同一 ID 有
N条可用模板时,客户端生成[0, N-1]的均匀随机整数,等概率选中一条。 - 不配置权重,不记录轮播顺序,不要求上一条之后必须换文案,因此连续两次随机到同一条是正常结果。
- 带变量的模板只有在本机能取得真实变量时才进入随机池;变量不可用时只在无变量模板中等概率随机,通知中不得出现未替换的
{count}等占位符。 repetitions=3只刷新本次已经选中的同一通知,不重新随机文案。
3.5.2 中英文生产文案池#
| 模板 | ID | 中文标题 | 中文正文 | English title | English body | 路由 |
|---|---|---|---|---|---|---|
01-A |
1 | 立即查看 | 使用 Tidyvo Cleaner 整理存储空间。 | View now | Keep your storage organized with Tidyvo Cleaner. | Home |
01-B |
1 | 立即清理 | 打开 Tidyvo,快速检查存储空间。 | Clean Now | Open Tidyvo for a quick storage check. | Home |
02-A |
2 | 立即查看 | 相似照片可能正在占用你的存储空间。 | View now | Similar photos may be taking up your storage. | Duplicates |
02-B |
2 | 开始清理 | 检查重复照片,保留你想要的照片。 | Start Cleaning | Review duplicate photos and keep the ones you want. | Duplicates |
03-A |
3 | 立即查看 | 大视频占用的空间可能比你想象的更多。 | View now | Large videos may be using more space than you expect. | Compress |
03-B |
3 | 立即处理 | 压缩视频,减少存储占用。 | Handle Now | Compress videos to reduce their storage size. | Compress |
05-A |
5 | 立即查看 | 将选中的照片和视频保存在私密空间。 | View now | Keep selected photos and videos in Private Space. | Private Space |
05-B |
5 | 立即处理 | 在 Tidyvo 中检查你的私密文件。 | Handle Now | Review your private files in Tidyvo. | Private Space |
06-A |
6 | 立即查看 | 定期清理截图,让手机运行更流畅! | View now | Clean up your screenshots regularly to make your phone run more smoothly! | Screenshots |
06-B |
6 | 立即清理 | 一起清理截图吧! | Clean Now | Let’s clean up your screenshots! | Screenshots |
07-A |
7 | 立即查看 | 发现重复联系人?立即检查并合并。 | View now | Duplicate contacts detected? Review and merge them now. | Contacts |
07-B |
7 | 立即处理 | 使用 Tidyvo 整理联系人列表。 | Handle Now | Keep your contact list organized with Tidyvo. | Contacts |
08-A |
8 | 立即查看 | 看看你最近的清理记录。 | View now | Come see your recent cleanup records. | Records |
08-B |
8 | 立即查看 | 你的近期存储操作记录可以查看了。 | View now | Your recent storage activity is ready to review. | Records |
09-A |
9 | 立即清理 | 检测到垃圾文件。 | Clean Now | Junk Files Detected. | Smart Clean |
09-B |
9 | 开始清理 | 垃圾文件过多!立即清理! | Start Cleaning | Too many junk files! Clean them up now! | Smart Clean |
09-C |
9 | 立即清理 | 检测到 1.8GB 垃圾!立即释放空间,速度最高提升 35%↑ | Clean Now | 1.8GB Junk Detected! Free Up Space Now → Speed Boost up to 35%↑ | Smart Clean |
10-A |
10 | 立即查看 | 模糊照片可以检查了。 | View now | Blurry photos are ready for your review. | Blurry |
10-B |
10 | 立即清理 | 检查低质量照片,并选择要移除的内容。 | Clean Now | Review low-quality photos and choose what to remove. | Blurry |
11-A |
11 | 立即处理 | 选中的项目仍在等待确认。 | Handle Now | Selected items are still waiting for confirmation. | To clean |
11-B |
11 | 立即清理 | 完成 To clean 中项目的检查。 | Clean Now | Finish reviewing the items in To clean. | To clean |
12-A |
12 | 立即查看 | 你已经很久没有检查存储空间了。 | View now | You haven't scanned your storage for a long time. | Smart Clean |
12-B |
12 | 开始清理 | 是时候再次检查存储空间了。 | Start Cleaning | It’s time for another storage scan. | Smart Clean |
13-A |
13 | 立即清理 | 你已经很久没有清理手机存储了。 | Clean Now | You haven't cleaned up your phone storage for a long time. | Smart Clean |
13-B |
13 | 立即处理 | 存储空间正在变满,立即检查。 | Handle Now | Storage is filling up. Review it now. | Smart Clean |
14-A |
14 | 立即清理 | 检测到新媒体,立即检查存储空间。 | Clean Now | New media detected. Scan your storage now. | Smart Clean |
14-B |
14 | 立即处理 | 新的大文件可能正在占用存储空间。 | Handle Now | A new large file may be taking up storage. | Smart Clean |
15-A |
15 | 立即清理 | 清理完成,要检查剩余项目吗? | Clean Now | Cleanup complete. Review the remaining items? | To clean |
15-B |
15 | 立即处理 | To clean 中还有选中的文件等待处理。 | Handle Now | More selected files are waiting in To clean. | To clean |
16-A |
16 | 立即清理 | 清理 100 多张旧截图?一键释放空间。 | Clean Now | Clean 100+ Old Screenshots? Free up space with one tap. | Screenshots |
16-B |
16 | 开始清理 | 检测到新截图,立即查看。 | Start Cleaning | New screenshots detected. Review them now. | Screenshots |
17-A |
17 | 立即清理 | 有 {count} 条未读通知!立即整理通知栏。 |
Clean Now | {count} unread notifications! Manage your notification bar. |
Notification Cleaner |
17-B |
17 | 开始清理 | 通知太多?立即整理通知。 | Start Cleaning | Notification overload? Declutter notifications now. | Notification Cleaner |
17-C |
17 | 立即处理 | 有未读通知,立即管理通知栏。 | Handle Now | Unread notifications! Manage your notification bar. | Notification Cleaner |
18-A |
18 | 立即清理 | 仅剩 {free_space} 空间!立即检查。 |
Clean Now | Only {free_space} space left! Review it now. |
Smart Clean |
18-B |
18 | 开始清理 | 发现占用空间的大文件,立即处理。 | Start Cleaning | Large files are taking up storage. Handle them now. | Smart Clean |
18-C |
18 | 立即处理 | 大文件提醒! | Handle Now | Large File Alert! | Smart Clean |
09-C 和 16-A 沿用竞品固定数字式文案,不依赖本机扫描结果;这是本次明确采用的竞品文案方式。{count} 只读取现有 Notification Cleaner 本地未读数量,{free_space} 只读取 Android 本机可用存储值,均不得由中台生成。
本 PRD 只交付中文和英文源文案。开发翻译其他语言时不得改变模板 ID、场景和路由;翻译缺失时使用英文。
3.6 R4:中台唯一控制#
中台只新增一个字段:notification_audience_mode(通知下放范围)。
| 值 | 中台含义 | 客户端行为 |
|---|---|---|
OFF |
全部关闭 | 中台不发送 Topic 唤醒;客户端所有恢复入口检查到该值后不生成新通知 |
ORGANIC_ONLY |
只给自然量用户下放 | 只有按现有来源口径识别为自然量的客户端允许运行通知调度 |
PAID_ONLY |
只给推广用户下放 | 只有按现有来源口径识别为推广用户的客户端允许运行通知调度 |
控制边界:
- 没有“全部用户开启”这一状态。
- 中台不再配置通知方案、场景、文案、语言、上限、间隔、时段、路由、国家或比例。
- 用户来源沿用中台现有自然量/推广用户判断,不在本需求中新建归因规则;无法归类的用户不属于可下放对象。
- 客户端每次启动调度器前读取该唯一字段并结合本机用户来源判断;不匹配时直接结束本轮。
3.7 R5:FCM Topic 空消息与后台恢复#
3.7.1 Topic 联动#
| 环节 | 具体规则 |
|---|---|
| 客户端订阅 | 客户端按现有用户来源,只订阅“自然量 Topic”或“推广用户 Topic”中的一个;来源变化时退出旧 Topic、订阅新 Topic |
| 中台选择 | OFF 不发;ORGANIC_ONLY 只向自然量 Topic 发;PAID_ONLY 只向推广用户 Topic 发 |
| 消息内容 | 发送 data-only(只有数据、不由系统直接展示通知)的空值消息;仅保留 FCM 协议要求的空标识,不包含标题、正文、通知 ID、路由或用户数据 |
| 客户端收到 | 不直接显示远程通知,只进入进程/服务恢复入口,然后运行本地中台受众检查和竞品 B 调度器 |
| Token 边界 | Tidyvo 不向业务中台上传、绑定、保存或按用户查询 FCM Token;FCM SDK 为完成 Topic 订阅在 Firebase 内部使用设备注册令牌,不属于本需求的业务 Token 方案 |
| 失败边界 | 空消息只是唤醒尝试;App 被用户强制停止、系统限制后台或厂商省电策略拦截时,不能承诺一定拉活 |
3.7.2 Service / Job / WorkManager / Alarm#
| 能力 | 竞品已确认参数和作用 | Tidyvo 本次方案 |
|---|---|---|
| Foreground Service(前台服务) | START_STICKY,服务销毁或任务划掉后进入恢复链 |
作为常驻主入口;只启动统一调度器,不单独决定发哪条通知 |
| 快速 Job | minLatency=3999ms、deadline=5999ms |
前台服务启动失败后的 4—6 秒补拉入口 |
| WorkManager | 约 18 分钟 | 周期检查进程、服务和调度器;实际时间由 Android 决定 |
| 持久 Job | minLatency=1446000ms、deadline=1449999ms,Android 13+ priority 400 |
约 24 分钟心跳恢复入口 |
| Alarm | 延迟 28799365ms,约 8 小时 |
长周期恢复入口,使用非精确 Alarm |
| 开机/升级广播 | BOOT_COMPLETED、MY_PACKAGE_REPLACED |
开机或覆盖安装后重新安排 Service、Job、WorkManager 和 Alarm |
| FCM | 远程消息可进入恢复分支,服务端做法未确认 | 使用本 PRD 的 Topic 空数据消息进入同一恢复分支 |
这些入口是“让调度器有更多机会恢复”,不是各自发一条通知。无论多少入口同时到达,都必须通过同一把调度锁和全局 2 分钟频控,不能并发显示多条。
3.8 R6:Notification Cleaner 联动#
| 项目 | 规则 |
|---|---|
| 功能状态 | 复用线上已有 Notification Cleaner,不在本需求中重做页面、白名单或历史记录 |
| 两类权限 | POST_NOTIFICATIONS 是允许 Tidyvo 自己发通知;Notification access(通知使用权)是允许 Tidyvo 管理其他 App 通知,两者不是同一权限 |
| ID 17 | 进入 14 个周期 ID 列表,单日最多 2 次、同 ID 最短 15 分钟,点击进入现有 Notification Cleaner |
| 自身保护 | Tidyvo 自己发出的普通通知、前台服务通知不能被现有 Notification Cleaner 清掉 |
| 本地变量 | ID 17 的 {count} 只读取本机未读通知记录;不向中台上传其他 App 的通知标题、正文、发送者或验证码 |
| 权限缺失 | 没有 Notification access 时,不使用 {count} 模板;仍可随机使用 ID 17 的无变量模板,点击进入现有权限引导页 |
3.9 通知权限、点击与记录#
| 项目 | 规则 |
|---|---|
| 通知权限 | Android 13+ 未获得 POST_NOTIFICATIONS 时不展示通知;沿用 Tidyvo 现有按需申请入口,不在冷启动新增权限弹窗 |
| 点击路由 | 按本 PRD 固定路由进入现有页面;页面不可达时回退 Home |
| 一次点击 | 点击只打开一个目标页面,不串联打开多个场景 |
| 本地记录 | 至少保存通知 ID、模板 ID、展示时间、点击时间、当日次数、上次展示时间和循环游标 |
| 中台数据边界 | 可以上报 ID、模板 ID、展示、点击和来源类型;不得上传媒体名称、文件 URI、联系人、通知正文、FCM Token 或 Topic 成员明细 |
4. 验收标准#
| 序号 | 关联需求 | 验收标准 |
|---|---|---|
| 1 | R1 | 工程中只有竞品 B 一套通知参数,不存在第二策略、策略比例或远程覆盖频控。 |
| 2 | R1 | 本地日期不变时,普通通知成功展示达到 99 条后不再展示;手机当地日期进入下一日后重新计数。 |
| 3 | R1 | 任意两条普通通知至少间隔 2 分钟;一次调度最多显示 1 条。 |
| 4 | R1 | 同一普通 ID 两次成功展示至少间隔 15 分钟,且各 ID 日上限与第 3.4.1 节一致。 |
| 5 | R1 | 连续成功展示 12 条后进入 2 分钟冷却;测试结果不得解释为一次展示 12 条或额外等待 4 分钟。 |
| 6 | R1 | repetitions=3 只按约 4 秒刷新同一通知 ID,最多 3 次;通知栏不会因此新增 3 张卡,也不会重新随机文案。 |
| 7 | R1 | Android 15 及以下最多保留 5 条 Tidyvo 普通通知,Android 16 及以上最多 1 条;达到上限后移除最早一条并显示最新一条。 |
| 8 | R2 | 14 个周期 ID 按配置顺序循环检查,无数值优先级;ID 14、15、16 只由对应 Tidyvo 本地事件生成候选。 |
| 9 | R2 | 同时满足三个场景时只展示 1 条,其余场景至少等待后续 2 分钟调度。 |
| 10 | R3 | 同一 ID 的每条可用模板抽样概率接近等分;允许连续两次随机到同一模板,未实现权重和固定轮播。 |
| 11 | R3 | 中文系统可展示中文源文案,英文系统可展示英文源文案;其他语言由开发翻译,缺失时回退英文;不存在 12 语言中台配置。 |
| 12 | R3 | 变量缺失时不展示含未替换占位符的模板;09-C、16-A 按固定数字文案展示。 |
| 13 | R4 | 中台只有 OFF / ORGANIC_ONLY / PAID_ONLY 三态控制,没有“全量开启”,也没有通知规则、文案和频控配置页。 |
| 14 | R4 | 三种中台状态分别验证:全部不下放、仅自然量下放、仅推广用户下放;无法归类用户不收到。 |
| 15 | R5 | 中台和客户端日志、接口及数据库中均不存在业务 FCM Token 上传、绑定和成员列表;Topic 空消息不含通知内容、ID 或路由。 |
| 16 | R5 | Topic 空消息到达时不直接展示远程通知,只尝试恢复进程/服务并进入同一套本地调度器。 |
| 17 | R5 | Service、快速 Job、18 分钟 WorkManager、24 分钟持久 Job、8 小时 Alarm、开机/升级广播均可进入同一恢复入口;并发触发不会绕过 2 分钟频控。 |
| 18 | R5 | 强制停止或系统拦截时记录为“未唤醒/未验证”,不得宣称 FCM、Job 或 Alarm 可保证拉活。 |
| 19 | R6 | ID 17 正确进入现有 Notification Cleaner;Tidyvo 自身普通通知和前台服务通知不被通知清理功能移除。 |
| 20 | 全部 | 通知点击进入固定 Tidyvo 页面,异常路由回退 Home;请求和埋点不包含个人内容、其他 App 通知正文或真实 FCM Token。 |
| 21 | R7 | normal_ntf / ad_ntf / res_ntf / filter_ntf 分开计数;res_ntf 上限 2 条且最短 4 小时,ad_ntf 的 -1/-1 不被误改成普通通知 99 条/2 分钟。 |