Skip to content

Releases: fnthinklevi/noticeTransmit

v1.5.60

Choose a tag to compare

@fnthinklevi fnthinklevi released this 23 Aug 10:45

v1.5.60 - 2026-08-23

修复:推送历史偶发一直显示「推送中」 + 精确闹钟权限兼容

🐛 推送历史状态修复

  • 根因:送达结果链路依赖 MainActivity 存活(动态广播接收器 + 其持有的 MethodChannel)。滑掉最近任务或系统回收 Activity 后,推送完成的结果广播无人接收,记录永远停在「发送中」。
  • 修复:送达结果持久化队列(DeliveryResultStore)+ 启动 / 回前台时补偿拉取(drainDeliveryResults)。广播实时链路不变,Activity 销毁期间的结果由队列兜底,下次加载记录或回前台时一次性补齐,覆盖 Webhook / 邮件 / 短信 / 电话全部通道。

🐛 精确闹钟权限 Intent 兼容

  • Android 12~13 的 ACTION_REQUEST_SCHEDULE_EXACT_ALARM 去除可选的 data 参数(官方标记 Optional)。部分 ROM(尤其国产)Settings 组件不匹配带 data 的 Intent,导致授权弹窗无法打开;不带 data 时系统默认取调用者包名,并保留 Activity 未找到时的应用详情页兜底。

精确闹钟开关 + 国产 ROM 保活引导 + 邮件通道增强 + 安全与健壮性加固

精确闹钟开关(B1)

  • 新增可选「精确闹钟」开关(默认关闭,保持权限最小化):开启后延迟/定时推送在深度 Doze 下也可准点触发(setExactAndAllowWhileIdle)。
  • Android 12~13 开启时自动弹系统授权对话框;Android 14+ 跳应用详情页引导手动授权。
  • 未授权时自动降级为非精确闹钟,功能不中断,不阻塞使用。

🔋 国产 ROM 保活引导卡片(B2)

  • 权限设置页新增保活引导:省电无限制 / 自启动 / 任务锁定 / 通知使用权四步卡片,识别 MIUI/HyperOS/ColorOS/EMUI 等 ROM 一键跳转对应厂商省电设置页。

📱 锁屏验证码兜底(B3)

  • 锁屏脱敏正文(验证码显示 ******)检测后,转发文案替换为「验证码内容被锁屏隐藏,请解锁后查看」,不再向各通道发送无意义星号。

📧 邮件通道增强(D1)

  • 临时性失败(网络超时 / 连接失败 / SSL 握手 / 421 临时故障)自动重试 1 次(2 秒退避)。
  • 错误分类细化:认证失败 / 地址错误 / 被拒收等配置类问题直接提示,失败原因经历史记录内联显示(与测试邮件共用同一分类逻辑)。

⬇️ 检查更新 403 优化(A1)

  • 更新检查被 CDN(Cloudflare Bot Fight Mode)拦截时自动指数退避重试 1 次;仍失败则提示「被 CDN 拦截,请稍后重试」而非笼统网络错误。

🔒 安全与健壮性加固

  • 正则规则保护(E1):规则/关键词正则超过 200 字符直接拒绝,防止灾难性回溯阻塞监听服务。
  • 竞态与异常加固(E2):推送计数跨日重置同步化、通道配置 volatile 发布(copy-on-write)、协程未捕获异常兜底记录日志。
  • 证书固定框架就绪(C1):证书 pin 支持构建时注入(--dart-define=CERT_PINS),默认关闭,开启后 Release 版强制校验服务器证书。
  • 原生配置加密桥接(C2):Webhook secret 等原生端明文存储迁移至 EncryptedSharedPreferences,与 Flutter 端加密存储同源。

🧪 测试补充(E3)

  • 新增跨零点时间区间命中/未命中、超长正则拒绝、边界长度正则可用等 4 个用例,测试总数 123。

Full Changelog: 1.5.59...1.5.60

v1.5.59

Choose a tag to compare

@fnthinklevi fnthinklevi released this 23 Aug 06:43

v1.5.59 - 2026-08-23

漏通知修复 + 推送历史状态增强(暂停/失败原因/现在推送)

