Безопасность установки
Что проверяется перед заменой приложения и чего DuoUpdater намеренно никогда не делает
Возможность выполнять установку самостоятельно и делает эти проверки возможными. Каждая из них — это то, что может пойти не так, когда одна программа заменяет на вашем Mac другую.
Он никогда не завершает работающее приложение принудительно
Установщик никогда ничего не закрывает. Перезапуск обновлённого
приложения — отдельный шаг, включённый по умолчанию и отключаемый в
«Настройках»; а когда он выполняется, закрытие — это обычная команда
terminate(). Приложение само показывает свои запросы на сохранение и может
отказаться закрыться. То, что отказалось, остаётся работать и сохраняет
кнопку «Перезапустить», так что несохранённая работа никогда не оказывается
под угрозой из-за принудительного закрытия.
Стоит знать: перезапуск происходит после того, как новая версия уже оказалась на диске. Поэтому если вы отклонили закрытие, рядом с обновлённым bundle остаётся работать процесс со старым кодом — пока вы сами не перезапустите приложение. Именно это и означает кнопка «Перезапустить» в строке.
Пять проверок перед любой заменой
EdDSA — там, где само приложение публикует открытый ключ. Некоторые поставщики публикуют неподписанную ленту; таким не отказывают сразу — им просто нужно самостоятельно пройти оставшиеся проверки. Приложение, которое действительно публикует ключ, обязано выдать действительную подпись — с одним намеренным исключением, о котором ниже.
Затем, независимо от источника, — четыре проверки загруженного bundle:
- Подпись Developer ID, проверяемая строго и до конца — для каждой архитектуры, включая вложенный код, а не только внешний bundle.
- Team ID, который должен совпадать с Team ID заменяемого приложения.
- Bundle identifier, взятый из самой подписи, а не из
Info.plist, поэтому переписанный plist не может обмануть эту проверку. - Запускаемая архитектура, считанная из настоящих срезов Mach-O. Сборка, которую этот Mac не может запустить, отклоняется, а не устанавливается в нерабочем виде.
Загрузка, которая указывает на другого разработчика, отклоняется, а не устанавливается.
Исключение: когда поставщик меняет ключ подписи, не выпустив переходную сборку, старый ключ перестаёт годиться для проверки чего-либо нового от него. Вместо того чтобы навсегда оставить приложение без обновлений, недействительная подпись EdDSA не отклоняет установку сразу, а удерживается, и установка всё же может продолжиться, если пройдены остальные четыре проверки и загруженный bundle несёт новый ключ, которым проверяется лента. В этом случае доверие обеспечивают именно проверки Developer ID и Team ID.
Переход на новую основную версию требует подтверждения
Переход на новую основную версию скрыт за предупреждением, а не за кнопкой в один клик, потому что для коммерческого приложения он может потребовать новую лицензию. Решаете вы; DuoUpdater не решает это за вас, делая это слишком простым.
Всё перепроверяется непосредственно перед установкой
Список, который был открыт целый час, — уже устаревшие данные. Перед заменой проверка выполняется заново, поэтому избыточная установка никогда не запускается для приложения, которое тем временем уже обновил кто-то другой.
Резервные копии для отката
Заменяемый bundle сохраняется, и его можно вернуть на место. duo backups
выводит список точек отката из командной строки; приложение показывает то же
самое.
Обнаружение необходимости перезапуска
Если приложение обновлено на диске, но всё ещё работает со старой сборкой — это сравнивается через LaunchServices, а не угадывается, — оно отображается с действием «Перезапустить», а не отмечается как актуальное. Версия на диске и версия, которая выполняется, — это два разных факта, и строка показывает, какой из них устарел.