QtUpdater
Updater for Qt5 (auto-updates).
Table of Contents
Requirements
- Platform: Windows, MacOS, Linux (except for installer auto-start).
- CMake 3.19+
- Qt 5.15+
- cpphttplib (Only for unit tests)
Features
This library contains:
- A core:
QtUpdater
- A controller:
QtUpdateController
, that may be use with QtWidgets or QtQuick/QML. - A widget:
QtUpdateWidget
, that may be used as aQWidget
or inside aQDialog
.
It has these features:
- Get latest update information.
- Get changelog.
- Get installer.
- Execute installer.
- Temporarly stores the update data in the
temp
folder. - Verify checksum after downloading and before executing installer.
Usage
-
Add the library's repository as a Git submodule.
git submodule add git@github.com:oclero/QtUpdater.git submodules/qtupdater
-
Download submodules.
git submodule update --init --recursive
-
Add the library to your CMake project.
add_subdirectory(submodules/qtupdater)
-
Link with the library in CMake.
target_link_libraries(your_project oclero::QtUpdater)
-
Include the only necessary header in your C++ file.
#include <oclero/QtUpdater.hpp>
Server Specifications
Protocol
The protocol is the following:
-
The client sends a request to the endpoint URL of your choice. Example (with curl):
curl http://server/endpoint?version=latest
-
The server answers by sending back an appcast: a JSON file containing the necessary information. The appcast must look like the following:
{ "version": "x.y.z", "date": "dd/MM/YYYY", "checksum": "418397de9ef332cd0e477ff5e8ca38d4", "checksumType": "md5", "installerUrl": "http://server/endpoint/package-name.exe", "changelogUrl": "http://server/endpoint/changelog-name.md" }
-
The client downloads the changelog from
changelogUrl
, if any provided (facultative step). -
The client downloads the installer from
installerUrl
, if any provided. -
The client installs the installer:
- The client may start the installer and quit, if necessary.
- It may also move the downloaded file to some location.
Example
Server
A very basic server written in Python is included as testing purposes. Don't use in production environment!
# Start with default config.
python examples/dev_server/main.py
# ... Or set your own config.
python examples/dev_server/main.py --dir /some-directory --port 8000 --address 127.0.0.1
Some examples of valid requests for this server:
# The client must be able to retrieve the latest version.
curl http://localhost:8000?version=latest
# This is equivalent to getting the latest version.
curl http://localhost:8000
# If the following version exist, the request is valid.
curl http://localhost:8000?version=1.2.3
# If the file exist, the request is valid.
curl http://localhost:8000/v1.1.0.exe
Client
// Create an updater.
oclero::QtUpdater updater("https://server/endpoint");
// Subscribe to all necessary signals. See documentation for complete list.
QObject::connect(&updater, &oclero::QtUpdater::updateAvailabilityChanged,
&updater, [&updater]() {
if (updater.updateAvailability() == oclero::QtUpdater::UpdateAvailable::Available) {
qDebug() << "Update available! You have: "
<< qPrintable(updater.currentVersion())
<< " - Latest is: "
<< qPrintable(updater.latestVersion());
} else if (updater.updateAvailability() == oclero::QtUpdater::UpdateAvailable::UpToDate) {
qDebug() << "You have the latest version.";
} else {
qDebug() << "Error.";
}
});
// Start checking.
updater.checkForUpdate();
Author
Olivier Cléro | email | website | github | gitlab
License
QtUpdater is available under the MIT license. See the LICENSE file for more info.