🐛 漏通知修复

  • 通知去重误判:去重键加入通知 tag 维度,同一应用用相同通知 ID + 不同 tag 发多条常驻通知不再被误判重复而漏读。
  • 记录 ID 冲突覆盖:历史记录 ID 改为全局唯一(包名+tag+通知ID),微信/QQ 等不同应用相同通知 ID 不再互相覆盖导致漏记录。
  • 会话类通知正文为空被跳过:微信/QQ/Telegram 等正文仅存在 MessagingStyle 中的通知,补充内容兜底链(大文本→正文→MessagingStyle 最后一条消息→多行文本→ticker→副标题),不再因正文为空整条漏读。
  • 监听断开无感知:通知使用权被系统回收后静默漏读,新增监听状态检测,断开时前台通知显示「监听已断开 · 可能漏读通知」警告。

📋 推送历史状态增强

  • 新增「用户暂停推送」状态:推送暂停期间收到的消息在历史记录中显示该状态(橙色),与"推送失败"明确区分。
  • 新增「现在推送」按钮:暂停期间未实际发送的消息,可在历史记录中一键手动补推(webhook + 邮件,绕过暂停开关)。
  • 推送失败原因内联显示:因网络或其他问题导致推送失败时,失败原因(如 HTTP 502 / 限流提示等)直接显示在记录中,无需长按查看。

Full Changelog: 1.5.58...1.5.59

v1.5.58

Choose a tag to compare

@fnthinklevi fnthinklevi released this 15 Aug 03:48

v1.5.58 - 2026-08-15

隐私政策全面重写 + 更新下载三源回退 + 界面国际化补全

🔒 隐私政策全面重写

  • 应用内隐私政策页扩展为 11 个章节:新增「信息共享与披露」「儿童隐私」「您的权利」「联系我们」等,全部按当前功能(规则引擎 / 定时延迟推送 / 电池监控 / 应用过滤 / 桌面小部件)实际数据收集情况撰写。
  • 明确数据收集边界:仅通知文本 / 应用包名 / 电池电量 / 自建规则,均仅在本地处理;明确 Bugly 崩溃统计最小采集(不收集设备隐私数据)。
  • 首次启动隐私弹窗文案同步更新,双语(中/英)一致;更新日期标注 2026年8月15日。

⬇️ 更新下载三源回退 + 失败诊断

  • 下载源调整为三个(按设备 ABI 自动匹配):CDN(cdn2.fnthink.top)→ GitHub 国内加速镜像(xget.fnthink.top)→ GitHub 官方直链(github.com),任一失败自动切换下一源,消除「概率 404」。
  • 下载失败时输出完整诊断日志:HTTP 状态码、content-type、content-length、重定向 location、server 头、系统下载器失败码(reason 可读文案)。

🌐 界面国际化补全 + iOS 主题风格统一

  • 规则管理页 / 规则编辑页 / 关键词过滤页全部文案接入中英文国际化(此前仅部分页面双语)。
  • 规则编辑页下拉菜单(优先级 / 条件类型 / 逻辑运算符 / 动作类型)改为 iOS 主题风格选择器,深色模式适配;排查并统一全库其他下拉菜单(历史页清除记录菜单同步改造)。

🐛 修复

  • 多条延迟推送只有第一条按时触发:延迟推送队列闹钟一次性,到点推完首条后未重排下一条,导致后续延迟通知要等新通知入队或服务重启才补推;修复为到点批量取到期项后自动重排剩余闹钟。
  • Doze 说明:定时/延迟推送在深度 Doze 下可能有分钟级延迟(维护窗口约 9~15 分钟一次投递)。

Full Changelog: 1.5.57...1.5.58

v1.5.57

Choose a tag to compare

@fnthinklevi fnthinklevi released this 14 Aug 13:10

v1.5.57 - 2026-08-14

桌面小部件全新升级 + 更新下载改系统下载器

🪟 桌面小部件全新升级

  • 2×2 样式重做:左上角标题「通知推送助手」+ 中央圆形状态(推送=绿色 / 暂停=红色)+ 底部「点击暂停/恢复推送」提示,文案跟随中英文语言切换。
  • 新增 4×2 横条规格:左上角标题 + 左半圆形状态 + 右半「当日已推送通知数量」(原生侧独立持久化,跨天自动重置),桌面小部件列表可分别添加两种规格。
  • 自适应尺寸:2×2 拉伸至 4×2 时布局自动切换(读取当前宽度,≥220dp 用宽布局),无需重新添加。
  • 一键添加:推送开关页新增「一键添加 2×2 / 4×2 小部件」按钮,Android 8.0+ 通过 requestPinAppWidget 弹出系统确认框直接添加到桌面,免去手动长按拖拽。
  • 品牌适配:两种规格独立注册 + 自适应尺寸 + requestPinAppWidget,覆盖小米/华为/OPPO/vivo/三星等主流 Launcher。

