Как это работает

Откуда берётся номер версии каждого приложения и почему способ установки для разных приложений различается

← Вся документация

DuoUpdater сканирует /Applications, /Applications/Utilities и ~/Applications, а затем сверяет найденное с несколькими источниками обновлений — в порядке приоритета. Отвечает за приложение первый источник, который его распознал; остальные не опрашиваются.

  1. Mac App Store — API поиска iTunes от Apple, с учётом витрины и региона. Учитываются только нативные результаты mac-software; приложения для iOS, запущенные на Mac, пропускаются, потому что их номера версий меняются независимо и иначе показывались бы как обновления, которые невозможно установить.
  2. Xcode Releases — сборки Xcode, не полученные из App Store: каждая бета и релиз-кандидат, сопоставленные с тем каналом, который у вас действительно установлен. Xcode, установленный из App Store, уже учтён пунктом выше.
  3. Homebrew Cask — сопоставление по имени файла .app, а если оно не найдено — по bundle id, поэтому находятся и casks, которые устанавливают pkg, а не bundle приложения. Этот источник отвечает только за приложения, которые Homebrew установил и поддерживает актуальными (не отмеченные как auto_updates), поэтому после обновления одного приложения запись Homebrew остаётся актуальной, и brew upgrade не устанавливает тот же самый релиз повторно.
  4. Sparkle — собственная лента appcast приложения по адресу SUFeedURL — та же лента, которую читает встроенный обновитель приложения.
  5. GitHub Releases — сопоставление с учётом канала для приложений, распространяемых таким образом. Только обнаружение, если только отдельное правило для конкретного приложения не назвало и не проверило устанавливаемый файл для Mac.
  6. Alcove — его собственная конечная точка обновлений с аутентификацией, и только если вы ввели лицензию. Без неё этот источник отсутствует полностью, и Alcove переходит к публичной проверке поставщика ниже.
  7. Проверки поставщика (vendor probes) — написанные вручную правила для собственной конечной точки поставщика, для всего, что не публикует ни ленту, ни карточку в магазине.

Два вида приложений, которые вообще пропускают этот список

Приложение, которым управляет JetBrains Toolbox, и приложение, установленное из TestFlight, получают ответ раньше, чем опрашивается хоть один из семи источников выше. Toolbox и TestFlight сами отвечают за обновления этих приложений, и получить полезное второе мнение неоткуда, поэтому для них список вообще не запускается.

Каждое приложение обновляется так, как ожидает именно оно

Большинство программ обновления выбирают один механизм и пропускают через него все приложения. Эта же использует то, с чем приложение уже поставляется, поэтому нажатие кнопки приводит к разным действиям в зависимости от строки:

Канал Что происходит при нажатии «Обновить»
Sparkle Загрузка, проверки ниже, замена bundle — затем приложение закрывается и открывается заново, если вы не отключили это
Mac App Store Полная загрузка через магазин. Там, где это невозможно — фоновый помощник не одобрен или приложение привязано к другому региону, — строка передаёт управление приложению App Store
Самообновляющиеся (Electron, Squirrel) Приложение открывается, и его собственный обновитель делает всю работу
Homebrew app cask brew install --cask --force
Homebrew pkg cask Загрузка официального пакета и открытие системного установщика

Когда приложение поставляется с собственным обновителем, DuoUpdater уступает ему, а не соперничает с ним. Когда что-то нельзя сделать безопасно, DuoUpdater сообщает об этом прямо в строке, а не действует наугад.

Инструменты командной строки и шрифты

Одна строка внизу списка охватывает всё, что устанавливает Homebrew и что не является приложением: формулы командной строки и casks, не устанавливающие вообще никакого .app, — CLI, шрифт, драйвер. Ни одно из этого не требует отдельного решения для каждого приложения, и у них нет bundle для сканирования, так что без этой строки они были бы попросту не видны.

Cask, который действительно устанавливает приложение, получает обычную строку, как и всё остальное, и никогда не затрагивается обновлением из этой нижней строки, поэтому ничего не учитывается дважды.