Na última parte do artigo, a última configuração que deve ser feita dentro do projeto, é que dentro da pasta src, você deve criar um arquivo chamado update-config.xml. Esse arquivo irá conter as informações de como o processo de atualização deve se comportar.
1 2 3 4 5 6 7 8 9 10 11 12 | <configuration xmlns="http://ns.adobe.com/air/framework/update/configuration/1.0"> <url>http://www.seusite.com.br/air/update-config.xml</url> <delay>1</delay> <defaultUI> <dialog name="checkForUpdate" visible="true" /> <dialog name="downloadUpdate" visible="true" /> <dialog name="downloadProgress" visible="true" /> <dialog name="installUpdate" visible="true" /> <dialog name="fileUpdate" visible="true" /> <dialog name="unexpectedError" visible="true" /> </defaultUI> </configuration> |
Todas as opções foram marcadas como true, para que você possa acompanhar todas as etapas do processo.
A partir deste momento, o trabalho fica todo por conta do Flex. Não há mais necessidade de você se preocupar com nada. Ele será responsável por fazer a verificação, sugerir ou não o download, e caso o usuário opte por baixar a aplicação, ainda irá sou salva-lá em seu HD, ou atualizar automaticamente a aplicação. Fácil não é?
Mas como ele sabe que existe uma nova versão para ser baixada?
Através de um arquivo XML que deverá ser publicado no servidor na mesma URL foi informada na propriedade URL do objeto autoUpdater.
Vamos dar uma conferida em como deve ser esse XML para que o autoUpdater possa fazer as verificações necessárias.
1 2 3 4 5 6 7 8 9 | <?xml version="1.0" encoding="utf-8"?> <update xmlns="http://ns.adobe.com/air/framework/update/description/1.0"> <version>1.1</version> <url>http://www.seusite.com.br/air/AIRAutoUpdate1-1.air</url> <description><![CDATA[ v1.1 * Adicionado novos feeds para leitura ]]></description> </update> |
Simples não é? Poucas informações são necessárias para que a atualização ocorra. Você deve informar apenas a versão da aplicação que deverá ser atualizada. Ou seja, minha primeira compilação da primeira versão do projeto era 1.0, a próxima versão, ela foi compilada como 1.1, então é essa versão que eu devo passar para o update-config.xml.
Depois, devo informar a URL que está o arquivo que deverá ser feito o download para a atualização. E por ultimo, posso descrever quais foram as alterações na versão que geraram a nova atualização.
Dessa forma, quando iniciarmos a aplicação, o aplicativo irá ler esse XML, verificará que existe uma nova versão disponível, e irá inicializar o processo de atualização.
De uma forma simples assim, você não precisará mais se preocupar com atualizadores ou em informar seu cliente que existe uma nova versão para o sistema. Deixe o AIR trabalhar um pouco por você!
Com os códigos informados acima, temos a primeira versão do sistema completa, exceto o XML de atualização, que só deve ser publicado quando houver uma nova versão. Abaixo, seguem os fontes para a versão 1.1 do projeto. Esses sem comentários adicionais, já que o intuito do artigo era apenas explicar como é feita a atualização de forma automática em aplicações em AIR.
AIRAutoUpdate-app.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?xml version="1.0" encoding="UTF-8"?> <application xmlns="http://ns.adobe.com/air/application/1.5"> <id>AIRAutoUpdate</id> <version>1.1</version> <filename>AIRAutoUpdate</filename> <name>AIRAutoUpdate - Tutorial IMasters</name> <installFolder>Horochovec/AIR/AIRAutoUpdate</installFolder> <programMenuFolder>Horochovec/AIR/AIRAutoUpdate</programMenuFolder> <description>Exemplo de app que faz sua atualização automática</description> <copyright>Stefan Horochovec (stefan@horochovec.com.br)</copyright> <initialWindow> <title>AIRAutoUpdate</title> <content>AIRAutoUpdate.swf</content> <systemChrome>none</systemChrome> <transparent>true</transparent> <visible>true</visible> <minimizable>true</minimizable> <maximizable>false</maximizable> <resizable>false</resizable> </initialWindow> </application> |
Posts.mxml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | <?xml version="1.0" encoding="utf-8"?> <mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="500" height="250" showCloseButton="true" creationComplete="creationCompleteHandler(event);" close="onCloseHandler(event);" title="Feeds Imasters - Seção Flex"> <mx:Script> <![CDATA[ import flash.desktop.NativeApplication; import mx.events.CloseEvent; import mx.events.FlexEvent; import mx.rpc.events.ResultEvent; /** * Dataprovider do grid */ private var xmlList : XMLList; /** * Evento disparado na finalização da construção do componente * Responsavel por iniciar o HTTPService para leitura do feed */ private function creationCompleteHandler(event:FlexEvent) : void { this.service.send(); } /** * Evento disparado no termino com sucesso da leitura do HTTPService * Responsavel por adicionar ao grid o dataProvider */ private function serviceHandler(event:ResultEvent) : void { var result : XML = new XML(event.result); xmlList = result..item; this.grid.dataProvider = xmlList; } /** * Evento disparado no fechar da TitleWindow, ele é responsável por fechar a aplicação */ private function onCloseHandler(event:CloseEvent) : void { NativeApplication.nativeApplication.exit(); } /** * Quando ocorrer um click no grid, o botao para abrir o link do post * sera habilitado, e coloca os textos para os componentes do autor * e descrição do post */ private function onClickGridHandler(event:MouseEvent) : void { this.btnLink.visible = true; this.autor.text = ((this.grid.selectedItem) as Object)['author']; this.descricao.text = ((this.grid.selectedItem) as Object)['description']; } /** * Click do botao para visualizar o artigo */ private function onBtnLinkClickHandler(event:MouseEvent) : void { navigateToURL(new URLRequest(((this.grid.selectedItem) as Object)['guid'].toString()), "_blank"); } ]]> </mx:Script> <mx:HTTPService id="service" url="http://imasters.uol.com.br/feed/secao/flex" showBusyCursor="true" resultFormat="e4x" result="serviceHandler(event)"/> <mx:VBox bottom="5" left="5" right="5" top="5"> <mx:AdvancedDataGrid id="grid" designViewDataType="flat" bottom="5" left="5" right="5" top="5" height="50%" width="100%" click="onClickGridHandler(event);"> <mx:columns> <mx:AdvancedDataGridColumn headerText="Titulo do artigo" dataField="title"/> </mx:columns> </mx:AdvancedDataGrid> <mx:Canvas height="50%" width="100%" borderColor="#DADADA" borderStyle="solid"> <mx:Label x="6" y="6" id="autor" fontWeight="bold"/> <mx:TextArea height="53" id="descricao" bottom="6" left="6" right="6" borderStyle="none" selectable="false" mouseFocusEnabled="false" mouseEnabled="false"/> <mx:LinkButton x="383" y="4" label="Ler artigo" visible="false" id="btnLink" click="onBtnLinkClickHandler(event);"/> </mx:Canvas> </mx:VBox> </mx:TitleWindow> |
Espero ter ficado claro o processo de atualização automática no AIR.
Abraços a todos.


