Автоматическая проверка новой версии моего приложения - PullRequest
22 голосов
/ 11 сентября 2008

Пытаясь удовлетворить запрос от наших клиентов, мне бы хотелось, чтобы мое приложение, когда Интернет был доступен, проверило на нашем веб-сайте, доступна ли новая версия.

Проблема в том, что я понятия не имею, что нужно делать на стороне сервера.

Я могу представить, что мое приложение (разработанное на C ++ с использованием Qt) должно отправлять запрос (HTTP?) На сервер, но что будет отвечать на этот запрос? Я думаю, что для того, чтобы пройти через брандмауэры, мне придется использовать порт 80? Это правильно?

Или, для такой функции, я должен попросить нашего сетевого администратора открыть определенный номер порта, через который я буду общаться?


@ pilif : спасибо за подробный ответ. Есть еще кое-что, что мне непонятно:

как

http://www.example.com/update?version=1.2.4

Затем вы можете вернуть все, что захотите, возможно, также URL-адрес для загрузки установщика новой версии.

Как мне что-то вернуть? Будет ли это страница php или asp (я ничего не знаю ни о PHP, ни о ASP, я должен признаться)? Как я могу декодировать часть ?version=1.2.4, чтобы вернуть что-то соответственно?

Ответы [ 12 ]

38 голосов
/ 11 сентября 2008

Я бы настоятельно рекомендовал просто сделать простой HTTP-запрос на ваш сайт. Все остальное обречено на провал.

Я бы сделал запрос HTTP GET на определенную страницу вашего сайта, содержащую версию локального приложения.

как

http://www.example.com/update?version=1.2.4

Затем вы можете вернуть все, что захотите, возможно, также адрес загрузки установщика новой версии.

Почему бы просто не поместить статический файл с последней версией на сервер и позволить клиенту принять решение? Потому что вы можете (или должны) иметь контроль над процессом. Возможно, версия 1.2 не будет совместима с сервером в будущем, поэтому вы хотите, чтобы сервер принудительно установил обновление до версии 1.3, но обновление с версии 1.2.4 до версии 1.2.6 может быть некритическим, поэтому вам может потребоваться представить клиенту необязательное обновление.

Или вы хотите разбить установленную базу.

Или что угодно. Обычно я узнал, что лучше хранить как можно больше информации на сервере, потому что сервер - это то, над чем вы в конечном итоге контролируете.

Выступая здесь с небольшим опытом работы в этой области, вот небольшой предварительный обзор того, что может (и будет - мне доверять) пойти не так:

  • Ваше приложение не сможет выполнять HTTP-запросы различными приложениями Personal Firewall.
  • У значительного процента пользователей не будет необходимых разрешений для фактического запуска процесса обновления.
  • Даже если ваши пользователи разрешают использовать старую версию за пределами своего персонального брандмауэра, указанный инструмент будет жаловаться, потому что .EXE изменился, и будет рекомендовать пользователю не разрешать подключаться новому exe-файлу (пользователи обычно выполняют пожелания своей безопасности инструмент здесь).
  • В управляемых средах вы будете застрелены (не обязательно в таком порядке) за загрузку исполняемого контента из Интернета и затем его фактическое выполнение.

Чтобы урон был как можно ниже,

  • завершается сбоем, когда вы не можете подключиться к серверу обновлений
  • перед обновлением убедитесь, что у вас есть разрешение на запись в каталог установки, и предупредите пользователя, если вы этого не сделаете или просто не обновляете вообще.
  • Предоставьте администраторам возможность отключить автоматическое обновление.

Неинтересно делать то, что ты собираешься делать, особенно когда ты имеешь дело с технически не склонными пользователями, как я делал это много раз.

21 голосов
/ 11 сентября 2008

Пилиф ответил хорошо, и у меня тоже есть большой опыт с этим, но я бы хотел добавить кое-что еще:

Помните, что если вы запустите yourapp.exe, то программа «Updater» попытается перезаписать yourapp.exe самой новой версией. В зависимости от вашей операционной системы и среды программирования (вы упомянули C ++ / QT, у меня нет опыта работы с ними), вы не сможете перезаписать yourapp.exe , потому что это быть в использовании.

Что я сделал, так это создал пусковую установку. У меня есть MyAppLauncher.exe, который использует файл конфигурации (xml, очень простой) для запуска «реального exe». Если новая версия существует, Launcher может обновить «настоящий exe», потому что он не используется, а затем повторно запустить новую версию.

Просто имейте это в виду, и вы будете в безопасности.

7 голосов
/ 11 сентября 2008

Мартин,

Вы абсолютно правы, конечно. Но я бы поставил лаунчер с установщиком. Или просто загрузите установщик, запустите его и закройте себя как можно скорее. Причина в ошибках в лаунчере. Вы никогда не захотите зависеть от компонента, который вы не можете обновить (или забыли включить в первоначальное удаление).

Таким образом, полезная нагрузка, которую я распространяю в процессе обновления моего приложения, является просто стандартным установщиком, но лишена какого-либо значительного пользовательского интерфейса. После того, как клиент проверил, что установщик имеет шанс на успешную работу, и после того, как он загрузил программу обновления, он запускает ее и завершает работу.

Программа обновления запускается, устанавливает свою полезную нагрузку в исходный каталог установки и перезапускает (надеюсь, обновленное) приложение.

Тем не менее: процесс сложный, и вам стоит подумать дважды, прежде чем применять функцию автоматического обновления на платформе Windows, когда ваше приложение широко используется.

5 голосов
/ 11 сентября 2008

в php, все просто:

<?php
    if (version_compare($_GET['version'], "1.4.0") < 0){
        echo "http://www.example.com/update.exe";
    }else{
        echo "no update";
    }
?>

если, конечно, вы могли бы расширить это, чтобы текущая доступная версия не была жестко запрограммирована в скрипте, но это только проиллюстрирует смысл.

В вашем приложении вы должны иметь этот псевдокод:

result = makeHTTPRequest("http://www.example.com/update?version=" + getExeVersion());
if result != "no update" then
    updater = downloadUpdater(result);
    ShellExecute(updater);
    ExitApplication;
end;

Не стесняйтесь расширять «протокол», указав что-то, что PHP-скрипт может вернуть, чтобы сообщить клиенту, является ли это важным обязательным обновлением или нет.

Или вы можете добавить некоторый текст для отображения пользователю - возможно, содержащий некоторую информацию о том, что изменилось.

Ваши возможности совершенно безграничны.

4 голосов
/ 13 сентября 2008

Мое приложение Qt просто использует QHttp для считывания крошечного XML-файла с моего сайта, который содержит номер последней версии. Если это больше, чем текущий номер версии, это дает возможность перейти на страницу загрузки. Очень просто. Работает нормально.

2 голосов
/ 11 сентября 2008

Я бы согласился с ответом @Martin и @ Pilif, но добавлю;

Подумайте о том, чтобы позволить вашим конечным пользователям решить, хотят ли они установить обновление тут же или потом, или отложить установку обновления, пока они не закончат использовать программу.

Я не знаю цели / функции вашего приложения, но многие приложения запускаются тогда, когда пользователю необходимо сделать что-то конкретное тут же и тогда - ничего более раздражающего, чем запуск приложения, а затем сообщение о том, что он нашел новую версию, и Вам нужно дождаться его загрузки, закрыть приложение и перезапустить себя. Если ваша программа имеет другие ресурсы, которые могут быть обновлены (справочные файлы, базы данных и т. Д.), Проблема усугубляется.

У нас была система EPOS, работающая примерно в 400 магазинах, и первоначально мы думали, что было бы здорово иметь программу, которая обновляет и загружает их (используя файл, содержащий номер версии, очень похожий на предложения, которые вы предлагали выше) .. . отличная идея. Пока все магазины не запустили свои системы примерно в одно и то же время (8: 45-8: 50 утра), и наш сервер был загружен, обслуживая загрузку 20+ Мб для 400 удаленных серверов, которые затем обновляли бы локальное программное обеспечение и вызывали запустить снова. Хаос - никто не может торговать около 10 минут.

Нет необходимости говорить, что это заставило нас впоследствии отключить функцию «проверка обновлений» и изменить ее дизайн, чтобы магазины могли «отложить» обновление до позднего дня. : -)

РЕДАКТИРОВАТЬ: И если кто-то из ADOBE читает - ради бога, почему этот проклятый читатель акробат настаивает на том, чтобы пытаться загрузить обновления и дерьмо, когда я просто хочу запустить, чтобы прочитать документ? Разве это не достаточно медленно при запуске и не настолько раздутый, как это, не тратя впустую 20-30 секунд своей жизни на поиск обновлений каждый раз, когда я хочу прочитать PDF?
НЕ ИСПОЛЬЗУЮТ СВОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ?? !!! : -)

1 голос
/ 11 сентября 2008

если вы храните свои файлы в каталоге обновлений на example.com, этот PHP-скрипт должен загрузить их для вас с учетом ранее упомянутого запроса. (ваше обновление будет вашей программой.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");

Это заставляет ваш веб-браузер думать, что он загружает приложение.

1 голос
/ 11 сентября 2008

На сервере у вас может быть простой файл «latestversion.txt», который содержит номер версии (и, возможно, URL-адрес загрузки) последней версии. Затем клиенту просто нужно прочитать этот файл, используя простой HTTP-запрос (да, к порту 80), чтобы получить http://your.web.site/latestversion.txt,, который затем можно проанализировать, чтобы получить номер версии. Таким образом, вам не нужен какой-нибудь причудливый код сервера - вам просто нужно добавить простой файл на ваш существующий веб-сайт.

0 голосов
/ 11 сентября 2008

Если вы хотите сохранить простоту, просто загрузите файл version.txt на веб-сервер, который содержит целочисленный номер версии. Загрузите эту проверку с последним загруженным файлом version.txt, а затем просто загрузите пакет msi или установочный файл и запустите его.

Более продвинутые версии будут использовать rss, xml или аналогичные. Было бы лучше использовать стороннюю библиотеку для анализа rss, и вы можете включить информацию, которая отображается вашему пользователю об изменениях, если вы хотите это сделать.

В основном вам просто нужна простая функциональность загрузки.

Оба эти решения потребуют от вас доступа только к порту 80, исходящему со стороны клиента. Обычно для этого не требуется вносить какие-либо изменения в брандмауэры или сети (на стороне клиента), и вам просто необходим веб-сервер с выходом в Интернет (веб-хостинг, колокейшн или собственный сервер - все будет работать здесь).

Существует несколько коммерческих решений для автоматического обновления. Я оставлю рекомендации для тех, кто отвечает другим, потому что у меня есть опыт работы только на стороне .net с Click-Once и блоком обновлений (последний больше не продолжается).

0 голосов
/ 11 сентября 2008

Я думаю, что простого XML-файла на сервере будет достаточно для проверки версий.

Тогда вам понадобится только учетная запись ftp на вашем сервере и система сборки, которая сможет отправлять файл через ftp после сборки новой версии. Эта система сборки может даже поместить установочные файлы / zip прямо на ваш сайт!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...