⬇️ 更新下载改系统下载器(DownloadManager)

  • 免存储权限:移除下载前的「所有文件访问」权限申请,下载到公共 Download/FnthinkNotice 目录,隐私声明更干净、上架风险更低。
  • 后台不中断:下载由系统进程执行,应用被杀/切后台不中断;通知栏自动显示下载进度(各品牌系统下载器接管,符合用户习惯)。
  • 应用内保留进度条(轮询系统进度同步显示);安装优先 open_filex 打开,本地路径不可用时回退系统安装器(content uri)。

🐛 修复

  • 规则优先级/条件下拉菜单深色模式适配:补充 dropdownColor / iconEnabledColor,深色主题下不再白底刺眼。
  • 更新检查 HTTP 403:根因是 Dart 默认 User-Agent 被 Cloudflare Bot Fight 拦截,改为浏览器风格 UA 后恢复正常。

优先级分级 + 定时/延迟推送 + 渠道类型英文翻译

🔔 通知优先级分级:原生通知链路接入规则引擎(RuleEngine),提取系统通知优先级(高/中/低),支持按「通知优先级」条件匹配规则;规则动作真正生效——静默忽略 / 仅记录 / 延迟推送 / 立即推送按命中规则执行(此前仅 UI 配置、原生未执行)。
定时/延迟推送:新增 DelayedPushManager(SharedPreferences 持久化队列 + AlarmManager 定时唤醒,进程被杀/重启自动恢复);规则编辑器为「延迟推送」动作新增参数配置(延迟秒数 / 定时时间 HH:mm),到点后自动补推 webhook 与邮件,历史记录先显示待送达、到点后更新为已送达。
🏷️ 渠道类型英文翻译:Webhook 设置页渠道类型名称、选择弹窗、签名提示、消息格式标签全部接入国际化,英文界面不再显示中文。
🖥️ 最近任务页语言同步修复:语言切换(含跟随系统弹窗)完整同步原生桌面应用名,App 中文界面时最近任务页正确显示「通知推送助手」而非旧英文名。

Full Changelog: 1.5.55...1.5.57

v1.5.55

Choose a tag to compare

@fnthinklevi fnthinklevi released this 14 Aug 10:43

v1.5.55 - 2026-08-14

Server酱 / PushPlus 渠道 + 桌面小部件一键启停推送

🔗 Server酱 / PushPlus 渠道:新增两个国内推送平台。Server酱走 POST form 提交(application/x-www-form-urlencoded,title/desp 放请求体,避免含验证码/短信正文的内容进入 URL 被代理或日志留存),PushPlus 从 URL query 提取 token 注入 body 后 POST JSON;host 精确匹配自动识别(sctapi.ftqq.com / www.pushplus.plus、pushplus.plus),与 Telegram/Bark 相同使用平台自身鉴权(SendKey/Token),无需签名密钥;响应按平台返回码判定成功(Server酱 code==0、PushPlus code==200)。
🪟 桌面小部件「推送开关」:桌面一键开启/暂停推送服务,复用 PushToggleManager 启停机制,点击整卡切换状态并同步刷新前台通知按钮;更多页新增引导入口,按国内外各品牌(小米/华为/OPPO/vivo/三星/原生等)提供手动添加路径说明。

服务端模块化拆分 + HTTP 契约测试 + Webhook 保存链路测试

🏗️ 服务端模块化拆分server.js 由 1249 行单文件按职责拆分为 lib/ 分层(store.js 存储持久化 / otp.js TOTP 封装 / middleware.js 中间件 / routes/auth.js+routes/version.js 路由 / app.js 组装),入口文件仅保留启动与优雅关闭;app 独立导出,测试可直接 require 发起真实 HTTP 请求。
🧪 服务端 HTTP 契约测试auth.test.js 由纯逻辑验证重写为真实 HTTP 请求测试(supertest 直连 app,25 个用例),覆盖安全头(CSP/nosniff/无 X-Powered-By)、会话(注销吊销/过期)、版本配置保存链路(POST 落盘 → GET 读回)、TOTP 全流程(setup/enable/OTP 与恢复码登录/恢复码一次性消费)、IP 封锁(第 5 次失败 403 + 公开接口豁免)。
🔗 Webhook 保存链路测试:Flutter 端新增 WebhookChannelStore 抽象层 + WebhookService 构造注入(默认仍走 SQLCipher 加密库),测试覆盖「UI 通道 → DB 行 → 原生同步」完整链路:setWebhookChannels 全量下发(含 url/secret/类型/启用状态)、setWebhookUrls 仅下发启用通道 URL、DB 行标准化与历史 "null" 脏数据过滤。
⚙️ Jest ESM 兼容:otplib 依赖链 @scure/base / @noble/hashes 为纯 ESM 包(Node ≥22 可运行、Jest 默认无法解析),新增 babel.config.js + transformIgnorePatterns 白名单,服务端测试可正常运行。

