Подтвердить что ты не робот

Автоматическая проверка новой версии моего приложения

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

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

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

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


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

как

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

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

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

4b9b3361

Ответ 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 (последнее больше не продолжается).