انجام وظایف و دریافت حجم رایگان
شخصیسازی تجربه شما
مشکل یا پیشنهاد خود را ارسال کنید
مدیریت حساب کاربری
ایمیل خود را برای بازیابی حساب وصل کنید
با وصل کردن ایمیل، هنگام تعویض گوشی میتوانید حساب و حجم خود را بازیابی کنید.
کد دعوت دوست خود را وارد کنید
دوستان خود را دعوت کنید و جایزه بگیرید
شما و دوستتان هر دو ۵۰۰ MB حجم رایگان دریافت میکنید
| 元素 | 说明 | 数据源 |
|---|---|---|
| 品牌 Logo | 盾牌图标,圆角方形,绿色渐变,100×100px | 静态 |
| App 名称 | "Sorena",36px 粗体白色 | 静态 |
| 品牌标语 | 多语言标语(安全快速的互联网) | 静态i18n |
| 加载动画 | 旋转圆环,品牌绿色,40×40px | 本地 |
| 触发 | 行为 | 时机 |
|---|---|---|
| 自动App 启动 | 展示 Splash 页 → 执行后台初始化 | 立即 |
| 自动初始化完成 | 生成/读取 UUID → 拉取节点列表 → 版本检查 → 进入主页 | 2.5s |
| 任务 | 说明 | 失败处理 |
|---|---|---|
| UUID 检查 | 首次安装自动生成并上报服务端注册 | 离线时延迟上报 |
| 节点列表更新 | 拉取最新订阅地址,更新本地缓存 | 使用本地缓存 |
| 版本检查 | 对比最新版本号,强制更新时阻断进入 | 跳过 |
| 任务状态同步 | 同步当日签到/视频/分享完成状态 | 默认未完成 |
| 元素 | 说明 | 数据源 |
|---|---|---|
| 连接按钮(未连接) | 130px 大圆形,绿色+脉冲动画,居中展示,下方为状态文案+节点选择器 | 本地VPN 引擎 |
| 紧凑控制栏(已连接) | 连接后大按钮收起,替换为一行:关闭(圆形) — 节点药丸(蓝绿描边胶囊,含节点名+国旗) — 重启(圆形),下方居中显示"已连接: HH:MM:SS" | 本地 |
| 关闭按钮 | 54px 圆形,红色调电源图标,点击断开 VPN 并恢复大按钮视图 | 本地 |
| 重启核心按钮 | 54px 圆形,橙色调刷新图标,点击重启 VPN 核心(不断开会话),图标旋转 ~1.6s | 本地VPN 引擎 |
| 节点药丸(中间) | 绿色渐变胶囊,圆形国旗 + 节点名 + 实时连接指示(呼吸绿点"已连接") + 箭头,点击切换节点 | 本地 |
| 节点选择器(未连接) | 圆角胶囊,圆形国旗 + 节点名 + 箭头,默认已预选节点(欧洲),非"选择节点"占位文案 | 本地 |
| 实时速率 | 下载/上传 (Mb/s) + 延迟 (ms),每 2s 刷新 | 本地VPN 引擎 |
| 速率曲线图 | 下载(绿)+上传(紫)双线实时曲线 | 本地 |
| Banner 广告位 | 速率曲线图与流量卡片之间,60px 高横幅,左上角"Ad"角标,承载 Google AdMob 320×50 Banner | AdMob SDK |
| 流量配额卡片 | 标题栏含刷新按钮(圆形,旋转图标)+获取流量按钮(绿色胶囊,FREE 角标);下方总流量(500MB)/剩余流量(180MB)+进度条 | 服务端 |
| 获取流量按钮 | 绿色渐变胶囊,文案"获取流量",右上角橙色"FREE"角标,点击跳转免费任务页 | 静态 |
| 刷新按钮 | 30px 圆形,刷新图标,点击重新拉取流量数据,加载时图标旋转 ~0.8s | 服务端 |
| 操作 | 行为 |
|---|---|
| 点击大连接按钮(未连接) | 进入"连接中"过渡态:按钮图标淡出 → 显示白色旋转圈 + 光晕呼吸动画 + 状态文案"正在连接..."(~1.2s) → 连接成功后大按钮淡出收起 → 紧凑控制栏缩放淡入 → 开始计时 → 开始速率监控 |
| 连接中 | 过渡期间按钮锁定(pointer-events:none),忽略重复点击,避免状态错乱 |
| 点击关闭按钮(已连接) | 进入"断开中"过渡态:状态显示"正在断开..." → 紧凑控制栏缩放淡出(~0.28s) → 清除速率数据 → 大按钮(脉冲)视图淡入 → 停止计时 |
| 点击重启核心按钮 | 保持连接 → 图标旋转 → 速率短暂重置 → ~1.6s 后恢复"已连接",状态文案显示"核心重启中..." |
| 点击节点选择器/中间节点信息 | 弹出节点底部弹窗(覆盖当前页面 70% 高度),已连接时切换节点即时更新控制栏 |
| 点击获取流量按钮 | 跳转到免费任务页(Tab 切换至"免费"),引导用户做任务赚流量 |
| 点击刷新按钮 | 图标旋转 → 重新请求服务端流量数据 → 更新总量/剩余/进度条(~0.8s) |
| 自动流量耗尽 | 强制断开 → 弹窗提示"流量已用完" → 引导去免费任务页获取 |
| 自动网络断线 | 网络恢复后自动重连 |
| 项 | 说明 |
|---|---|
| 位置 | 速率曲线图与流量卡片之间,常驻展示 |
| 广告平台 | Google AdMob,标准 Banner 尺寸 320×50 |
| 广告标识 | 左上角"Ad"角标,符合广告合规要求 |
| 加载失败 | 拉取失败时折叠隐藏,不占用布局空间 |
| 刷新策略 | 建议 30-60s 自动刷新一次(遵循 AdMob 政策,最短 30s) |
| 免广告 | 后续 Premium 用户可移除 Banner 广告 |
| 区域 | 节点 | 延迟范围 |
|---|---|---|
| 🇪🇺 欧洲 | 德国/法兰克福、荷兰/阿姆斯特丹、芬兰/赫尔辛基、罗马尼亚/布加勒斯特、瑞典/斯德哥尔摩 | 32-45ms |
| 🇹🇷 土耳其及邻国 | 土耳其/伊斯坦布尔、亚美尼亚/埃里温、格鲁吉亚/第比利斯 | 28-35ms |
| 🌏 亚洲 | 新加坡、印度/孟买 | 85-92ms |
| 字段 | 说明 |
|---|---|
| 国旗 Emoji | 视觉标识,28px |
| 国家名称 | 多语言,14px 粗体白色 |
| 城市名称 | 多语言,11px 灰色 |
| 延迟值 | 绿色数字 + "ms",右对齐 |
| 操作 | 行为 |
|---|---|
| 点击首页节点选择器 | 弹出底部弹窗(高度 70%),列表可滚动 |
| 点击节点卡片 | 卡片高亮(绿色边框)→ 200ms 后自动关闭弹窗 → 首页显示已选节点名 |
| 点击遮罩层 | 关闭弹窗,不改变选择 |
| 任务 | 图标 | 奖励 | 每日限制 | 交互流程 |
|---|---|---|---|---|
| 观看激励视频 | 🎬 | +50 MB/次 | 3 次 | 全屏视频广告(5s) → 奖励弹窗 |
| 每日签到 | 📅 | +30 MB | 1 次 | 点击 → 奖励弹窗 → 按钮灰化 |
| 分享应用 | 📤 | +20 MB | 1 次 | 分享界面(3s) → 奖励弹窗 → 按钮灰化 |
| 邀请好友 | 👥 | +500 MB/人 | 上限 30 次 | 跳转邀请 Tab |
| 阶段 | UI 表现 | 时长 |
|---|---|---|
| 1. 启动 | 全屏黑色覆盖 + AD 标识 + 倒计时(5s) + 旋转加载圆 | 0s |
| 2. 加载 | 文案"加载中..." + 进度条从 0% 开始走 | 0-1.5s |
| 3. 播放 | 文案变"播放中..." + 进度条持续推进 | 1.5-5s |
| 4. 完成 | 视频层消失 → 弹出奖励弹窗(🎉 +50MB) | 5s |
| 阶段 | UI 表现 | 时长 |
|---|---|---|
| 1. 拉起分享 | 全屏遮罩 + Telegram/WhatsApp/更多图标 + 旋转加载 + "正在打开分享..." | 0s |
| 2. 分享中 | 模拟用户跳转到外部 App | 0-1.5s |
| 3. 返回 | 文案变"分享成功!返回中..." | 1.5-3s |
| 4. 完成 | 分享层消失 → 弹出奖励弹窗(🎉 +20MB) | 3s |
| 元素 | 说明 |
|---|---|
| 图标 | 🎉 庆祝 Emoji,48px |
| 标题 | "恭喜获得奖励!"多语言 |
| 金额 | "+50 MB" 绿色粗体 32px |
| 描述 | "流量已添加到您的账户" |
| 按钮 | "确定" → 关闭弹窗 |
| 元素 | 说明 | 数据源 |
|---|---|---|
| 今日已获取 | 实时累计当日所有任务获得的流量总和 | 本地累加计算 |
| 设置项 | 类型 | 分组 | 说明 |
|---|---|---|---|
| 语言 | 选择器(底部Sheet) | 通用 | 波斯语/English/中文,切换即时生效,方向自动 RTL↔LTR |
| 账号 | 入口 → | 账户 | 显示绑定状态(邮箱/未绑定),跳转账号页(绑定/找回/退出) |
| 个人资料 | 入口 → | 账户 | 跳转个人资料子页(UUID、邮箱状态、邀请码只读展示) |
| 填写邀请码 | 入口 → | 账户 | 一级入口,跳转邀请码填写子页,输入好友邀请码双方各得 500MB |
| 反馈 | 入口 → | 账户 | 跳转反馈子页,提交问题/建议 |
| 版本号 | 入口 + 版本号 | 账户 | 显示当前版本 v1.0.0,点击即检查更新(检查更新功能合并到此项,无独立入口),逻辑见"更新"页 |
| 操作 | 行为 | 存储 |
|---|---|---|
| 点击语言 | 弹出底部 Sheet → 三选一 → 全局文案即时切换 | 本地SharedPreferences |
| 点击账号 | 跳转账号页(邮箱+验证码绑定/找回/退出登录) | 服务端 |
| 点击个人资料 | 跳转 Profile 子页 | — |
| 点击填写邀请码 | 跳转邀请码填写子页 → 输入 TRN-XXXXX → 校验提交后输入框灰化 | 服务端 |
| 点击反馈 | 跳转 Feedback 子页 | — |
| 点击版本号 | 请求服务端版本 → 有更新弹更新窗 / 无更新 Toast 提示 | — |
| 类型 | updateType | 可否关闭 | 行为 |
|---|---|---|---|
| 可选更新 | optional | 可关闭 | 弹窗显示「稍后」+「立即更新」,用户可关闭继续使用 |
| 强制更新 | force | 不可关闭 | 隐藏「稍后」,无遮罩关闭,点击遮罩/返回均无效,必须更新完成才能使用 |
| 无更新 | none | — | 启动时静默;手动检查时提示「已是最新版本」 |
| 元素 | 说明 | 数据源 |
|---|---|---|
| 更新图标 | 圆角方形下载图标,绿色渐变,64×64px | 静态 |
| 类型标签 | 「可选更新」蓝色 / 「强制更新」红色 | 服务端 |
| 标题 | 可选:「发现新版本」/ 强制:「需要更新」 | 静态i18n |
| 版本号 | 当前版本 → 最新版本 (v1.0.0 → v1.2.0) | 服务端 |
| 更新内容 | 更新说明列表(多语言),可滚动,最大高 160px | 服务端 |
| 安装包大小 | 显示 APK 体积 (12.4 MB) | 服务端 |
| 下载进度条 | 点击更新后显示,0-100% + 百分比文案 | 本地 |
| 操作按钮 | 「立即更新」主按钮 + 「稍后」次按钮(仅可选) | 静态 |
| 触发 | 行为 | 时机 |
|---|---|---|
| 自动Splash 初始化 | 请求服务端版本信息接口 | 启动 ~0.4s |
| 自动进入主页后 | 若 optional/force → 弹出更新弹窗;none → 不弹 | Splash 结束 2.5s 后 |
| 自动请求失败(离线) | 跳过检查,使用本地版本正常进入 | — |
| 操作 | 行为 |
|---|---|
| 点击版本号项 | 检查更新已合并到设置页"版本号"项;点击 → 版本号变「...」→ 请求服务端 |
| 有更新 | 弹出更新弹窗(逻辑与启动一致,按类型区分可选/强制) |
| 无更新 | 底部 Toast 提示「已是最新版本」,2.2s 后消失 |
| 操作 | 行为 |
|---|---|
| 点击立即更新 | 隐藏按钮 → 显示下载进度条 → 进度到 100% → 「安装中...」→ 关闭弹窗 → Toast「更新成功」→ 版本号刷新 |
| 点击稍后(仅可选) | 关闭弹窗,正常使用 App |
| 点击遮罩(强制更新) | 无响应,弹窗不可关闭 |
| 点击遮罩(可选更新) | 保留弹窗(也可配置为关闭),引导用户决策 |
| 字段 | 类型 | 说明 |
|---|---|---|
| updateType | string | force / optional / none |
| latestVersion | string | 最新版本号 (v1.2.0) |
| apkSize | string | 安装包大小 (12.4 MB) |
| downloadUrl | string | APK / 商店下载地址 |
| minSupportedVersion | string | 低于此版本强制更新 |
| notes | object | 多语言更新说明 {fa, en, zh} |
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| 问题类型 | 下拉选择 | 是 | 连接/速度/错误/建议/其他 |
| 问题描述 | 多行文本 | 是 | 最多 500 字 |
| 截图 | 图片上传 | 否 | 最多 3 张,单张 ≤5MB |
| 操作 | 行为 |
|---|---|
| 点击提交按钮 | 校验必填项 → 提交 → 按钮变"已提交 ✓"(2s) → 恢复 |
| 点击上传图片 | 唤起系统图片选择器 → 显示"已选择 1 个文件" |
| 自动附带信息 | 设备型号、OS版本、App版本、UUID、网络类型、当前节点 |
| 区块 | 元素 | 说明 | 数据源 |
|---|---|---|---|
| 账户信息卡片 | UUID | 设备唯一标识(匿名账号),自动生成,不可修改 | 本地 |
| 邮箱状态 | 未绑定(红色标签)/ 已绑定(绿色✓) | 服务端 | |
| 邀请码 | 用户唯一码 TRN-XXXXX(只读展示) | 服务端 | |
| 账号入口 | 「邮箱与账号找回」入口 → | 跳转账号页(绑定/找回/退出) | 点击 |
| 概念 | 角色 | 说明 |
|---|---|---|
| UUID | 匿名账号本身 | 安装即生成,零注册可用,全部功能开放 |
| 邮箱 | 账号钥匙(找回锚点) | 绑定后可在新设备找回;不是账号本身 |
| 云端账号 | 数据载体 | 按账号存流量/邀请/绑定状态/当前活跃设备;一个邮箱对应一个云端账号 |
| 项 | 说明 |
|---|---|
| 用户视角 | 永远只做"输入邮箱 → 收验证码 → 填验证码",无需理解绑定/登录/找回的区别 |
| 服务端判定 | 邮箱未注册 → 绑定到当前匿名账号;邮箱已注册 → 切换到老账号(找回/登录) |
| 验证方式 | 邮箱 6 位数字验证码(OTP),无密码 |
| 状态 | 元素 | 说明 |
|---|---|---|
| 未绑定·邮箱步 | 说明卡片 | "绑定邮箱后换机可找回账号和流量" |
| 邮箱输入 + 发送验证码 | 校验邮箱格式,点击发送进入验证码步 | |
| 未绑定·验证码步 | 验证码输入框 | 6 位数字,大字间距居中 |
| 重发倒计时 | "重新发送(60s)",倒计时结束才可点 | |
| 更换邮箱 | 返回上一步重填邮箱 | |
| 已绑定 | 账号卡片 | 绿色✓ + 邮箱地址 + "退出登录"按钮 |
| 保护说明 | 说明单设备登录规则 |
| 流程 | 步骤 |
|---|---|
| A 首次使用 | 安装 → 生成 UUID → 直接可用,不弹任何登录/注册 |
| B 绑定邮箱 | 设置/资料→账号 → 输入邮箱 → 发码 → 填码 → 绑定成功,状态变"已绑定/可找回" |
| C 新机找回 | 新机(临时匿名账号) → 账号页 → 输入已注册邮箱 → 验证码 → 拉取老账号数据 → 临时账号丢弃 |
| D 老设备被踢 | 新机登录后,老设备下次活动时收到"已在他处登录" → 弹窗提示 → 退回匿名账号 |
| 项 | 规则 |
|---|---|
| 位数 / 有效期 | 6 位数字 / 10 分钟 |
| 发送频率 | 60s 内仅一次,按钮倒计时 |
| 错误处理 | 验证码错误:输入框抖动报错;过期:提示重新发送 |
| 防滥用 | 同邮箱/同 IP 每日发送次数上限(服务端) |
| 场景 | 处理 |
|---|---|
| 单设备规则 | 一个账号同一时刻仅一台设备活跃;新设备登录成功 → 老设备下次活动被踢下线 |
| 踢下线时机 | 被动发现(下次打开/连接时),无需长连接推送 |
| 被踢后状态 | 温和弹窗"账号已在新设备登录" → 退回新的匿名账号,App 仍可用 |
| 绑定时邮箱已被占用 | 不报错,自动转找回:"该邮箱已有账号,正在为你恢复" → 走流程 C |
| 新机登录时本地已有流量 | 以老账号为准,本地临时数据丢弃 |
| 主动退出登录 | 退回新的匿名账号,App 继续可用,不停在空白页 |
| 绑定前换机/卸载 | 数据不可恢复(匿名固有代价),靠"攒流量后引导绑定"降低发生率 |
| 元素 | 说明 | 数据源 |
|---|---|---|
| 邀请码输入框 | placeholder: TRN-XXXXX,LTR 方向,供被邀请人填写 | — |
| 提交按钮 | 半透明绿色按钮,提交成功后灰化不可再次修改 | — |
| 奖励提示 | "填写好友邀请码,双方各得 500MB 免费流量" | 静态 |
| 操作 | 行为 | 后续影响 |
|---|---|---|
| 点击设置→填写邀请码 | 跳转本子页 | — |
| 点击提交邀请码 | 校验格式 TRN-XXXXX → 提交 → 输入框+按钮灰化禁用 | 双方各获得 500MB(需双方均绑定邮箱) |
| 输入格式错误 | 输入框边框变红 1.5s → 恢复 | — |
| 元素 | 说明 | 数据源 |
|---|---|---|
| ⚠️ 未绑定警告横幅 | 黄色背景,提示需绑定邮箱才能获得奖励,含跳转链接 | 本地emailBound 状态 |
| 🎁 奖励说明卡片 | "每邀请1人=500MB",双方各得 | 静态 |
| 📋 邀请规则卡片 | 三条编号规则(邀请人绑邮箱、被邀请人填码、被邀请人绑邮箱) | 静态 |
| 邀请码展示 | TRN-XXXXX 大字 + 复制按钮 | 本地 |
| 分享按钮组 | Telegram / WhatsApp / 复制链接(三列等宽) | 本地 |
| 邀请统计 | 成功邀请数 + 已获流量(双卡片) | 本地 |
| 规则 | 说明 |
|---|---|
| 邀请人条件 | 必须已绑定邮箱,否则显示警告横幅 |
| 被邀请人条件 | 必须填写邀请码 且 绑定邮箱,两者缺一不可 |
| "成功邀请"定义 | 被邀请人同时满足:① 填写了邀请码 ② 绑定了邮箱 |
| 奖励发放 | 条件满足后,双方各获得 +500MB |
| 累计上限 | 单用户最多 15GB(30 次成功邀请) |
| 防作弊 | 同设备指纹不重复;同 IP 24h 限 3 次注册;邮箱需真实可接收验证 |
| 操作 | 行为 |
|---|---|
| 点击复制按钮 | 复制邀请码到剪贴板 → 按钮文案变"✓" → 1.5s 恢复 |
| 点击Telegram | 唤起 Telegram 分享(预填文案:Sorena VPN 邀请链接+邀请码) |
| 点击WhatsApp | 唤起 WhatsApp 分享(同上) |
| 点击复制链接 | 复制 https://sorena.link/invite/TRN-XXXXX → "✓" |
| 点击警告横幅链接 | 跳转到个人资料页绑定邮箱 |
| 参数 | 类型 | 说明 |
|---|---|---|
| uuid | string | 设备唯一标识 |
| app_version | string | App 版本号 (v1.0.0) |
| os | string | 操作系统 (Android/iOS) |
| os_version | string | 系统版本号 |
| device_model | string | 设备型号 (Samsung SM-G991B) |
| channel | string | 渠道来源 (official/telegram/invite) |
| region | string | 用户地区 (IR/TR/DE),根据 IP 或 SIM 卡判断 |
| language | string | App 当前语言 (fa/en/zh) |
| network_type | string | 网络类型 (wifi/4g/5g) |
| timestamp | int64 | 事件时间戳 (ms) |
| 事件名 | 触发时机 | 附加参数 |
|---|---|---|
| app_launch | App 冷启动完成 | is_first_launch(bool) |
| app_init_complete | Splash 初始化完成进入主页 | duration_ms(int) |
| app_enter_foreground | 从后台切回前台 | — |
| app_enter_background | 切到后台 | connection_status(connected/disconnected) |
| 事件名 | 触发时机 | 附加参数 |
|---|---|---|
| vpn_connect_tap | 点击连接按钮 | selected_node(string), is_auto_select(bool) |
| vpn_connect_success | VPN 隧道建立成功 | node_id, node_country, connect_duration_ms |
| vpn_connect_fail | 连接失败 | node_id, error_code, error_msg |
| vpn_disconnect_tap | 手动点击断开 | session_duration_sec, traffic_used_bytes |
| vpn_disconnect_auto | 被动断开 | reason(quota_exhausted/network_lost), session_duration_sec |
| vpn_reconnect | 断线后自动重连成功 | node_id, reconnect_count |
| 事件名 | 触发时机 | 附加参数 |
|---|---|---|
| task_page_view | 进入免费流量页 | — |
| task_video_start | 点击观看激励视频 | video_count_today(int) |
| task_video_complete | 视频播放完成,发放奖励 | reward_mb(int), video_count_today |
| task_checkin_tap | 点击签到完成 | reward_mb(int) |
| task_share_tap | 点击分享按钮 | platform(telegram/whatsapp/copy) |
| task_share_complete | 分享完成返回,发放奖励 | reward_mb(int) |
| task_invite_entry_tap | 点击邀请好友入口 | — |
| 事件名 | 触发时机 | 附加参数 |
|---|---|---|
| invite_page_view | 进入邀请页 | email_bound(bool) |
| invite_share_tap | 点击分享按钮(Telegram/WhatsApp/复制) | channel(telegram/whatsapp/copy) |
| invite_code_submit | 被邀请人提交邀请码 | code(string), success(bool) |
| 事件名 | 触发时机 | 附加参数 |
|---|---|---|
| profile_page_view | 进入个人资料页 | email_bound(bool) |
| account_page_view | 进入账号页 | email_bound(bool) |
| email_send_code | 点击发送验证码 | email_domain, is_resend(bool) |
| email_verify_success | 验证码校验通过 | action(bind/recover) |
| email_verify_fail | 验证码校验失败 | reason(invalid/expired) |
| account_bind_success | 新邮箱绑定成功 | — |
| account_recover_success | 已有邮箱找回老账号成功 | — |
| account_login_other_device | 本设备被新设备登录踢下线 | — |
| account_logout | 用户主动退出登录 | — |
| 事件名 | 触发时机 | 附加参数 |
|---|---|---|
| quota_warning | 剩余流量低于 20% | remaining_mb, total_mb |
| quota_exhausted | 流量用完,VPN 被断开 | total_used_mb |
| quota_refresh_tap | 点击流量刷新按钮 | remaining_mb, total_mb |
| get_traffic_tap | 点击"获取流量"按钮跳转免费页 | source(home_quota) |
| 事件名 | 触发时机 | 附加参数 |
|---|---|---|
| ad_banner_impression | 主页 Banner 广告成功展示 | ad_unit_id, ad_format(banner) |
| ad_banner_click | 点击 Banner 广告 | ad_unit_id |
| ad_banner_fail | Banner 广告加载失败 | error_code |
| ad_rewarded_impression | 激励视频广告展示(任务墙) | ad_unit_id, ad_format(rewarded) |
| 策略 | 说明 |
|---|---|
| 上报方式 | 实时上报,失败时本地缓存,下次启动重发 |
| 批量合并 | 5s 内的事件合并为一次请求 |
| 离线缓存 | 无网络时本地存储,上限 1000 条,FIFO 淘汰 |