Full Changelog: 1.5.53...1.5.55

v1.5.53

Choose a tag to compare

@fnthinklevi fnthinklevi released this 14 Aug 07:50

v1.5.53 - 2026-08-12

短信/电话重复推送修复 + Telegram/Bark 渠道 + 更多页改版 + admin 登录修复

📱 短信/电话重复推送修复:同一短信/电话此前会被通知栏监听和广播接收器同时捕获,产生两条记录(一条有 SIM 卡信息、一条无)。现排除通知栏对短信/电话应用的监听,由 SmsReceiver / PhoneCallReceiver 独占处理,确保每条短信/电话只产生一条带 SIM 卡信息的记录。
📶 双卡 SIM 识别增强:SimInfoHelper 新增默认语音 SIM 回退策略(双卡场景下 PHONE_STATE 广播不携带 subscriptionId 时,用系统默认语音通话 SIM 推断)。
🔗 Telegram / Bark 渠道:新增 Telegram Bot 和 Bark 推送渠道,host 精确匹配自动识别(api.telegram.org / api.day.app),无需手动选择类型。
⚙️ Webhook 渠道类型插件化:Kotlin/Dart 两端 host 匹配规则统一为配置化列表(PLATFORM_RULES),新增平台只需追加一行;修复两端匹配规则不一致(Dart 端从 endsWith/contains 改为精确匹配)。
📋 更多页改版:推送通道(Webhook / 邮件)与过滤规则(应用筛选 / 关键词 / 规则引擎)拆分为两个独立分组,信息层次更清晰。
🔐 admin.html 登录修复:2FA 验证码输入后无响应问题修复;新增加载状态反馈、回车键支持、非 JSON 响应容错。
🛡️ 服务端持久化加固:writeJsonFile 改为原子写入(tmp + rename),防止崩溃产生截断文件;登录成功后立即持久化会话。
📢 飞书 markdown 降级提示:飞书 + markdown 格式组合时显示橙色提示条,告知用户将降级为纯文本发送。

Full Changelog: 1.5.52...1.5.53

v1.5.52

Choose a tag to compare

@fnthinklevi fnthinklevi released this 12 Aug 07:05

v1.5.52 - 2026-08-12

推送记录统计统一 + 逐条送达状态 + 短信/电话送达回传

📊 推送记录统计统一:首页/更多页/状态栏推送记录共用数据库同一数据源,状态栏当日计数与今日记录实时同步,三处统计不再各算各的。
逐条送达状态:首页推送记录逐条标注各通道送达状态(推送成功 / 推送失败 / 发送中),按企业微信/飞书/钉钉官方返回码判定,失败原因一目了然。
📶 短信/电话送达回传:短信/电话通道送达结果实时回传,送达状态即时生效。
🐛 修复:企业微信通道类型标签不一致导致送达状态无法更新。

Full Changelog: 1.5.51...1.5.52

v1.5.51

Choose a tag to compare

@fnthinklevi fnthinklevi released this 11 Aug 10:51

v1.5.51 - 2026-08-11

3 项修复:小米超级岛常驻 + Webhook 无法推送 + URL 类型识别

🏝️ 修复小米超级岛常驻:移除前台通知的 EXTRA_REQUEST_PROMOTED_ONGOING(Android 16 Live Update 实时更新提升)请求——该标志会让常驻通知在 HyperOS 上以「超级岛」常驻胶囊显示;前台通知改归类 CATEGORY_SERVICE,各品牌(小米/华为/荣耀/vivo/OPPO)灵动岛对服务类常驻通知默认不上岛,仅保留通知栏展示。
📮 修复 Webhook 始终无法推送setWebhookChannelsJSONObject(Map) 序列化时,未配置的 secret/message_template 的 null 值被转成字符串 "null",原生端误以为配置了签名密钥 → 错误签名被平台拒绝,导致"历史显示已推送但实际未送达"。修复:原生序列化跳过 null 字段 + ConfigManager 读取端将 "null" 视为未配置 + Dart 持久化层过滤历史脏数据。
🔍 Webhook 类型识别增强WebhookChannel.detectTypeFromUrl 改用 Dart Uri.parse 提取 host(更健壮,支持端口/凭据边界)+ 支持域名变体识别(weixin.qq.com / dingtalk.com / larksuite.com 等),修复 6 个 CI 单元测试断言失败。

