AIR beta 3 Update

Publié le 17 décembre 2007 par Stef1

L’update d’une application AIR est une de ces fonctionnalités bien pratique, et elle n’échappe pas à la vague de modifications apporté par la beta 3.

Cette classe est une évolution de la classe updateManager de Rich Tretola, elle intègre les changements apporté par la beta 3

  1.                 var appXml:XML = NativeApplication.nativeApplication.applicationDescriptor;
  2.                 var ns:Namespace = appXml.namespace();
  3.                 var  appId:String = appXml.ns::id[0];
  4.                 appVersion = appXml.ns::version[0];
  5.                 var appName:String = appXml.ns::filename[0];

On voit que maintenant la lecture du fichier application est intégrée dans AIR

  1. package com.mykii.utils
  2. {
  3.    import flash.desktop.NativeApplication;
  4.    import flash.desktop.Updater;
  5.    import flash.events.Event;
  6.    import flash.filesystem.File;
  7.    import flash.filesystem.FileMode;
  8.    import flash.filesystem.FileStream;
  9.    import flash.net.URLRequest;
  10.    import flash.net.URLStream;
  11.    import flash.utils.ByteArray;
  12.    import mx.controls.Alert;
  13.    import mx.events.CloseEvent;
  14.    import mx.rpc.events.ResultEvent;
  15.    import mx.rpc.http.HTTPService;
  16.    public class UpdateManager {
  17.            private var _constanteApplicationName:String;
  18.        public var versionURL:String;
  19.        private var version:XML;
  20.        private var urlStream:URLStream = new URLStream();
  21.        private var fileData:ByteArray = new ByteArray();
  22.            [Bindable] private var _currentVersion:String;
  23.        [Bindable] private var appVersion:String;
  24.        /*
  25.        constructor
  26.        */
  27.        public function UpdateManager(versionURL:String):void{
  28.           this.versionURL = versionURL;
  29.        }
  30.        /*
  31.        load the application.xml file
  32.        */
  33.        public function loadApplicationFile():void{
  34.                 var appXml:XML = NativeApplication.nativeApplication.applicationDescriptor;
  35.                         var ns:Namespace = appXml.namespace();
  36.                         var  appId:String = appXml.ns::id[0];
  37.                          appVersion = appXml.ns::version[0];
  38.                          var appName:String = appXml.ns::filename[0];
  39.                         loadRemoteFile();
  40.        }
  41.        /*
  42.        load a remote xml file to check for new version
  43.        */
  44.        private function loadRemoteFile():void{
  45.            var http:HTTPService = new HTTPService();
  46.            http.url = versionURL;
  47.            http.useProxy=false;
  48.            http.method = "GET";
  49.            http.resultFormat="xml";
  50.            http.send();
  51.            http.addEventListener(ResultEvent.RESULT,testVersion2);
  52.        }
  53.        /*
  54.        check to see if an update exists and either
  55.        force the update or give the user the option
  56.        */
  57.        private function testVersion2(event:ResultEvent):void{
  58.           version = XML(event.result);
  59.            if((appVersion != version.@version) && version.@forceUpdate == true){
  60.                getUpdate();
  61.            }else if(appVersion != version.@version){
  62.                Alert.show("Il y a une mise à jour disponible,\nVoulez vous la télécharger maintenant? \n\nDetails:\n" +
  63.                version.@message, "Choissisez Oui ou Non", 3, null, alertClickHandler);
  64.            } else {
  65.             trace("There are no new updates available");
  66.            }
  67.        }
  68.        /*
  69.        if user wants update, call getUpdate()
  70.              */
  71.        private function alertClickHandler(event:CloseEvent):void {
  72.            if (event.detail==Alert.YES){
  73.                getUpdate();
  74.            }
  75.        }
  76.        /*
  77.        download the new AIR installer file
  78.             */
  79.        private function getUpdate():void{
  80.            var urlReq:URLRequest=new URLRequest(version.@downloadLocation);
  81.            urlStream.addEventListener(Event.COMPLETE, loaded);
  82.            urlStream.load(urlReq);
  83.        }
  84.        /*
  85.        read the new AIR file
  86.              */
  87.        private function loaded(event:Event):void {
  88.            urlStream.readBytes(fileData, 0, urlStream.bytesAvailable);
  89.            writeAirFile();
  90.        }
  91.        /*
  92.        write the new AIR installer to disk
  93.              */
  94.        private function writeAirFile():void {
  95.            var file:File = File.applicationStorageDirectory.resolvePath(_constanteApplicationName);
  96.            var fileStream:FileStream = new FileStream();
  97.                fileStream.addEventListener(Event.CLOSE, fileClosed);
  98.                fileStream.openAsync(file, FileMode.WRITE);
  99.                fileStream.writeBytes(fileData, 0, fileData.length);
  100.                fileStream.close();
  101.        }
  102.        /* close the FileStream and use the
  103.        Updater class to update the application
  104.        */
  105.        private function fileClosed(event:Event):void {
  106.            var updater:Updater = new Updater();
  107.            var airFile:File = File.applicationStorageDirectory.resolvePath(_constanteApplicationName);
  108.            updater.update(airFile,version.@version);
  109.        }
  110.                 /*
  111.                  Setter for the name of the AIR file
  112.                 */
  113.                 public function set constanteApplicationName(value:String):void{
  114.                         _constanteApplicationName = value;
  115.                 }
  116.    }
  117. }

Le fichier distant se présente sous cette forme

  1. <?xml version="1.0"  encoding="ISO-8859-1"?>
  2. <currentVersion version="0.220"
  3. downloadLocation="http://www.mykii.eu/AIR/KIISB/KIISB.air"
  4. forceUpdate="false"
  5. message="Passage en beta 3"/>