Проверка наличия версииДаты могут врать (как на сервере, так у клиента). Не встречал ни одной программы, которая опиралась бы на даты в обновлениях.
Как это делается в нормальных программах:- Прога знает какая у нее версия (число).
- Прога стучится по заранее договоренному адресу, напр. (самый простой способ реализации - http запрос, см. "серверная часть").
- Адрес отвечает какая версия последняя (пхп выводит число).
- Если текущая версия меньше - тогда происходит обновление.
Согласие пользователя на обновлениеЕсли проверка показала наличие обновлений, пользователю желательно показать диалог: хочет ли он обновиться сейчас?
Даже сверхкритические апдейты не стоит делать принудительно и тем более без согласия пользователя (не известно, может ли он себе сейчас позволить обновление).
Начало обновленияИтак, пользователь дал добро обновиться:
Если программа не большая или трафик пользователя вам не жалко - то обновлять можно всю программу целиком. Тут два способа:
- можно отправить пользователя на веб-страничку скачивания свежей версии.
- либо начать ее скачивать средствами программы.
Первый вариант предпочтительнее, т.к. можно разместить скриншоты, полезную информацию, рекламу или еще что-то.
Второй вариант требует прямого доступа (direct link) к файлу (увеличивает бинарный трафик вашего сайта, отменяет возможность разместить файл на файлообменниках, в том числе и в дробпоксоподобных).
Если для уменьшения трафика планируется все-же обновлять программу частями Прога стучится по еще одному адресу и получает список свежих файлов.
Например, вот в таком виде:
Код
105
http://mysite.com.ua/download/partial/
filename1.ext, 101, 22255, 9d15b1654c84f232e15781a
filename2.ext, 99, 2185, 8d15b1654c84f232e15781b1b
filename4.ext, 105, 21255, 7ad15bs1654c84f232e15781c
dir1/filename5.ext, 105, 2505, 6ad15b1654c84f232e15781d
dir2/filename6.ext, 103, 22255, 5d15b1654c84f232e15781e
Первая строка - номер свежей версии, вторая - путь для скачивания. дальше список файлов:
первая "колонка" - имя и путь к файлу,
вторая - версия в которой файл последний раз изменился
третья - размер файла в байтах
четвертая - хеш (напр. md5)
прога в цикле перебирает эти строки и проверяет:
- если нет такого файла или версия в которой он менялся последний раз - больше текущей, тогда однозначно добавить в список скачивания.
иначе*, сравнить размер файлов и если он совпадает - сравнить хеши.
В результате у вас будет список файлов, которые нужно скачать, а так же размер обновления, и хеши файлов, для проверки корректности скачивания.
Скачивание и обновлениеРуководствуясь списком файлов из пред. пункта - скачиваем их с указанного пути.
Скачивать лучше во временную директорию. После скачивания - проверить размер и хеш. если что-то не совпало - говорим "Увы, обновление не удалось".
Иначе, проверяем, не висит ли в памяти наше приложение, если да - вынуждаем пользователя его закрыть (корректно).
Копируем файлы из временной папки в папку с приложением, и если в процессе копирования не произошло ошибок - говорим, что все успешно, если нет - то говорим, что "обновление произошло с ошибками, рекомендуем установить прогу заново".
Удаляем файлы из временной папки.
Серверная частьСерверная часть не обязательно должна быть на php. она вообще может состоять из одного текстового файла, который заполняется вручную автором, или с помощью какой-то самописной утилиты, и затем выкладывается в сеть.
Для автоматизации этого дела, нужно будет сделать скрипт ревизии. Он:
- загружает текущий список файлов (аналогично клиенту), и получает версию до обновления.
- увеличивает номер версии на 1 (или на другой шаг)
- рекурсивно сканирует указанную ему папку.
- у всех новых файлов и файлов, которые не совпадают (аналогично клиенту) записываются новые размеры, хеши и текущая версия.
- обновленный список пишется в файл.
РевизияАвтор заливает новые файлы в папку на сервере и запускает скрипт ревизии из предыдущего пункта. Его можно защитить логином и паролем, ограничить по айпи или еще как защитить от лишнего пересчитывания, но это не обязательно.