Full Changelog: 1.5.50...1.5.51

v1.5.50

Choose a tag to compare

@fnthinklevi fnthinklevi released this 11 Aug 09:36

v1.5.50 - 2026-08-11

P2:推送模板引擎 + 一键暂停推送 + 平台类型精确识别

📝 推送模板引擎:新增 TemplateEngine.kt,支持 text/markdown/json/xml 四种消息格式,变量占位符(%appName% %title% %content% 等 14 个)自动替换;企微/钉钉/飞书按平台原生 msgtype 包裹 payload,通用 webhook 直接发送渲染后 body 并自动设置 Content-Type;JSON/XML 模板自动转义。每个通道独立配置格式与模板,数据库升级至 v6 新增 message_format / message_template 字段。
⏸️ 前台通知一键暂停/恢复推送:新增 PushToggleManager(三级状态机 RUNNING/PAUSED/STOPPED + SharedPreferences 持久化)与 PushToggleActionReceiver;前台通知显示「暂停推送」/「恢复推送」Action 按钮,点击切换状态后通过 ACTION_REFRESH_FOREGROUND 刷新通知文案与按钮;NetworkClient 发送前检查 isPushActive(),暂停期间监听继续、通知仍记录历史但跳过 webhook 发送。
🎯 Webhook 平台类型 host 精确匹配WebhookPayloadBuilder.detectTypeurl.contains() 子串匹配改为 extractHost() 提取小写 host 后精确相等比较(qyapi.weixin.qq.com / oapi.dingtalk.com / open.feishu.cn / open.larksuite.com),消除 weixin.qq.com 等误判;Dart 端 WebhookChannel.detectTypeFromUrl 同步对齐,与 DB channel_type 优先级配合。
🌐 前台通知国际化:前台服务通知文案(标题/监听状态/暂停状态/Action 按钮)接入 I18n 中英双语,英文模式下状态栏通知不再显示中文。

Full Changelog: 1.5.49...1.5.50

v1.5.49

Choose a tag to compare

@fnthinklevi fnthinklevi released this 29 Jul 03:10

v1.5.49 - 2026-07-29

双卡识别 + 多项修复 + 签名全方案 + 动态桌面名

📱 短信/电话双卡识别:新增 SimInfoHelper.kt,通过 SubscriptionManager 获取 SIM 卡槽位(卡1/卡2)和运营商名称;短信/电话推送时自动标注;Webhook 推送同步附加 SIM 信息。
🔐 APK 签名全方案build.gradle.kts 启用 V1 (JAR) + V2 (APK全文件) + V3 (密钥轮换) 三种签名方案,证书指纹不变。
🖥️ 动态桌面名:语言切换时自动更新桌面/最近任务应用名(中文=通知推送助手 / English=NoticeTransmit,工作量:34 个 activity-alias + MethodChannel + 集合函数)。
🐛 6 项修复:SMTP 通道测试通过但首页仍显示异常(测试结果持久化到 SharedPreferences);语言选择弹窗中英图标关联性强化(中文=毛笔、英文=拼写→中文=translate/文、英文=g_translate/En);推送历史 24:00 归档(WorkManager 0.6.0 + 前台兜底 + 幂等标志);锁屏消息不记历史(notificationReceiver 移到 onCreate() 注册);version.json 下载 URL 缺版本号目录;English key 导致 i18n.js 翻译污染。
🎨 体验优化:语言弹窗图标风格与其他一致(实色背景+白色图标)、选中项加粗+蓝色 check;弹窗统一圆角。
🏗️ 架构改进server.js 限流/会话内存状态文件持久化(rate_limit.json→sessions.json + 优雅关闭 SIGTERM);CI 版本一致性检查脚本 check_version_consistency.sh;README 修复 base.md 断链;清理热更新原生代码残留(4文件)+ hotfix_example/ 目录删除。

Full Changelog: 1.5.48...1.5.49