2026/9/20 21:41:27

Tinycast 更新提示抑制机制全解析:UpdateReadiness 如何不打断你,30 分钟内自动重新提供更新

Tinycast 更新提示抑制机制全解析:UpdateReadiness 如何不打断你,30 分钟内自动重新提供更新 Tinycast 更新提示抑制机制全解析UpdateReadiness 如何不打断你30 分钟内自动重新提供更新【免费下载链接】tinycastTinycast — a tiny, fully native macOS launcher, hotkeys, and clipboard history.项目地址: https://gitcode.com/GitHub_Trending/ti/tinycastTinycast 是一款轻量级、纯原生的 macOS 启动器launcher内置热键管理与无限剪贴板历史功能。当有新版本可用时它的更新提示不会生硬地弹到你脸上如果你正在展开片段、运行扩展或打开着启动器UpdateReadiness会自动抑制弹窗并在此后30 分钟内每 2 分钟重新尝试提醒一次直到你处理它为止。这就是本文要讲透的更新提示抑制机制。为什么自动更新弹窗总在最差时机出现大多数应用的更新提示逻辑很简单检查到新版本 → 弹窗。但 Tinycast 是一个高频唤起、常驻内存的启动器它的使用场景决定了检查到就弹几乎必然在错误时刻打扰你你刚展开一个 Snippet文本正要注入到其他应用里你正在录一个快捷键组合你正打开着 Palette启动器主窗口输入查询某个扩展命令还在跑卸载流程还没走完……在这些时刻切换应用进程轻则打断输入重则丢失工作。所以 Tinycast 的设计目标是自动提示永远让位于用户正在进行的事但被压下的提示不算已送达稍后必须重新提供。7 种忙碌场景UpdateReadiness 如何判断现在不能弹窗核心判断集中在 UpdateReadiness.swift。它接收一个UpdateActivity快照7 个布尔标志全部由外部注入判断本身是纯函数按后果严重程度排序逐一检查命中任意一项就返回对应的Blocker优先级忙碌场景拦截时给出的提示语1正在展开片段Snippet 注入中Waiting for a snippet to finish expanding.2扩展命令正在运行Waiting for a running extension command to finish.3卸载程序正在清理Waiting for the uninstaller to finish.4正在录制快捷键Finish recording the shortcut first.5正在等待命令参数输入Finish the open command prompt first.6有对话框打开Close the open dialog first.7启动器窗口Palette可见Close Tinycasts window first.排序逻辑很克制中断了会丢工作的排在前面中断了只是关个面板的排在后面。比如片段注入被打断可能弄脏别处应用的文本而 Palette 开着被替换只是少了一个面板所以优先级最低。这 7 个标志分别由 AppCore.swift 中的currentActivity属性实时组装——它读取文本注入器、扩展运行器、卸载器、热键录制器、参数会话、对话框与 Palette 协调器的当前状态。同一条判断还被canInterruptUser复用连支持提醒弹窗也都先问它一句保证全应用只有一处能不能打扰用户的标准。被抑制的提示不会消失2 分钟一次最长 30 分钟重新提供抑制只是暂缓不是取消。关键在于 UpdateCheckStore.swift 里两个常量withheldInterval 120秒被压下的提示每隔 2 分钟重新尝试一次withheldRetryLimit 15次最多重试 15 次即15 × 2 分钟 30 分钟之后交还给每日一次的常规检查节奏。工作机制是这样的后台的泵循环定期轮询发现新版本后调用onUpdateAvailable回调UpdateCoordinator.swift 的presentIfAvailable先调用UpdateReadiness.evaluate如果当前有阻塞场景就返回false且什么都不弹返回false的语义是提示被压下、欠你一次该版本因此不会被标记为已提醒announcedVersion保持为空泵循环看到提示未送达就把下一轮等待时间压缩到 2 分钟稍后再次尝试循环往复最多 30 分钟。这正是手动启动 Tinycast 的场景所依赖的开机自启时桌面空闲30 秒后第一次检查就能顺利弹窗而如果你是手动启动并立刻打开 Palette那每天唯一一次的提醒就不能浪费在被压下的窗口里——2 分钟后的重试会接住它。为什么不会变成弹窗轰炸三道防打扰闸门自动重新提供听起来有纠缠的风险Tinycast 用三道闸门保证它始终克制第一道同一版本每次启动只提醒一次。announcedVersion在提示真正落地的那一瞬间就被写入之后的重试不会重复弹同一个版本详见 updates.md 的 Invariants 一节。第二道点安装那一刻会重新问一遍就绪状态。就算窗口开着你在 3 秒前打开了 PaletteUpdateCoordinator.swift 的install()也会在点击瞬间重新执行evaluate未就绪就进入blocked状态而不是带着过期标志强行安装。第三道跳过即永久安静对该版本。点跳过会写入skippedVersion这个版本不再打扰你但更新的版本仍会来提醒——静默不是全局免打扰只是针对这一个版本号。此外手动执行检查更新checkForUpdates永远直接联网询问并打开窗口不受任何抑制约束用户主动要的结果就没有再等等。整套行为有 updates-test.swift 的测试用例覆盖可查证的文档在 docs/features/updates.md。小结机制要点实现位置7 种忙碌场景的就绪判断UpdateReadiness.swift2 分钟 × 15 次的重提供节奏UpdateCheckStore.swift压下即返回 false、欠下一次UpdateCoordinator.swift活动快照组装与复用AppCore.swift一句话总结这套机制能弹则弹不能弹就记着欠你2 分钟后重来最多 30 分钟同一版本绝不纠缠。它没有一行多余的设置项也完全不污染AppSettings——一个更新检查器该有的一切都在 Updates 模块 自己的缓存文件里安安静静工作着。【免费下载链接】tinycastTinycast — a tiny, fully native macOS launcher, hotkeys, and clipboard history.项目地址: https://gitcode.com/GitHub_Trending/ti/tinycast创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考