Дошли руки дописать апдейтер в приложении.
Список возможностей формировался из собственных требований к функционалу:
- Проверка наличия обновлений с заданным временным интервалом.
- Уведомление о наличии обновлений.
- Опциональность либо обязательность обновления.
- Вывод полной информации о обновлением (версия, дата, размер, контрольная сумма) перед его загрузкой/применением.
- Проверка и сравнение текущей (локальной) и обновленной версии (Major/Minor/Micro).
- Проверка на соответствие контрольной суммы в манифесте обновления и скачанного файла.
- Вывод чейнджлога по подгруппам ("added", "fixed", "removed", "other").
- Вывод истории обновлений, не установленных юзером. Т.е. при локальной версии 1.1.1 будет отображена информация по 1.2.3, 1.2.4 и тд. Дабы полностью ознакомится со списком всего нового в т.ч и из предыдущих неустановленных обновлений.
Для файла манифеста выбран JSON:
Пример:
meta_url:
{
"build": {
"stable": {
"channel": "stable",
"meta_url": "http://localhost:3000/assets/db_version.json",
"release_notes_url": "http://localhost:3000/assets/db_version_notes.json",
"release_notes_history_url": "http://localhost:3000/assets/db_version_history.json",
"update_url": "http://localhost:3000/assets/games.db",
"update_size": 1466368,
"update_sha256": "efa618ab65e31d921cd4f9d355e1a9d17d908e3c326bf3c1a89bf3ee38d646c1",
"update_optional": true,
"last_version_number_major": 1,
"last_version_number_minor": 2,
"last_version_number_micro": 4,
"last_version_unix_time": 1660769543,
"compatible_since_major": 1,
"compatible_since_minor": 0,
"compatible_since_micro": 0
},
"beta": {
"channel": "beta"
}
}
}
где,
build - билд с которым работает обновление (stable, beta и тд).
meta_url - собственно url данного манифеста.
release_notes_url - список изменений текущего обновления.
release_notes_history_url полный список изменений по версиям.
update_size - размер обновления
update_sha256 - контрольная сумма
update_optional - флаг обязательности/опциональности обновления
last_version_number_major, last_version_number_minor, last_version_number_micro - собственно версия обновления
last_version_unix_time - дата выхода Unix timestamp ака UNIX Epoch time
compatible_since_* - совместимость обновления с версией приложения.
release_notes_url:
"build": {
"stable": {
"version": {
"major": 1,
"minor": 2,
"micro": 4,
"unix_time": 1660769543,
"changelog": {
"added": [
"Some things added",
"Another cool things added"
],
"removed": [
"Removed some unused features"
],
"fixed": [
"Minor bugfix"
],
"other": []
}
}
}
}
}
Чейнджлог разбит по подгруппам ("added", "fixed", "removed", "other") для группировки.
release_notes_history_url:
{
"build": {
"stable": {
"version": [
{
"major": 1,
"minor": 2,
"micro": 4,
"unix_time": 1660769543,
"changelog": {
"added": [
"Some things added",
"Another cool things added"
],
"removed": [
"Removed some unused features"
],
"fixed": [
"Minor bugfix"
],
"other": []
}
},
{
"major": 1,
"minor": 2,
"micro": 3,
"unix_time": 1660759543,
"changelog": {
"added": [
"Added XYZ",
"Added ZYX"
],
"removed": [],
"fixed": [],
"other": [
"Migrate from old format to new"
]
}
},
{
"major": 1,
"minor": 2,
"micro": 2,
"unix_time": 1660733543,
"changelog": {
"added": [],
"removed": [],
"fixed": [],
"other": []
}
}
]
}
}
}
По сути тоже, что и в release_notes_url, где атрибут version возвращает массив с данными.
В планах:
- Добавление "зеркал" для обновления, в случае недоступности основного источника.
- Добавление зависимостей для обновления.
- Проверка цифровой подписи скачанного файла. Crypto++ уже используется в приложении для проверки контрольных сумм.
На данный момент используется для обновления базы данных используемой в приложении.