Comprobar automáticamente si hay una nueva versión de mi aplicación

StackOverflow https://stackoverflow.com/questions/56391

  •  09-06-2019
  •  | 
  •  

Pregunta

Tratando de hacer honor a una función de petición de nuestros clientes, me gustaría que mi solicitud, cuando Internet está disponible, consulte en nuestro sitio web si está disponible una nueva versión.

El problema es que no tengo ni idea sobre lo que tienen que hacer en el lado del servidor.

Me imagino que mi aplicación (desarrollada en C++ con Qt) tiene que enviar una solicitud HTTP (?) para el servidor, pero lo que va a responder a esta solicitud ?Con el fin de ir a través de firewalls, supongo que tendré que usar el puerto 80 ?Es esto correcto ?

O, por tal característica, ¿tengo que pedir a nuestro administrador de red para abrir un determinado número de puerto a través del cual voy a comunicar ?


@pilif :gracias por tu detallada respuesta.Todavía hay algo que no está claro para mí :

como

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

A continuación, puede devolver lo que quiera, probablemente, también la descarga-URL del instalador de la nueva versión.

¿Cómo puedo devolver algo ?Será un php o asp de la página (no sé nada de PHP ni ASP, tengo que confesar) ?¿Cómo puedo decodificar el ?version=1.2.4 parte con el fin de devolver algo en consecuencia ?

¿Fue útil?

Solución

Sin duda lo recomiendo para sólo hacer una simple petición HTTP para tu página web.Todo lo demás está destinado a fracasar.

Me gustaría hacer una solicitud GET HTTP a una determinada página en su sitio que contiene la versión de la aplicación local.

como

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

A continuación, puede devolver lo que quiera, probablemente, también la descarga-URL del instalador de la nueva versión.

¿Por qué no acaba de poner un archivo estático con la última versión para el servidor y dejar que el cliente decida?Porque puede que quiera (o necesidad) de tener el control sobre el proceso.Quizás 1.2 no ser compatible con el servidor en el futuro, de manera que usted desea que el servidor de la fuerza de la actualización 1.3, pero la actualización de 1.2.4 a 1.2.6 podría ser acrítica, por lo que puede presentar al cliente con una actualización opcional.

O usted quiere tener un desglose sobre la base instalada.

O lo que sea.Generalmente, he aprendido que es mejor quedarse con la mayor cantidad de inteligencia en el servidor, debido a que el servidor es lo que tiene el control último sobre.

Hablando con un poco de experiencia en el campo, he aquí un pequeño adelanto de lo que puede (y - confía en mí) ir mal:

  • Su Solicitud será impedido de hacer Peticiones HTTP-por las distintas Personal Firewall de aplicaciones.
  • Un porcentaje considerable de los usuarios no tienen los permisos necesarios para conseguir realmente el proceso de actualización de ir.
  • Incluso si los usuarios han permitido a la versión antigua pasado su firewall personal, dicha herramienta se quejan porque el .EXE ha cambiado y se recomienda al usuario de no permitir que el nuevo exe para conectar (los usuarios suelen cumplir con los deseos de su herramienta de seguridad aquí).
  • En entornos administrados, podrá ser fusilado y ahorcado (no necesariamente en ese orden) para la carga de contenido ejecutable desde la web y, a continuación, en realidad la ejecución de la misma.

Así que para evitar el daño tan bajo como sea posible,

  • fallar en silencio cuando no puede conectarse al servidor de actualizaciones
  • antes de actualizar, asegúrese de que tiene permiso de escritura para el directorio de instalación y advertir al usuario si no, o simplemente no actualizar en todo.
  • Proporcionar a los administradores una forma para activar la actualización automática de apagado.

No es divertido de hacer lo que estás a punto de hacer - especialmente cuando se trata de no técnicamente inclinado a los usuarios, como tenía que numerosas veces.

Otros consejos

Pilif respuesta fue buena, y tengo mucha experiencia con esto, pero me gustaría añadir algo más:

Recuerde que si usted comienza yourapp.exe entonces el "actualizador" va a intentar sobrescribir yourapp.exe con la versión más reciente.Dependiendo de su sistema operativo y el entorno de programación (que hemos mencionado en C++/QT, yo no tengo experiencia con esos), se le no ser capaz de sobrescribir yourapp.exe porque va a estar en uso.

Lo que he hecho es crear un lanzador.Tengo un MyAppLauncher.exe que utiliza un archivo de configuración xml (muy simple) para el lanzamiento de la "real exe".Si una nueva versión de existir, el Lanzador puede actualizar el "real exe" porque no está en uso y, a continuación, vuelva a iniciar la nueva versión.

Sólo ten eso en cuenta y estarás a salvo.

Martin,

tienes toda la razón, por supuesto.Pero me gustaría entregar el launcher con el instalador.O sólo tiene que descargar el instalador, poner en marcha y salir de mí mismo tan pronto como sea posible.La razón es que los errores en el launcher.Nunca, nunca, quiero ser dependiente de un componente que no se puede actualizar (o se olvida de incluir en la caída inicial).

De modo que la carga se distribuya con el proceso de actualización de mi aplicación es solo el instalador standard, pero desprovisto de cualquier interfaz de usuario.Una vez que el cliente ha comprobado que el instalador tiene una oportunidad de correr con éxito y una vez que se ha descargado la actualización, que se ejecuta y se cierra en sí mismo.

El actualizador que se ejecuta, instala su carga en el directorio de instalación y reinicia el (esperemos actualizado) de la aplicación.

Todavía:El proceso es peludo y mejor que lo piensen dos veces antes de implementar una Actualización Automática de funcionalidad en la Plataforma de Windows cuando la aplicación tiene un enfoque amplio de uso.

en php, la cosa es fácil:

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

