ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Tinycast AppIndex 深潜:它如何后台扫描应用库、去重 Bundle ID 并增量发布结果

Tinycast AppIndex 深潜:它如何后台扫描应用库、去重 Bundle ID 并增量发布结果 Tinycast AppIndex 深潜它如何后台扫描应用库、去重 Bundle ID 并增量发布结果【免费下载链接】tinycastTinycast — a tiny, fully native macOS launcher, hotkeys, and clipboard history.项目地址: https://gitcode.com/GitHub_Trending/ti/tinycastTinycast是一款小巧、完全原生的 macOS 启动器launcher内置全局快捷键与剪贴板历史记录。它的搜索框之所以能秒开任意应用靠的是 AppIndex.swift 背后的一套应用索引机制后台扫描应用库app index、按 Bundle ID 去重deduplication、以及只在真正变化时才发布incremental publish的增量更新策略。本文面向新手用尽量少的代码带你读懂这三件事。什么是 AppIndex一个统一的应用索引打开 Tinycast 的搜索框你能搜到的不只是应用——还有系统设置面板、命令、快捷方式、自定义命令、代码片段等等。这些条目在代码里被统一建模为AppEntry而所有条目的总管家就是AppIndex这个类AppIndex.swift。AppIndex只做三件事扫描scan——把磁盘上的.app收集成候选列表组装assemble——把应用、命令、快捷方式等十几个切片slice按固定顺序拼成完整列表发布publish——只有内容真正变化时才通知界面刷新。对新手来说可以把它理解为一个自动维护的搜索数据库装了新 App 它认得卸了旧 App 它删得掉中途没变化它就安静不打扰。第一步扫描哪些文件夹——Search Scopes 搜索作用域索引从哪里找应用答案在 SearchScopes.swift。默认作用域覆盖了/Applications和/Applications/Utilities用户装的应用/System/Applications及其 Utilities系统自带应用/System/Library/CoreServices/Applications屏幕录制等工具/System/Volumes/Preboot/Cryptexes/App/System/ApplicationsSafari 的真正所在地——/Applications里的那个只是一个隐藏软链接~/Applications用户主目录下的应用以及单独的Finder.app这里有几个对新手很有用的细节只往下找一层子文件夹像/Applications/Blackmagic Design/DaVinci Resolve.app这种厂商文件夹能被抓到但更深的目录需要你手动添加作用域保证扫描有界、不失控。会钻进 App 内部的隐藏应用Xcode 会在Contents/Applications里附带 Instruments、模拟器等工具扫描时会把这些一并收录。作用域可以自己改在设置 → 应用 → 搜索作用域里增删路径保存后会立即重新索引不用重启应用。第二步Bundle ID 去重重复副本不丢名字同一个 App 在系统里可能存在多份副本不同磁盘位置、系统自带加用户安装如果全部收录搜索时就会看到重复行。AppIndex.scan用一张indexByBundleID字典解决这件事AppIndex.swift按作用域顺序遍历每个.app读出它的 Bundle ID例如com.apple.Safari第一个遇到的作用域胜出该副本成为正式条目后面再遇到相同 Bundle ID 的副本时不新建条目而是把它的文件名借给胜者作为强别名strong name加入搜索词。第 3 步的巧妙之处在于你在 Finder 里把Slack.app重命名成Work Chat.app放到别的位置旧名字和新名字就都能搜到而不是丢掉整份副本。名字的学问本地化显示名 Spotlight 别名扫描时每个应用会被赋予多个可搜索的名字显示名优先读本地化名称InfoPlist.loctable和*.lproj/InfoPlist.strings保证中文系统上计算器而不是Calculator文件名作为强别名加入code依然能搜到 Visual Studio CodeSpotlight 别名读取 macOS 自己记录的替代名iCal能搜到日历、浏览器能搜到 Safari拼音/罗马音中文、日文、韩文、西里尔文应用名会被逐文字体系地转写微信→weixin非拉丁文字应用也能搜。这些细节都记录在官方文档 docs/features/launcher.md 中。第三步增量发布没变化就不打扰 UI这是 AppIndex 最值得学习的工程手法。索引由两部分组成动态切片快捷链接、片段、会议、扩展命令等由各自的 Store 在数据变化时推送过来每个 setter如setQuicklinks、updateSnippets都会先比较新旧数组一样就直接返回扫描切片应用列表来自磁盘扫描比较found ! discoveredEntries没变化同样跳过。只有确认真的变化时才会调用publishEntries()重新拼出完整列表并提升entriesRevision版本号AppIndex.swift。版本号会失效搜索结果缓存——这意味着搜索排序是一次索引变化构建一次而非每次击键构建一次打字飞快也不会卡顿。刷新时机何时重新扫描扫描不是一直跑着的后台进程而是在几个精确时机触发触发时机说明启动器面板每次打开PaletteCoordinator.swift 里注释写得很直白让上次扫描后卸载的应用从启动器里消失修改搜索作用域编辑保存即触发见 AppCore.swift应用卸载流程结束后卸载功能主动调用appIndex.refresh()而且扫描是防重入的如果一次扫描还没结束又来了新的刷新请求只会置位refreshPending标记扫完后合并成一次收尾扫描——多次重开面板不会叠加成多次重复劳动。扫描全程跑在后台Task.detached(priority: .utility)把重活枚举目录、读 Spotlight、转写拼音挪出主线程主线程只做最后的组装面板打开瞬间就能出结果。缓存的艺术BundleNameCache 让重复扫描变便宜每次打开都重扫听起来很浪费但AppIndex配了三层缓存兜底BundleNameCache.swift名字缓存Spotlight 查询约 0.8ms、本地化表读取约 0.2ms按应用路径 修改时间缓存应用的修改时间没变就直接命中缓存。卸载的应用自动从缓存里掉出去不会越攒越多系统设置面板缓存设置面板.appex只在系统扩展目录的修改时间或语言变化时重扫SettingsPaneScanner.swift搜索排序缓存同一查询 同一索引版本结果直接复用matchMemo/resultsMemo。这套增量哲学贯穿始终能比对的先比对比对一致就什么都不做。小结从磁盘到搜索结果的完整流水线把整条链路串起来就是面板打开 →refresh()触发防重入可合并后台线程按 Search Scopes 枚举.app含一层子文件夹与内嵌应用按 Bundle ID 去重重复副本出借文件名做别名读本地化名、Spotlight 别名、拼音转写构建全部可搜索名字每索引变化一次不按击键构建与各功能切片命令、快捷链接、片段……拼合新旧比对一致即跳过真正变化才发布版本号递增搜索缓存自动失效。想继续深挖推荐阅读 docs/features/launcher.md 中关于模糊匹配评分表与别名角色的章节以及 docs/architecture.md 了解整体架构。对想贡献代码的新手AGENTS.md 与 CONTRIBUTING.md 是入手的第一站。【免费下载链接】tinycastTinycast — a tiny, fully native macOS launcher, hotkeys, and clipboard history.项目地址: https://gitcode.com/GitHub_Trending/ti/tinycast创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表