工作原理

每个版本号从哪里来,以及安装方式为什么因应用而异。

← 全部文档

DuoUpdater 会扫描 /Applications、/Applications/Utilities 和 ~/Applications,然后按优先级顺序,把找到的应用与多个更新源逐一核对。第一个认出该应用的源负责回答;其余的源不会再被查询。

  1. Mac App Store — Apple 的 iTunes 查询 API,能识别商店地区。只信任原生的 mac-software 结果;运行在 Mac 上的 iOS 应用会被跳过,因为它们的版本号是独立变化的,否则会被当成永远无法安装的更新显示出来。
  2. Xcode Releases — 那些不是来自 App Store 的 Xcode 版本:每一个测试版和候选发布版,都会与你实际安装的渠道相匹配。通过商店安装的 Xcode 已经由上一条回答了。
  3. Homebrew Cask — 按 .app 文件名匹配,匹配不到时回退到 bundle id,因此那些安装的是 pkg 而不是应用包的 cask 也能被找到。它只负责回答由 Homebrew 安装并保持更新的应用(标记为 auto_updates 的 cask 除外),所以更新之后 Homebrew 自己的记录仍是最新的,brew upgrade 不会再把同一个版本重新装一遍。
  4. Sparkle — 应用自己的 SUFeedURL appcast,与应用内置更新程序读取的是同一份源。
  5. GitHub Releases — 针对以这种方式分发的应用,按渠道匹配。默认只做检测,除非有针对该应用的专门规则指定并核实了一个可安装的 Mac 资源文件。
  6. Alcove — 它需要身份验证的更新接口,只有在你输入了许可证之后才会使用。没有许可证时,这个源完全不存在,Alcove 会转而使用下面的公开厂商探测。
  7. 厂商探测 — 针对厂商自己接口手写的规则,用于那些既不发布订阅源、也没有商店页面的应用。

有两类应用完全跳过这份清单

由 JetBrains Toolbox 管理的应用,以及从 TestFlight 安装的应用,会在查询上面七个源之前就得到答案。Toolbox 和 TestFlight 各自拥有这些应用的更新权,再去征求第二意见没有意义,所以根本不会为它们去查这份清单。

它按每个应用自己期望的方式更新它

大多数更新工具只选一种机制,然后让所有应用都走这一条路。这一款用的是应用自带的机制,这也是为什么按钮在不同的行上做的事情不一样:

渠道 按下“更新”后会发生什么
Sparkle 下载、执行下面的检查、替换应用包⁠——然后退出并重新打开应用,除非你已经关闭了这个选项
Mac App Store 通过商店完整下载。如果无法这样做⁠——后台助理未获批准,或应用被锁定在另一个区域⁠——这一行就会转交给 App Store 应用来处理
自我更新(Electron、Squirrel) 打开应用,让它自己的更新程序来完成
Homebrew 应用 cask brew install --cask --force
Homebrew pkg cask 下载官方安装包,并打开系统安装器

如果应用自带更新程序,DuoUpdater 会把工作交给它,而不是跟它抢。遇到无法安全完成的操作,它会直接在那一行说明,而不是靠猜。

命令行工具与字体

清单底部的一行,涵盖了 Homebrew 安装的所有非应用内容:命令行 formula,以及根本不安装 .app 的 cask⁠——命令行工具、字体、驱动程序。这些都不需要逐个应用的判断,也没有可扫描的应用包,如果没有这一行,它们就会完全不可见。

而确实安装了应用的 cask,会像其他应用一样得到普通的一行,永远不会被底部那一行的升级触碰到,所以不会有任何东西被计算两次。