c++ - sirve - Comprobación automática de una nueva versión de mi aplicación
programa para crear aplicaciones android (12)
Al tratar de cumplir con una solicitud de funciones de nuestros clientes, me gustaría que mi aplicación, cuando Internet esté disponible, verifique en nuestro sitio web si hay una nueva versión disponible.
El problema es que no tengo idea de lo que debe hacerse en el lado del servidor.
Puedo imaginar que mi aplicación (desarrollada en C ++ usando Qt) tiene que enviar una solicitud (¿HTTP?) Al servidor, pero ¿qué va a responder a esta solicitud? Para atravesar los firewalls, ¿tendré que usar el puerto 80? Es esto correcto ?
O, para tal característica, ¿tengo que pedirle a nuestro administrador de red que abra un número de puerto específico a través del cual me comunicaré?
@ pilif : gracias por tu respuesta detallada. Todavía hay algo que no está claro para mí:
me gusta
http://www.example.com/update?version=1.2.4
Luego puede devolver lo que quiera, probablemente también la URL de descarga del instalador de la nueva versión.
¿Cómo devuelvo algo? ¿Será una página php o asp (no sé nada de PHP ni ASP, tengo que confesar)? ¿Cómo puedo decodificar la parte ?version=1.2.4
para devolver algo en consecuencia?
Creo que ese simple archivo XML en el servidor sería suficiente para verificar la versión solo con fines.
Necesitaría entonces solo una cuenta ftp en su servidor y un sistema de compilación que pueda enviar un archivo a través de ftp después de que haya creado una nueva versión. ¡Ese sistema de compilación podría incluso incluir archivos de instalación / zip en su sitio web directamente!
En el servidor, puede tener un archivo simple "latestversion.txt" que contiene el número de versión (y quizás la URL de descarga) de la última versión. El cliente solo necesita leer este archivo usando una simple solicitud HTTP (sí, al puerto 80) para recuperar http://your.web.site/latestversion.txt , que luego puede analizar para obtener el número de versión. De esta forma, no necesita ningún código de servidor elegante, solo necesita agregar un archivo simple a su sitio web existente.
Estoy de acuerdo con la respuesta de @Martin y @ Pilif, pero agrego;
Considere la posibilidad de permitir que los usuarios finales decidan si realmente desean instalar la actualización en ese momento y luego, o retrasar la instalación de la actualización hasta que hayan terminado de usar el programa.
No conozco el propósito / función de su aplicación, pero muchas aplicaciones se inician cuando el usuario necesita hacer algo específico allí; nada más molesto que iniciar una aplicación y que le digan que se encontró una nueva versión, y que tiene que espere a que se descargue, apague la aplicación y reinícielo. Si su programa tiene otros recursos que podrían actualizarse (archivos de referencia, bases de datos, etc.), el problema empeora.
Teníamos un sistema EPOS funcionando en unas 400 tiendas, y al principio pensamos que sería genial tener las actualizaciones del programa y descargarlas (usando un archivo que contiene un número de versión muy similar a las sugerencias que tienes arriba) ... gran idea . Hasta que todas las tiendas pusieron en marcha sus sistemas más o menos al mismo tiempo (8:45 a 8:50 a.m.), y nuestro servidor recibió una descarga de más de 20 Mb a 400 servidores remotos, que luego actualizarían el software local y causarían un reiniciar. Caos: sin nadie capaz de comerciar durante unos 10 minutos.
Huelga decir que esto nos hizo desactivar posteriormente la función ''verificar actualizaciones'' y rediseñarla para permitir a las tiendas ''retrasar'' la actualización hasta más tarde en el día. :-)
EDITAR: Y si alguien de ADOBE está leyendo, por el amor de Dios, ¿por qué el maldito lector de acrobat insiste en intentar descargar actualizaciones y basura cuando solo quiero encender un documento para leer? ¿No es lo suficientemente lento para comenzar, y lo suficientemente hinchado como está, sin desperdiciar 20-30 segundos más de mi vida buscando actualizaciones cada vez que quiero leer un PDF?
NO UTILIZAN SU PROPIO SOFTWARE ?? :-)
La forma más sencilla de hacerlo es lanzar una solicitud HTTP utilizando una biblioteca como libcurl y hacer que descargue un archivo ini o xml que contenga la versión en línea y una nueva versión disponible en línea.
Después de analizar el archivo xml, puede determinar si se necesita una nueva versión y descargar la nueva versión con libcurl e instalarlo.
La respuesta de Pilif fue buena, y tengo mucha experiencia con esto también, pero me gustaría agregar algo más:
Recuerde que si inicia yourapp.exe, el "actualizador" intentará sobrescribir yourapp.exe con la versión más reciente. Dependiendo de su sistema operativo y entorno de programación (ha mencionado C ++ / QT, no tengo experiencia con ellos), no podrá sobrescribir yourapp.exe porque estará en uso.
Lo que hice fue crear un lanzador. Tengo un MyAppLauncher.exe que usa un archivo de configuración (xml, muy simple) para ejecutar el "exe real". Si existe una nueva versión, el Iniciador puede actualizar el "exe real" porque no está en uso, y luego reiniciar la nueva versión.
Solo tenlo en cuenta y estarás a salvo.
Martín,
tienes toda la razón, por supuesto. Pero entregaría el iniciador con el instalador. O simplemente descargue el instalador, ejecútelo y renuncie a mí mismo lo antes posible. La razón son errores en el iniciador. Nunca, nunca, querrá depender de un componente que no puede actualizar (u olvida incluir en el lanzamiento inicial).
Entonces la carga útil que distribuyo con el proceso de actualización de mi aplicación es solo el instalador estándar, pero sin ninguna IU significativa. Una vez que el cliente ha verificado que el instalador tiene una posibilidad de ejecución exitosa y una vez que ha descargado el actualizador, lo ejecuta y se cierra.
El actualizador que se ejecuta, instala su carga en el directorio de instalación original y reinicia la aplicación (con suerte actualizada).
Aún así: el proceso es peliagudo y será mejor que lo piense dos veces antes de implementar una funcionalidad de Actualización automática en la plataforma de Windows cuando su aplicación tenga un amplio enfoque de uso.
Mi aplicación Qt solo usa QHttp para leer el pequeño archivo XML de mi sitio web que contiene el último número de versión. Si es mayor que el número de versión actual, le da la opción de ir a la página de descarga. Muy simple. Funciona bien.
Recomiendo absolutamente simplemente hacer una solicitud HTTP simple a su sitio web. Todo lo demás está destinado a fallar.
Haría una solicitud HTTP GET a una determinada página en su sitio que contiene la versión de la aplicación local.
me gusta
http://www.example.com/update?version=1.2.4
Luego puede devolver lo que quiera, probablemente también la URL de descarga del instalador de la nueva versión.
¿Por qué no simplemente colocar un archivo estático con la última versión en el servidor y dejar que el cliente decida? Porque puede querer (o necesitar) tener control sobre el proceso. Quizás 1.2 no sea compatible con el servidor en el futuro, por lo que desea que el servidor fuerce la actualización a 1.3, pero la actualización de 1.2.4 a 1.2.6 podría ser acrítica, por lo que es posible que desee presentarle al cliente una actualización opcional.
O desea tener un desglose de la base instalada.
O lo que sea. Generalmente, he aprendido que es mejor mantener tanta inteligencia en el servidor, porque el servidor es sobre lo que tienes el control final.
Hablando aquí con un poco de experiencia en el campo, aquí hay un pequeño adelanto de lo que puede (y lo hará, confiar en mí) ir mal:
- Su aplicación no podrá realizar solicitudes HTTP a través de las distintas aplicaciones de Personal Firewall.
- Un porcentaje considerable de usuarios no tendrá los permisos necesarios para realmente poner en marcha el proceso de actualización.
- Incluso si los usuarios permitieron que la versión anterior superara su firewall personal, dicha herramienta se quejará porque el .EXE ha cambiado y recomendará al usuario no permitir que el nuevo exe se conecte (los usuarios suelen cumplir con los deseos de su herramienta de seguridad) .
- En entornos administrados, se le filmará y colgará (no necesariamente en ese orden) para cargar contenido ejecutable desde la web y luego ejecutarlo.
Para mantener el daño lo más bajo posible,
- fallar silenciosamente cuando no puede conectarse al servidor de actualización
- Antes de actualizar, asegúrese de tener permiso de escritura en el directorio de instalación y advertir al usuario si no lo hace, o simplemente no actualizar en absoluto.
- Proporcione una forma para que los administradores desactiven la actualización automática.
No es divertido hacer lo que está a punto de hacer, especialmente cuando se trata de usuarios no técnicamente inclinados como lo había hecho en numerosas ocasiones.
Si desea mantenerlo realmente básico, simplemente suba un archivo version.txt a un servidor web, que contiene un número de versión entero. Descargue esa verificación con la última versión.txt que descargó y luego simplemente descargue el msi o paquete de instalación y ejecútelo.
Las versiones más avanzadas serían usar rss, xml o similar. Sería mejor utilizar una biblioteca de terceros para analizar el rss y podría incluir información que se muestra a su usuario sobre los cambios si así lo desea.
Básicamente, solo necesitas una funcionalidad de descarga simple.
Ambas soluciones solo requerirán que acceda al puerto 80 saliente desde el lado del cliente. Normalmente, esto no debería requerir ningún cambio en los cortafuegos o las redes (en el lado del cliente) y simplemente necesita tener un servidor web orientado a Internet (alojamiento web, colocación o su propio servidor; todo funcionaría aquí).
Hay un par de soluciones comerciales de actualización automática disponibles. Dejaré las recomendaciones para aquellos que responden, porque solo tengo experiencia en el lado .net con Click-Once y Bloque de aplicación de actualización (este último ya no se continúa).
Simplemente coloque un archivo (XML) en su servidor con el número de versión de la versión más reciente y una URL desde donde descargar la nueva versión. Su aplicación puede solicitar el archivo XML, ver si la versión es diferente de la suya y tomar las medidas correspondientes.
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";
}
?>
por supuesto, podría ampliar esto para que la versión disponible actualmente no esté codificada de forma rígida dentro del script, pero esto es solo para ilustrar el punto.
En tu aplicación tendrías este 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 que el script PHP podría devolver para decirle al cliente si es una actualización importante y obligatoria o no.
O puede agregar algo de texto para mostrar al usuario, que quizás contenga información sobre lo que ha cambiado.
Tus posibilidades son bastante ilimitadas.
si mantiene sus archivos en el directorio de actualización en example.com, este script PHP debe descargarlos para usted dada la solicitud mencionada anteriormente. (su actualización sería su programa.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 piense que está descargando una aplicación.