04.04.08

Actualizar aplicaciones AIR automáticamente

Posted in air at 20:40

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!!