Как включить автоматическое обновление в кросс-платформенном приложении Qt?

Я люблю приложения, которые могут обновить себя без каких-либо усилий со стороны пользователя (кажется: Искра framework для Mac). Есть ли какой-либо код/библиотека, которую я могу использовать для этого в приложении Qt, не беспокоясь о деталях ОС?

по крайней мере для Windows, Mac и пользовательских двоичных файлов Linux.

Я мог бы интегрировать Sparkle в версию Mac, кодировать что-то для случая Linux (только для автономного, принадлежащего пользователю двоичного файла; я не буду мешать с распределение упаковка, если моя программа когда-либо упакована), и найти кого-то, кто поможет мне на стороне Windows, но это ужасно больно.

11 ответов


это не полное решение, но кросс-платформенный (Windows, Mac, Linux) инструмент для создания пакетов для автоматического обновления и их установки доступен вhttps://github.com/mendeley/Update-Installer. Этот инструмент не занимается публикацией обновлений или их загрузкой.

это было написано для использования с приложением на основе Qt, но чтобы сделать установщик обновлений маленьким, автономным и простым в сборке, установщик использует только стандартные системные библиотеки (C++ среда выполнения, pthreads / libz/libbz2 на Linux / Mac, Win32 API на Windows, Cocoa на Mac, GTK с резервным вариантом на Linux). Это упрощает доставку обновлений, которые включают новые версии Qt и других несистемных библиотек, от которых может зависеть ваше приложение.

прежде чем рассматривать это, я бы предложил:

  • если вы строите только для двух платформ, рассмотрите возможность использования стандартных и хорошо протестированных фреймворков автоматического обновления для этих платформ-например. Sparkle на Mac, Google's Omaha в Windows или системах автоматического обновления, встроенных в популярные фреймворки установки (например. Как InstallShield). Я не пробовал пренадлежащие bitrock.
  • на Mac, Mac App Store может быть хорошим вариантом. См.https://bugreports.qt.io/browse/QTBUG-16549 хотя.
  • в Linux рассмотрите возможность создания .deb пакет и простой репозиторий для его размещения. Как только пользователи настроят репозиторий, общесистемные средства обновления программного обеспечения позаботятся о проверке и установка новых выпусков. Однако шаги по настройке нового репозитория слишком сложны для многих новых пользователей Ubuntu/Debian. То, что мы сделали, а также то, что сделали Dropbox и Google, - это создать .пакет deb, который устанавливает репозиторий как часть установки пакета.

несколько других заметок о создании программы обновления:

  • в Windows Vista / 7, если приложение установлено в масштабах всей системы (например. в C:\Program Files\$APPNAME) ваши пользователи увидят страшное приглашение UAC, когда средство обновления пытается получить разрешения на запись в каталог установки. Этого можно избежать, установив в каталог, доступный для записи пользователем (я полагаю, что это то, что делает Google Chrome), или получив сертификат Authenticode и используя его для подписания двоичного файла обновления.
  • в Windows Vista/7, приложение .exe или DLL не могут быть удалены при использовании, но программа обновления может перемещать существующие .exe / DLL из пути во временный каталог и расписание это для удаления при следующей перезагрузке.
  • в Ubuntu сторонние репозитории отключаются после обновления дистрибутива. Google работает вокруг этого, создавая cron-задание для повторного добавления репозитория, если это необходимо.

промоушен: пылом, простое многоплатформенное (Qt-based) приложение autoupdater, вдохновленное Sparkle.


бесстыдный плагин: это относительно старый вопрос, но я подумал, что может быть полезно упомянуть библиотеку, которую я недавно создал, которую я назвал "QSimpleUpdater". Помимо уведомления вас, если есть более новая версия, она позволяет загружать журнал изменений в любом формате (например, HTML или RTF) и загружать обновления непосредственно из вашего приложения с помощью диалогового окна.

Как вы можете ожидать от проекта Qt, он работает на любой платформе, поддерживаемой Qt (протестирован на Windows, Mac & Linux.)

