04.04.08
Actualizar aplicaciones AIR automáticamente
Hola a todos. Recientemente me he visto en la necesidad de realizar una aplicacion AIR que detectase si hay una nueva versión en el servidor y se actualice automáticamente (algo que por otro lado resulta muy útil). Como es algo que me ha llevado más tiempo de lo que me esperaba, he creído conveniente hablar de ello.
Para hacer que nuestra aplicación compruebe si es la versión más reciente, no hay más que seguir los siguientes pasos:
1.- Comprobar que la aplicación en ejecución es la más reciente: Aquí los de Adobe nos han dejado esto un poco a nuestra elección. Es decir, no hay manera de comprobar la versión de un archivo .air (sí que podemos obtener la versión de la aplicación en ejecución), por lo que el sistema está dentro de la imaginación de cada uno. Yo en mi caso esto lo he hecho dejando un archivo muy simple xml en el servidor de la siguiente manera:
<version>X.X</version>
Desde la aplicación hago una llamada a la URL donde se encuentra este archivo, obtengo el valor de la etiqueta version, y la comparo con la versión de la aplicación en ejecución. Para obtener la versión de la aplicación no hay más que utilizar estas tres líneas:
1 2 3 | var appXML:XML = NativeApplication.nativeApplication.applicationDescriptor; var air:Namespace = appXML.namespaceDeclarations()[0]; var version:String = appXML.air::version; |
Para obtener la versión del servidor utilizaremos el siguiente código:
1 2 3 4 5 6 7 8 9 10 11 12 | var loader:URLLoader = new URLLoader; loader.load(new URLRequest("url archivo version.xml")); private function resultEvent(event:Event):void{ var loader:URLLoader = event.currentTarget as URLLoader; versionServidor = new XML(loader.data).toString(); if(versionServidor != version){ versionMasReciente = false; }else{ versionMasReciente = true; } } |
Si las versiones de la aplicación y del servidor son diferentes, supondremos que en el servidor hay una versión más actual. Esto lo he hecho yo así, cada uno puede hacer el mecanismo que prefiera.
2.- Descargar la versión del servidor: El siguiente paso es descargar la versión del instalable de la aplicación que hay en el servidor. Esto se hace de la siguiente manera:
1 2 3 4 5 | var request:URLRequest = new URLRequest("url archivo instalable .air"); var urlStream:URLStream = new URLStream(); var instalableBinario:ByteArray = new ByteArray(); urlStream.addEventListener( Event.COMPLETE, manejadorEvento); urlStream.load(request); |
3.- Una vez descargado el instalable hay que almacenarlo en un fichero local. Esto por ejemplo puede hacerse guardando dicho archivo en el escritorio. Una vez se haya actualizado la aplicación podremos borrarlo si queremos. Para escribir el instalable el disco, dentro de la función de manejador del evento COMPLETE del paso anterior realizaremos dicha acción:
1 2 3 4 5 6 7 8 9 10 | //Guardamos el instalable en binario en el escritorio urlStream.readBytes(instalableBinario, 0, urlStream.bytesAvailable ); var instalable:File = File.desktopDirectory.resolvePath("AIRUpdate.air"); // Escritura del archivo var fileStream:FileStream = new FileStream(); fileStream.addEventListener(Event.CLOSE, actualizaAplicacion); fileStream.openAsync(instalable, FileMode.WRITE); fileStream.writeBytes(instalableBinario, 0, instalableBinario.length); fileStream.close(); |
4.- Una vez hayamos terminado de escribir el fichero, se cierra el fileStream. Como hemos añadido un manejador para el evento close de dicho fileStream, dentro de ese manejador llamaremos a la función que actualiza la aplicación, así tenemos todo correctamente encadenado:
1 2 | var updater:Updater = new Updater(); updater.update(instalable, versionServidor); |
Al llamar a esta función, la aplicación directamente se reinstalará y comenzará a ejecutarse ya con la nueva versión instalada.
Como un ejemplo vale más que mil explicaciones aquí dejo un ejemplo con todo el código anterior y el instalable de dicho ejemplo. Si bajáis directamente el instalable y lo ejecutáis, se descargará otra versión del mismo programa que tengo en el servidor y podréis ver como la versión es diferente.
Espero que sirva de ayuda. Si hay alguna duda me mandáis un e-mail a antonio.serrano.guerrero@gmail.com. Un saludo!!
Jose Barragan said,
07.04.08 at 11:10
Muy buen articulo Antonio, veo que por fin pudiste resolver el entuerto ^^
Un saludo
Oscar Toro said,
21.10.08 at 21:56
Muchas gracias por el artículo y por los ejemplos. Empezaba a revisar material para agregar esta funcionalidad a una aplicación y, claramente, partir de cero habria sido bastante lento. De hecho estube unos dias peliando un poco con el tray icon para que mostrara el menú con el clic primario (o izquierdo); finalemnte lo conseguí (por si te interesa jeje).
Saludos.
camiloco said,
05.11.09 at 17:54
Cuando ejecuto tu aplicación, me resulta todo perfecto, pero al copiar tu codigo a mi aplicación me resulta el siguiente mensaje de error:
No se puede instalar la aplicación, este instalador no se ha configurado correctamente. Póngase en contacto con el autor de la aplicación para obtener ayuda.
Y el problema sale cuiando se ejecuta:
updater.update(instalable, versionServidor);
y no entiendo porque pasa esto!
Gracias
admin said,
05.11.09 at 22:27
Hola Calimoco. Esto ocurre cuando se intenta actualizar un aplicación que está firmada con un certificado con otra aplicación que esta firmada con otro certificado.
Es decir. Tu creas una aplicación y la firmas con un certificado al exportar el instalador, y luego haces un cambio en la aplicación pero la firmas con otro certificado, al intentar actualizar la primera con la segunda aparece ese error.
No se si me he explicado del todo
Un saludo!
camiloco said,
13.11.09 at 1:40
Gracias Antonio por tu explicación.
Lo entendi perfectamente, pero estoy 100% seguro que exporto ambas versiones de la aplicación con la misma firma. De hecho si yo ejecuto el archivo que se descargar en el proceso de la actualización, se instala correctamente.
Le he dado mis vueltas al problema, pero aún no encuentro solución. Además que como el mensaje de error no especifica un error en concreto, es dificil encontrar una solución.
Gracias de todas manera..
Saludos!!!
PD: Tu blog me ha servido mucho para desarrollar aplicaciones Air.
camiloco said,
13.11.09 at 2:03
Antonio..
Buenas nuevas porfin descubri el error de mi aplicación. Era que yo exportaba mi aplicación actualizada con el numero de versión igual al original.
Me explico…
en el xml en:
2
Exportaba tanto la aplicación original como la actualización con el mismo numero de versión y es por eso que me tiraba ese error.
Saludos!!!
ivan said,
15.01.10 at 19:58
hola a todos yo estoy haciendo lo mismo y me sucede lo siguiente.
Cuando en codigo hago el upgrade me manda un error:
“No se puede instalar la aplicación, este instalador no se ha configurado correctamente. Póngase en contacto con el autor de la aplicación para obtener ayuda.”
Pero si ejecuto el archivo descargado si me sale que remplace por la version 1 a version 2
Alguien sabe que puede ser?
matu said,
17.08.10 at 22:21
muy bueno el tuto, me sirvio de mucha ayuda, lo que quisiera hacer es agregar un changelog para ver detalles de la nueva version a travez del archivo de la version.xml que esta subido remotamente al servidor…