23 авг. 2022 г.

Обновление в приложении

 


Дошли руки дописать апдейтер в приложении.
Список возможностей формировался из собственных требований к функционалу:

  •  Проверка наличия обновлений с заданным временным интервалом.
  •  Уведомление о наличии обновлений.
  •  Опциональность либо обязательность обновления.
  •  Вывод полной информации о обновлением (версия, дата, размер, контрольная сумма) перед его загрузкой/применением.
  •  Проверка и сравнение текущей (локальной) и обновленной версии (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++ уже используется в приложении для проверки контрольных сумм.

На данный момент используется для обновления базы данных используемой в приложении.