ссылки:

скриншоты:

enter image description here


хотя он работает немного иначе, чем Sparkle,BitRock InstallBuilder содержит autoupdater, написанный на Qt, который может использоваться независимо (отказ от ответственности, я оригинальный разработчик BitRock). Это коммерческое приложение, но у нас есть бесплатные лицензии для проектов с открытым исходным кодом.


Я нашел WebUpdate чтобы быть очень полезным, хотя он написан с помощью wxWidgets. Но не волнуйтесь, это отдельное приложение, которое обрабатывает ваши обновления. Шаги по его интеграции довольно просты - просто напишите два XML-файла и запустите программу обновления. И да, это кросс-платформенный.

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

главная страница проекта -здесь, вы можете прочитать docs или взгляните на чиновника учебник.


Я разработал библиотеку автоматического обновления, которая прекрасно работает на Mac OS X, Linux и практически на каждом Unix, что позволяет разблокировать файл, пока файл все еще открыт. Причина в том, что я просто извлек загруженный пакет поверх существующего приложения. К сожалению, поскольку я полагался на эту функциональность, я столкнулся с проблемами в Windows, так как Windows не позволяет разблокировать открытый файл.

единственная альтернатива, которую я мог найти, - использовать MoveFileEx с заменить на флаг перезагрузки, но это ужасно.

однако переименование рабочего каталога приложения работает в Windows 7 и Windows XP. Я еще не пробовал Windows Vista.


в блоге смешивание какао и Qt может решить проблему для платформы Mac.


можно использовать ли updatenode, который дает вам все возможности для обновления программного обеспечения. Он использует кросс-платформенный Qt-клиент и является бесплатным для Open Source!

обновление Просто сделал некоторый дальнейший анализ этого и действительно нравится это решение:

плюсы:

  • бесплатно с открытым исходным кодом!!! Даже клиент с открытым исходным кодом: https://github.com/updatenode/unclient
  • клиент уже локализовано на нескольких языках
  • очень гибкий с точки зрения обновлений. Вы даже можете обновить отдельные не двоичные файлы.
  • дополнительно предоставляет способ отображения сообщений, хотя клиент.
  • готов к использованию двоичных файлов и установщика для всех распространенных дистрибутивов Linux, одного двоичного файла Windows, а также установщика и решения для Mac (которое я не пробовал, так как у меня нет Mac)
  • простой в использовании веб-сервис, хорошая статистика и проверка обновлений интегрированной в течение нескольких минут

плюсы:

  • мне не хватает многопользовательского управления в онлайн-сервис. Возможно, они сделают это в будущем - я обязательно предложу это в своем портале отзывов
  • клиент-только клиент GUI-поэтому вам нужно будет сжать его, чтобы запустить без интерфейса GUI (возможно, только для таких людей, как я; -))

Итак, итог, поскольку это решение довольно новое, я думаю, что есть здесь большой потенциал. Я обязательно буду использовать его в своем проекте, и я с нетерпением жду от них большего! Недурно!


Я предлагаю вам прочитать плагин и как их создавать и использовать. Если ваша архитектура приложения модульная и разбита на разные плагины. Взгляните на Google Auto Update utility http://code.google.com/p/omaha/. Мы используем это.


Тибо Кювелье пишет учебник (на французском языке) для разработки средства обновления. Я знаю, что объяснения на французском языке (и все не понимают французский), но я думаю, что это можно прочитать с помощью веб-переводчика, такого как Google Translate. При этом у вас будет кроссплатформенный апдейтер, но писать его нужно самостоятельно.

для того, что я знаю, единственная часть обновления, которая объясняется в учебнике, - это часть загрузки файла. В случае, если это может помочь вам, обратитесь к учебнику, un updater avec Qt.

надеюсь, это поможет.


хорошо, поэтому я думаю, что я принимаю это как "нет (кросс-платформенный) способ". Очень жаль!