si el curso se podría extender esto para la versión actualmente disponible no está codificada dentro de la secuencia de comandos, pero esto es sólo acerca de ilustrar el punto.

En su solicitud, usted tendría esta pseudo código:

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

Siéntase libre de extender el "protocolo" especificando algo del script de PHP podría volver a decirle al cliente que si se trata de una importante actualización obligatoria o no.

O usted puede añadir un poco de texto para mostrar al usuario - tal vez contienen alguna información sobre lo que ha cambiado.

Sus posibilidades son bastante ilimitada.

Mi aplicación Qt sólo utiliza QHttp a leer de pequeño archivo XML fuera de mi sitio web que contiene la versión más reciente número.Si este es mayor que el número de versión actual ofrece la opción para ir a la página de descarga.Muy simple.Funciona bien.

Estoy de acuerdo con @Martin y @Pilif la respuesta, pero añadir;

Considerar la posibilidad de permitir a sus usuarios finales para decidir si quieren instalar la actualización allí y entonces, o la demora de la instalación de la actualización hasta que haya terminado de usar el programa.

No sé la finalidad o la función de su aplicación, pero hay muchas aplicaciones que se inician cuando el usuario necesita para hacer algo específico, allí y entonces nada más molesto que el lanzamiento de una aplicación y, a continuación, se dijo que se ha encontrado a una nueva versión, y tener que esperar a que se descargue, cierre la aplicación y vuelva a iniciar en sí.Si su programa tiene otros recursos que podrían ser actualizado (archivos de referencia, bases de datos, etc) de que el problema empeore.

Tuvimos una EPOPEYA del sistema que se ejecuta en alrededor de 400 tiendas, y en un principio pensamos que sería genial tener el programa spot y descargar las actualizaciones (usando un archivo que contiene un número de versión muy similar a las sugerencias de arriba)...gran idea.Hasta que todas las tiendas inició sus sistemas a la misma hora (8:45 y 8:50am), y nuestro servidor fue golpeado servir a un 20 Mb de descarga a 400 servidores remotos, que, a continuación, actualizar el software local y producir un reinicio.Caos - con nadie capaz de operar durante unos 10 minutos.

No hace falta decir que esto nos causó posteriormente apagar el 'buscar actualizaciones' característica y rediseño para permitir a las tiendas a 'delay' la actualización hasta más tarde en el día.:-)

EDITAR:Y si alguien de ADOBE es la lectura - por el amor de dios, ¿por qué el maldito acrobat reader insisten en tratar de descargar las actualizaciones y la mierda cuando yo sólo quiero fuego-it-up para leer un documento?¿No es lo suficientemente lento en el arranque, y la hinchada lo suficiente, tal y como es, sin gastar más de 20-30 segundos de mi vida en busca de actualizaciones cada vez que quiero leer un PDF?
NO UTILIZAN SU PROPIO SOFTWARE??!!! :-)

En el servidor sólo podría haber un archivo simple "latestversion.txt" que contiene el número de versión (y tal vez de la URL de descarga) de la última versión.A continuación, el cliente sólo necesita leer este archivo usando una simple petición HTTP (sí, para el puerto 80) para recuperar http://your.web.site/latestversion.txt, que luego se puede analizar para obtener el número de versión.De esta manera usted no necesita ninguna fantasía de código de servidor --- sólo tiene que añadir un simple archivo a su sitio web existente.

si usted mantenga sus archivos en el directorio de la actualización de example.com este script PHP debe descargarlos para ti teniendo en cuenta la solicitud de los anteriormente mencionados.(su actualización se yourprogram.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");

Esto hace que su navegador web creo que es la descarga de una aplicación.

La forma más sencilla de hacer que esto suceda es el fuego de una petición HTTP el uso de una biblioteca como libcurl y hacer es descargar un ini o un archivo xml que contiene la versión en línea y donde una nueva versión estaría disponible en línea.

Después de analizar el archivo xml se puede determinar si una nueva versión que es necesario y descargar la nueva versión con libcurl e instalarlo.

Acaba de poner una (XML) archivo en su servidor con el número de versión de la versión más reciente, y una URL para la descarga la nueva versión de.Su aplicación puede entonces solicitar el archivo XML, mira si la versión difiere de su propio, y tomar medidas en consecuencia.

Creo que simple archivo XML en el servidor sería suficiente para la comprobación de la versión sólo a los efectos.

Sería necesario, a continuación, sólo una cuenta ftp en el servidor y el sistema de generación que es capaz de enviar un archivo a través de ftp después de que se ha construido una nueva versión.Que el sistema de generación podría incluso poner los archivos de instalación/código postal en su sitio web directamente!!!

Si desea mantener realmente básico, basta con subir un version.txt a un servidor web, que contiene un número entero número de versión.Descargar que comprobar en contra de la última version.txt descargado y, a continuación, sólo tiene que descargar el archivo msi o paquete de instalación y ejecutarlo.

Versiones más avanzadas sería el uso de rss, xml o similar.Sería mejor utilizar una librería de terceros para analizar el rss y podría incluir la información que se muestra al usuario acerca de los cambios si lo desea.

Básicamente, usted sólo necesita simple funcionalidad de descarga.

Tanto estas soluciones sólo tendrá que acceder a el puerto 80 saliente desde el lado del cliente.Esto se debe normalmente no requiere cambios en los firewalls de la red o (en el lado del cliente) y basta con disponer de una conexión a internet servidor web (web hosting, alojamiento o su propio servidor - todo el trabajo aquí).

Hay un par de comerciales de actualización automática de las soluciones disponibles.Voy a dejar las recomendaciones para aquellos a los demás ms responden, porque sólo tengo experiencia en el .net lado con hacer Clic una Vez y Aplicación de actualización de Bloque (el último es no continuó más).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top