Cara, esta forma de dispor o código assim estreito… tá de brincadeira né? Pouco prático.
Ola Iuri.
Não sei se entendi seu comentario, mas parece ser com relação ao comprimento do Box contendo códigos fontes.
Bom, o layout que eu utilizo no wordpress sugere essa largura para o texto, então vou seguir o layout.
Voce pode muito bem copiar o texto e por em seu FlexBuilder, e analisar por lá, acredito que já é de grande valia eu postar exemplos práticos de como devem ser feitas as implementações.
Obrigado por visitar o blog e de qualquer forma, por comentar.
Stefan Horochovec, parabéns cara !!! pelo tutorial, acompanhei também o seu do flex mania, vc manda muito bem. É que as vezes as pessoas só veêm os espinhos sacô !!
é isso ai, continue assim.
Obrigado Leonardo pelo comentário e por visitar meu blog. Espero ter contribuido em algo
Abraços
Olá,
O tutorial ficou muito bom, parabéns.
Mas não estou conseguindo usar no meu aplicativo AIR,
quando ele vai atualizar dá o erro 16815.
Na documentação está assim:
16815 Descritor de atualização inválido (versão do descritor desconhecida).
Tentei procurar e não consegui achar o erro.
Tem idéia do que seja ?
Abraços
Stefan, show de bola o tutorial, parabens, só tenho uma duvida, tem algum jeito de, quando haver uma nova versão, só deixar continuar se ele instalar a nova versão?
Abraços.
Ola Stefan,
Sou novato na area e segui o seu tutorial mas da um erro na linha 89 do AIRAutoUpdate.mxml () com o erro:
-1046: Type was not found or was not a compile-time constant: Posts.
poderia me ajudar?
Obrigado desde ja…
Stefan, consegui encontrar o erro… eu havia colocado o pacote br.com…view… fora do pacote src.
Agora esta rodando.
Obrigado pelo post.