Автоматическая проверка новой версии моего приложения
Попытка почтить запрос функций от наших клиентов, я хотел бы, чтобы мое приложение, когда имелось в наличии в Интернете, проверяло наш веб-сайт, если доступна новая версия.
Проблема в том, что я понятия не имею, что делать на стороне сервера.
Я могу себе представить, что мое приложение (разработанное на С++ с использованием Qt) должно отправить запрос (HTTP?) на сервер, но что ответит на этот запрос? Чтобы пройти через брандмауэры, я думаю, мне придется использовать порт 80? Правильно ли это?
Или для такой функции я должен попросить нашего сетевого администратора открыть определенный номер порта, через который я свяжусь?
@pilif: спасибо за подробный ответ. Для меня все еще есть что-то непонятное:
как
http://www.example.com/update?version=1.2.4
Затем вы можете вернуть то, что захотите, возможно, также URL-адрес загрузки установщика новой версии.
Как мне что-то вернуть? Будет ли это страницей php или asp (я ничего не знаю о PHP и ASP, я должен признаться)? Как я могу декодировать часть ?version=1.2.4
, чтобы что-то вернуть?
Ответы
Ответ 1
Я бы абсолютно рекомендовал просто выполнить простой HTTP-запрос на ваш сайт. Все остальное обязательно потерпит неудачу.
Я бы сделал HTTP GET-запрос на определенную страницу вашего сайта, содержащую версию локального приложения.
как
http://www.example.com/update?version=1.2.4
Затем вы можете вернуть то, что захотите, возможно, также URL-адрес загрузки установщика новой версии.
Почему бы просто не поставить статический файл с последней версией на сервер и позволить клиенту решить? Потому что вы можете (или нуждаться) иметь контроль над процессом. Возможно, 1.2 не будет совместим с сервером в будущем, поэтому вы хотите, чтобы сервер принудительно обновил до 1.3, но обновление с 1.2.4 до 1.2.6 может быть некритическим, поэтому вы можете представить клиенту необязательное обновление.
Или вы хотите иметь разбивку по установленной базе.
Или что угодно. Обычно я научился лучше хранить на сервере столько же интеллекта, что сервер - это то, что у вас есть окончательный контроль.
Говоря здесь с небольшим опытом в этой области, здесь небольшой предварительный просмотр того, что может (и будет - доверять мне) пойти не так:
- В вашем приложении будет предотвращено выполнение HTTP-запросов различными приложениями Personal Firewall.
- Значительный процент пользователей не будет иметь необходимых разрешений для фактического получения процесса обновления.
- Даже если ваши пользователи разрешили использовать старую версию своего личного брандмауэра, этот инструмент будет жаловаться, потому что .EXE изменился и будет рекомендовать пользователю не разрешать подключение нового exe (пользователи обычно выполняют требования своей безопасности инструмент здесь).
- В управляемых средах вы будете застрелены и повесили (не обязательно в этом порядке) для загрузки исполняемого содержимого из Интернета и последующего его выполнения.
Таким образом, чтобы урон был как можно ниже,
- тихо, когда вы не можете подключиться к серверу обновлений
- перед обновлением убедитесь, что у вас есть разрешение на запись в каталог установки и предостережение пользователя, если вы этого не сделаете, или просто не обновляете вообще.
- Предоставьте администраторам возможность отключить автоматическое обновление.
Не сложно делать то, что вы собираетесь делать - особенно когда вы имеете дело с не технически склонными пользователями, как это было у меня много раз.
Ответ 2
Ответ Pilif был хорошим, и у меня есть большой опыт в этом, но я хотел бы добавить что-то еще:
Помните, что если вы запустите файл yourapp.exe, то "updater" попытается перезаписать файл yourapp.exe самой последней версией. В зависимости от вашей операционной системы и среды программирования (вы упоминали С++/QT, у меня нет опыта с ними), вы можете не перезаписывать файл yourapp.exe, потому что он будет использоваться.
То, что я сделал, это создать пусковую установку. У меня есть файл MyAppLauncher.exe, который использует файл конфигурации (xml, очень простой) для запуска "реального exe". Если новая версия существует, Launcher может обновить "реальный exe", потому что она не используется, а затем повторно запускает новую версию.
Просто имейте это в виду, и вы будете в безопасности.
Ответ 3
Мартин,
Вы абсолютно правы, конечно. Но я доставлял пусковую установку с установщиком. Или просто скачайте установщик, запустите его и выйдите из него как можно скорее. Причина - ошибки в пусковой установке. Вы никогда не захотите зависеть от компонента, который вы не можете обновить (или забыть включить в первоначальное падение).
Таким образом, полезная нагрузка, которую я распространяю с процессом обновления моего приложения, является стандартным установщиком, но лишена какого-либо значимого пользовательского интерфейса. Как только клиент проверит, что у установщика есть шанс успешно работать, и как только он загрузил обновление, он запускает это и завершает работу.
Программа обновления, чем работает, устанавливает свою полезную нагрузку в исходный каталог установки и перезапускает приложение (надеюсь, обновленное).
Тем не менее: процесс выглядит волосатым, и вам лучше подумать дважды, прежде чем внедрять функцию автоматического обновления на платформе Windows, когда ваше приложение имеет широкий спектр использования.
Ответ 4
в php, все просто:
<?php
if (version_compare($_GET['version'], "1.4.0") < 0){
echo "http://www.example.com/update.exe";
}else{
echo "no update";
}
?>
если вы можете расширить его, чтобы доступная в настоящее время версия не была жестко закодирована внутри script, но это только иллюстрирует точку.
В вашем приложении у вас будет этот псевдо-код:
result = makeHTTPRequest("http://www.example.com/update?version=" + getExeVersion());
if result != "no update" then
updater = downloadUpdater(result);
ShellExecute(updater);
ExitApplication;
end;
Не стесняйтесь расширять "протокол", указав что-то, что PHP script может вернуть, чтобы сообщить клиенту, является ли это важным обязательным обновлением или нет.
Или вы можете добавить текст для отображения пользователю - возможно, содержащую некоторую информацию о том, что изменилось.
Ваши возможности совершенно безграничны.
Ответ 5
Приложение My Qt просто использует QHttp для чтения крошечного XML файла с моего сайта, который содержит последний номер версии. Если это больше, чем номер текущей версии, он дает возможность перейти на страницу загрузки. Очень просто. Прекрасно работает.
Ответ 6
Я согласен с ответами @Martin и @Pilif, но добавьте:
Подумайте о том, чтобы позволить конечным пользователям решить, хотите ли они фактически установить обновление там и затем, или задержать установку обновления до тех пор, пока они не закончили использовать программу.
Я не знаю цели/функции вашего приложения, но многие приложения запускаются, когда пользователю нужно делать что-то конкретное, а затем - ничего более раздражающего, чем запуск приложения, а затем ему говорят, что он нашел новую версию и вам придется ждать его загрузки, закрыть приложение и перезапустить себя. Если ваша программа имеет другие ресурсы, которые могут быть обновлены (файлы ссылок, базы данных и т.д.), Проблема ухудшается.
У нас была система EPOS, работающая примерно в 400 магазинах, и изначально мы подумали, что было бы здорово иметь обновления программ и загружать их (используя файл, содержащий номер версии, очень похожий на предложения, которые у вас есть выше).. отличная идея. Пока все магазины не запускали свои системы примерно в одно и то же время (8: 45-8: 50am), и наш сервер был поражен, и он загрузил до 20 удаленных серверов на 20 + Мбайт, что затем обновит локальное программное обеспечение и вызовет перезапуск. Хаос - никто не сможет торговать в течение 10 минут.
Излишне говорить, что это заставило нас впоследствии отключить функцию "проверить наличие обновлений" и переделать ее, чтобы магазины могли "отложить" обновление до более позднего дня.: -)
EDIT: И если кто-нибудь из ADOBE читает - ради бога, почему проклятый акробат-читатель настаивает на попытке загрузить обновления и дерьмо, когда я просто хочу запустить его, чтобы прочитать документ? Разве это не слишком медленно при запуске, и раздувается достаточно, как есть, не тратя еще 20-30 секунд моей жизни на поиски обновлений каждый раз, когда я хочу читать PDF?
НЕ ИСПОЛЬЗУЙТЕ ИХ СОБСТВЕННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ!!!: -)
Ответ 7
если вы сохраняете свои файлы в каталоге обновлений на example.com, этот PHP script должен загрузить их для вас с учетом упомянутого ранее запроса. (ваше обновление будет вашим запросом .1.2.4.exe
$version = $_GET['version'];
$filename = "yourprogram" . $version . ".exe";
$filesize = filesize($filename);
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: post-check=0, pre-check=0");
header("Content-type: application-download");
header('Content-Length: ' . $filesize);
header('Content-Disposition: attachment; filename="' . basename($filename).'"');
header("Content-Transfer-Encoding: binary");
Это заставляет ваш веб-браузер думать, что он загружает приложение.
Ответ 8
На сервере у вас может быть простой файл "latestversion.txt", который содержит номер версии (и, возможно, URL загрузки) последней версии. Затем клиенту просто нужно прочитать этот файл с помощью простого HTTP-запроса (да, на порт 80), чтобы извлечь http://your.web.site/latestversion.txt, который вы можете затем проанализируйте, чтобы получить номер версии. Таким образом, вам не нужен какой-либо причудливый серверный код. Вам просто нужно добавить простой файл на существующий веб-сайт.
Ответ 9
Самый простой способ сделать это - запустить HTTP-запрос, используя библиотеку, такую как libcurl и сделать ее загруженной ini или xml файл, который содержит онлайн-версию и где новая версия будет доступна в Интернете.
После разбора xml файла вы можете определить, нужна ли новая версия и загрузить новую версию с помощью libcurl и установить ее.
Ответ 10
Просто поместите файл (XML) на свой сервер с номером версии последней версии и URL-адрес для загрузки новой версии. Затем ваше приложение может запросить XML файл, посмотреть, отличается ли версия от его собственной, и принять соответствующие меры.
Ответ 11
Я думаю, что простого XML файла на сервере было бы достаточно для проверки версий только для целей.
Вам понадобится только учетная запись ftp на вашем сервере и система сборки, способная отправлять файл через ftp после того, как он построил новую версию. Эта система сборки может даже поставить файлы установки /zip на ваш сайт напрямую!
Ответ 12
Если вы хотите сохранить его на самом деле базовым, просто загрузите файл version.txt на веб-сервер, содержащий целочисленный номер версии. Загрузите эту проверку с последней загруженной вами версии .txt, а затем просто загрузите msi или установочный пакет и запустите его.
Более продвинутые версии будут использовать rss, xml или аналогичные. Было бы лучше использовать стороннюю библиотеку для анализа rss, и вы могли бы включить информацию, которая будет отображаться для вашего пользователя об изменениях, если вы этого хотите.
В основном вам просто нужна простая функциональность загрузки.
Оба этих решения потребуют только доступа к порту 80 исходящего с клиентской стороны. Обычно это не требует каких-либо изменений в брандмауэрах или сети (на стороне клиента), и вам просто нужно иметь интернет-сервер (веб-хостинг, колокейшн или собственный сервер). Все будут работать здесь.
Есть несколько коммерческих решений для автоматического обновления. Я оставляю рекомендации для тех, кто отвечает на них, потому что у меня есть опыт только на стороне .net с блоком приложений Click-Once и Updater (последнее больше не продолжается).