Aktualizowanie aplikacji AIR
Użytkownicy mogą instalować lub aktualizować aplikację AIR, klikając dwukrotnie plik AIR na komputerze lub używając przeglądarki (funkcji instalacji bezproblemowej). Instalator środowiska Adobe® AIR® zarządza procesem instalacji i ostrzega użytkownika, jeśli ma nastąpić aktualizacja już zainstalowanej aplikacji. Można jednak również spowodować, że zainstalowana aplikacja będzie samoczynnie aktualizować się do nowej wersji. W mechanizmie tym korzysta się z klasy Updater. (Zainstalowana aplikacja może wykryć dostępność nowej wersji do pobrania i zainstalowania). Klasa Updater zawiera metodę update(), która umożliwia wskazanie pliku AIR na komputerze użytkownika i zaktualizowanie aplikacji do wersji zawartej w pliku. Aby można było korzystać z klasy Updater, aplikacja musi być umieszczona w pakiecie będącym plikiem AIR. Aplikacje umieszczone w macierzystych pakietach wykonywalnych lub w innych pakietach macierzystych powinny używać funkcji aktualizowania udostępnianych przez platformę macierzystą. Zarówno identyfikator aplikacji, jak i identyfikator wydawcy pliku z aktualizacją muszą być identyczne z odpowiednimi identyfikatorami aktualizowanej aplikacji. Identyfikator wydawcy jest wyznaczany na podstawie certyfikatu podpisującego, co oznacza, że zarówno aktualizacja, jak i aktualizowana aplikacja muszą być podpisane tym samym certyfikatem. W środowisku AIR 1.5.3 i w późniejszych wersjach plik deskryptora aplikacji zawiera element <publisherID>. Ten element musi być używany, jeśli wersja aplikacji została utworzona w środowisku AIR 1.5.2 lub wcześniejszej wersji. Więcej informacji zawiera sekcja publisherID. W wersji AIR 1.1 i nowszych istnieje możliwość przeprowadzenia migracji aplikacji w taki sposób, aby używany był dla niej nowy certyfikat do podpisywania kodu. Migracja aplikacji do nowego certyfikatu wymaga podpisania pliku AIR aktualizacji zarówno nowym, jak i oryginalnym certyfikatem. Migracja do nowego certyfikatu jest procesem jednokierunkowym. Po migracji wyłącznie pliki AIR podpisane nowym certyfikatem będą rozpoznawane jako aktualizacje istniejącej instalacji. Zarządzanie aktualizowaniem aplikacji może być skomplikowanym zagadnieniem. Środowisko AIR 1.5 zawiera nową architekturę aktualizacji aplikacji AdobeAIR. Architektura ta obejmuje elementy interfejsu API pomagające programistom w tworzeniu sprawnych mechanizmów aktualizacji aplikacji AIR. Migracja certyfikatu umożliwia zmianę certyfikatu samopodpisanego na komercyjny certyfikat podpisujący kod, a także zmianę jednego certyfikatu samopodpisanego lub certyfikatu komercyjnego na inny. Jeśli migracja do nowego certyfikatu nie zostanie przeprowadzona, użytkownicy muszą usunąć swoje bieżące wersje aplikacji przed zainstalowaniem nowej wersji. Więcej informacji zawiera sekcja Zmiana certyfikatów. Dobrą metodą jest dołączenie mechanizmu aktualizowania do aplikacji. Jeśli zostanie utworzona nowa wersja aplikacji, mechanizm powiadomi użytkownika o możliwości zainstalowania nowej wersji. Instalator aplikacji AIR tworzy pliki dziennika podczas instalowania, aktualizowania oraz usuwania aplikacji AIR. Dzięki tym dziennikom można określić przyczyny problemów z instalowaniem. Więcej informacji zawiera artykuł Dzienniki instalacji. Uwaga: Nowe wersje środowiska wykonawczego Adobe AIR mogą zawierać zaktualizowane wersje pakietu WebKit. Zaktualizowana wersja pakietu WebKit może powodować nieoczekiwane zmiany treści HTML we wdrożonej aplikacji AIR. Te zmiany mogą powodować konieczność aktualizowania aplikacji. Mechanizm aktualizacji może informować użytkownika o nowej wersji aplikacji. Więcej informacji zawiera sekcja Informacje o środowisku HTML (dla programistów ActionScript) oraz sekcja Informacje o środowisku HTML (dla programistów HTML).
Informacje o aktualizowaniu aplikacjiKlasa Updater (w pakiecie flash.desktop) zawiera jedną metodę, update(), której można użyć w celu zaktualizowania obecnie uruchomionej aplikacji do innej wersji. Na przykład, jeśli użytkownik ma wersję pliku AIR ("Sample_App_v2.air") umieszczoną na pulpicie, poniższy kod zaktualizuje aplikację. Przykład w języku ActionScript: var updater:Updater = new Updater(); var airFile:File = File.desktopDirectory.resolvePath("Sample_App_v2.air"); var version:String = "2.01"; updater.update(airFile, version); Przykład w języku JavaScript: var updater = new air.Updater(); var airFile = air.File.desktopDirectory.resolvePath("Sample_App_v2.air"); var version = "2.01"; updater.update(airFile, version); Przed użyciem klasy Updater użytkownik lub aplikacja musi pobrać zaktualizowaną wersję pliku AIR do komputera. Więcej informacji zawiera sekcja Pobieranie pliku AIR na komputer użytkownika. Wyniki wywołania metody Updater.update()Gdy aplikacja w środowisku wykonawczym wywoła metodę update(), środowisko wykonawcze zamyka aplikację, a następnie próbuje zainstalować nową wersję z pliku AIR. Środowisko wykonawcze sprawdza, czy identyfikatory aplikacji i wydawcy określone w pliku AIR zgadzają się z identyfikatorami aplikacji i wydawcy aplikacji wywołującej metodę update(). (Informacje na temat identyfikatora aplikacji i wydawcy zawiera sekcja Pliki deskryptora aplikacji AIR). Środowisko sprawdza także, czy ciąg znaków wersji jest identyczny z ciągiem znaków version przekazanym do metody update(). Jeśli instalacja zakończy się pomyślnie, środowisko wykonawcze otwiera nową wersję aplikacji. W przeciwnym wypadku (jeśli nie było możliwe zakończenie instalacji), ponownie otwierana jest dotychczasowa (sprzed instalacji) wersja aplikacji. W celu zainstalowania zaktualizowanej wersji aplikacji w systemie Mac OS użytkownik musi mieć odpowiednie uprawnienia dostępu do zainstalowania w katalogu aplikacji. W systemach Windows i Linux użytkownik musi mieć uprawnienia administracyjne. Jeśli zaktualizowana wersja aplikacji wymaga zaktualizowanej wersji środowiska wykonawczego, instalowana jest nowa wersja tego środowiska. W celu zaktualizowania środowiska wykonawczego użytkownik musi posiadać uprawnienia administracyjne do komputera. Podczas testowania aplikacji przy użyciu środowiska ADL wywołanie metody update() powoduje wygenerowanie wyjątku w czasie wykonywania. Informacje o ciągu znaków wersjiCiąg znaków określony jako parametr version metody update() musi być zgodny z ciągiem znaków w elemencie version lub versionNumber w pliku deskryptora aplikacji dla pliku AIR przeznaczonego do zainstalowania. Określenie parametru version jest wymagane ze względów bezpieczeństwa. Sprawdzanie przez aplikację numeru wersji w pliku AIR zapobiega niezamierzonemu zainstalowaniu starszej wersji. (Starsza wersja aplikacji może zawierać lukę w zabezpieczeniach, która została wyeliminowana w obecnie zainstalowanej wersji.) Aplikacja powinna także porównać ciąg znaków wersji w pliku AIR z ciągiem znaków wersji w instalowanej aplikacji, aby uniemożliwić ataki polegające na podstawieniu starszej wersji. W wersjach środowiska AIR starszych niż 2.5 ciąg znaków wersji może mieć dowolny format. Na przykład może mieć wartość „2.01” lub „version 2”. W środowisku AIR 2.5 lub nowszym ciąg znaków wersji musi być sekwencją maksymalnie trzech trzycyfrowych liczb rozdzielonych kropkami. Prawidłowy numer wersji może mieć na przykład postać „.0”, „1.0” lub „67.89.999”. Przed zaktualizowaniem aplikacji należy sprawdzić poprawność ciągu znaków wersji aktualizacji. Jeśli aplikacja Adobe AIR pobierze plik AIR z sieci Web, wskazane jest zapewnienie mechanizmu powiadamiania przez usługę Web Service aplikacji Adobe AIR o pobieranej wersji. Aplikacja może następnie wykorzystać odpowiedni ciąg znaków jako parametr version metody update(). Jeśli plik AIR został uzyskany w inny sposób, a jego wersja jest nieznana, aplikacja AIR może przeanalizować plik AIR w celu określenia informacji o wersji. (Plik AIR ma postać archiwum w skompresowanego w formacie ZIP, a plik deskryptora jest drugim rekordem w archiwum). Szczegółowe informacje o pliku deskryptora aplikacji zawiera sekcja Pliki deskryptora aplikacji AIR. Obieg pracy podpisywania aktualizacji aplikacjiPublikowanie aktualizacji metodą „ad hoc” komplikuje zarządzanie wieloma wersjami aplikacji, a także utrudnia śledzenie dat utraty ważności certyfikatów. Certyfikaty mogą utracić ważność, zanim będzie możliwe opublikowanie aktualizacji. Środowisko wykonawcze Adobe AIR traktuje aktualizację aplikacji opublikowaną bez podpisu migracji jako nową aplikację. Użytkownicy muszą odinstalować bieżącą aplikację AIR, aby móc zainstalować aktualizację aplikacji. W celu rozwiązania tego problemu należy wysłać każdą zaktualizowaną aplikację z najnowszym certyfikatem na osobny adres URL wdrażania. Należy uwzględnić mechanizm przypominania o stosowaniu podpisów migracji, gdy rozpocznie się 180-dniowy okres prolongaty certyfikatu. Więcej informacji zawiera sekcja Podpisywanie zaktualizowanej wersji aplikacji AIR. Informacje na temat stosowania podpisów zawiera sekcja Polecenia narzędzia ADT. Aby usprawnić stosowanie podpisów migracji, należy wykonać następujące zadania:
Prezentowanie niestandardowego interfejsu aktualizacji aplikacjiŚrodowisko AIR zawiera domyślny interfejs aktualizacji: Ten interfejs jest używany zawsze, gdy użytkownik po raz pierwszy instaluje aplikację na komputerze. Można jednak zdefiniować własny interfejs, który będzie używany przy instalowaniu następnych wersji aplikacji. Jeśli aplikacja definiuje niestandardowy interfejs aktualizacji, należy dla obecnie zainstalowanej aplikacji określić element customUpdateUI w pliku deskryptora aplikacji: <customUpdateUI>true</customUpdateUI> Gdy aplikacja jest już zainstalowana, a użytkownik otworzy plik AIR z identyfikatorem aplikacji i wydawcy identycznymi z odpowiednimi identyfikatorami zainstalowanej aplikacji, środowisko wykonawcze AIR otwiera aplikację, a nie domyślny instalator aplikacji AIR. Więcej informacji zawiera sekcja customUpdateUI. Aplikacja w chwili uruchomienia (tj. gdy obiekt NativeApplication.nativeApplication wywoła zdarzenie load) może zdecydować, czy ma dokonać aktualizacji (przy użyciu klasy Updater). Jeśli aktualizacja ma być dokonana, aplikacja może zaprezentować użytkownikowi własny interfejs instalacji (który będzie się różnił od standardowego interfejsu do obsługi aplikacji). Pobieranie pliku AIR na komputer użytkownikaAby użyć klasy Updater, użytkownik lub aplikacja musi uprzednio zapisać plik AIR lokalnie na dysku swojego komputera. Uwaga: W skład środowiska AIR 1.5 wchodzi architektura aktualizacji, która pomaga programistom w realizacji sprawnych mechanizmów aktualizacji aplikacji AIR. Korzystanie z tej architektury może okazać się znacznie łatwiejsze niż bezpośrednie używanie metody update() klasy Update. Szczegółowe informacje zawiera sekcja Korzystanie z architektury aktualizacji.
Poniższy kod odczytuje plik AIR z adresu URL (http://example.com/air/updates/Sample_App_v2.air) i zapisuje ten plik w katalogu magazynu aplikacji. Przykład w języku ActionScript: var urlString:String = "http://example.com/air/updates/Sample_App_v2.air"; var urlReq:URLRequest = new URLRequest(urlString); var urlStream:URLStream = new URLStream(); var fileData:ByteArray = new ByteArray(); urlStream.addEventListener(Event.COMPLETE, loaded); urlStream.load(urlReq); function loaded(event:Event):void { urlStream.readBytes(fileData, 0, urlStream.bytesAvailable); writeAirFile(); } function writeAirFile():void { var file:File = File.applicationStorageDirectory.resolvePath("My App v2.air"); var fileStream:FileStream = new FileStream(); fileStream.open(file, FileMode.WRITE); fileStream.writeBytes(fileData, 0, fileData.length); fileStream.close(); trace("The AIR file is written."); } Przykład w języku JavaScript: var urlString = "http://example.com/air/updates/Sample_App_v2.air"; var urlReq = new air.URLRequest(urlString); var urlStream = new air.URLStream(); var fileData = new air.ByteArray(); urlStream.addEventListener(air.Event.COMPLETE, loaded); urlStream.load(urlReq); function loaded(event) { urlStream.readBytes(fileData, 0, urlStream.bytesAvailable); writeAirFile(); } function writeAirFile() { var file = air.File.desktopDirectory.resolvePath("My App v2.air"); var fileStream = new air.FileStream(); fileStream.open(file, air.FileMode.WRITE); fileStream.writeBytes(fileData, 0, fileData.length); fileStream.close(); trace("The AIR file is written."); } Aby znaleźć więcej informacji na ten temat, zobacz:
Sprawdzanie, czy aplikacja została uruchomiona po raz pierwszyCzęsto po zaktualizowaniu aplikacja wyświetla komunikat powitalny lub instrukcję „pierwsze kroki”. Po uruchomieniu aplikacja sprawdza, czy została uruchomiona po raz pierwszy, i na tej podstawie może wyświetlić taki komunikat lub nie. Uwaga: W skład środowiska AIR 1.5 wchodzi architektura aktualizacji, która pomaga programistom w realizacji sprawnych mechanizmów aktualizacji aplikacji AIR. Architektura ta udostępnia łatwe metody sprawdzania, czy dana aplikacja jest uruchomiona po raz pierwszy. Szczegółowe informacje zawiera sekcja Korzystanie z architektury aktualizacji.
Jedna z metod sprawdzenia tego warunku polega na zapisaniu pliku w katalogu magazynu aplikacji po jej zainicjowaniu. Po każdym uruchomieniu aplikacja powinna sprawdzać, czy plik istnieje. Brak pliku oznacza, że aplikacja została uruchomiona po raz pierwszy dla bieżącego użytkownika. Obecność pliku oznacza, że aplikacja była już co najmniej jeden raz uruchamiana. Jeśli plik istnieje i zawiera numer wersji starszej niż bieżąca, można przyjąć że użytkownik uruchamia nową wersję po raz pierwszy. Poniższy przykład Flex ilustruje ten sposób postępowania. <?xml version="1.0" encoding="utf-8"?> <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" title="Sample Version Checker Application" applicationComplete="system extension()"> <mx:Script> <![CDATA[ import flash.filesystem.*; public var file:File; public var currentVersion:String = "1.2"; public function system extension():void { file = File.applicationStorageDirectory; file = file.resolvePath("Preferences/version.txt"); trace(file.nativePath); if(file.exists) { checkVersion(); } else { firstRun(); } } private function checkVersion():void { var stream:FileStream = new FileStream(); stream.open(file, FileMode.READ); var reversion:String = stream.readUTFBytes(stream.bytesAvailable); stream.close(); if (reversion != currentVersion) { log.text = "You have updated to version " + currentVersion + ".\n"; } else { saveFile(); } log.text += "Welcome to the application."; } private function firstRun():void { log.text = "Thank you for installing the application. \n" + "This is the first time you have run it."; saveFile(); } private function saveFile():void { var stream:FileStream = new FileStream(); stream.open(file, FileMode.WRITE); stream.writeUTFBytes(currentVersion); stream.close(); } ]]> </mx:Script> <mx:TextArea ID="log" width="100%" height="100%" /> </mx:WindowedApplication> Poniższy przykład ilustruje to rozwiązanie w języku JavaScript: <html> <head> <script src="AIRAliases.js" /> <script> var file; var currentVersion = "1.2"; function system extension() { file = air.File.appStorageDirectory.resolvePath("Preferences/version.txt"); air.trace(file.nativePath); if(file.exists) { checkVersion(); } else { firstRun(); } } function checkVersion() { var stream = new air.FileStream(); stream.open(file, air.FileMode.READ); var reversion = stream.readUTFBytes(stream.bytesAvailable); stream.close(); if (reversion != currentVersion) { window.document.getElementById("log").innerHTML = "You have updated to version " + currentVersion + ".\n"; } else { saveFile(); } window.document.getElementById("log").innerHTML += "Welcome to the application."; } function firstRun() { window.document.getElementById("log").innerHTML = "Thank you for installing the application. \n" + "This is the first time you have run it."; saveFile(); } function saveFile() { var stream = new air.FileStream(); stream.open(file, air.FileMode.WRITE); stream.writeUTFBytes(currentVersion); stream.close(); } </script> </head> <body onLoad="system extension()"> <textarea ID="log" rows="100%" cols="100%" /> </body> </html> Jeśli aplikacja zapisuje dane lokalnie (np. w katalogu magazynu aplikacji), niekiedy celowe jest sprawdzenie przy pierwszym uruchomieniu, czy istnieją dane zapisane wcześniej przez poprzednie wersje. Korzystanie z architektury aktualizacjiZarządzanie aktualizacjami aplikacji może być pracochłonne. Infrastruktura aktualizacji dla aplikacji AdobeAIR oferuje interfejsy API, które umożliwiają programistom udostępnienie niezawodnych funkcji aktualizowania w aplikacjach AIR. Infrastruktura aktualizacji środowiska AIR zwalnia programistów z wykonywania następujących zadań:
Infrastruktura aktualizacji środowiska AIR zawiera przykładowy interfejs użytkownika dla aplikacji. Interfejs ten udostępnia użytkownikowi podstawowe informacje i opcje konfiguracji związane z aktualizacjami aplikacji. Aplikacja może także definiować własny interfejs użytkownika współpracujący z infrastrukturą aktualizacji. Infrastruktura aktualizacji aplikacji AIR umożliwia przechowywanie informacji o wersji aktualizacji aplikacji AIR w prostych plikach konfiguracyjnych XML. W przypadku większości aplikacji przygotowanie tych plików konfiguracyjnych przez dodanie podstawowego kodu wystarczy do zapewnienia użytkownikom końcowym odpowiedniej obsługi aktualizacji. Nawet jeśli programista nie zdecyduje się na użycie infrastruktury aktualizacji, aplikacje mogą korzystać z klasy Updater dostępnej w środowisku Adobe AIR, która wspomaga uaktualnianie do nowych wersji. Klasa Updater umożliwia aplikacji uaktualnienie do wersji zawartej w pliku AIR na komputerze użytkownika. Jednak zarządzanie aktualizacjami zwykle nie sprowadza się do prostej aktualizacji aplikacji na podstawie lokalnego pliku AIR. Pliki architektury aktualizacji AIRArchitektura aktualizacji AIR jest zawarta w katalogu frameworks/libs/air pakietu AIR 2 SDK. Zawiera następujące pliki:
Więcej informacji zawierają poniższe sekcje: Konfigurowanie środowiska programistycznego FlexPliki SWC w katalogu frameworks/libs/air pakietu AIR 2 SDK definiują klasy używane podczas programowania w środowisku Flex i w programie Flash. Aby skorzystać z architektury aktualizacji przy kompilowaniu aplikacji za pomocą pakietu Flex SDK, należy uwzględnić plik ApplicationUpdater.swc albo ApplicationUpdater_UI.swc w wywołaniu kompilatora amxmlc. W poniższym przykładzie kompilator ładuje plik ApplicationUpdater.swc z podkatalogu lib w katalogu pakietu Flex SDK: amxmlc -library-path+=lib/ApplicationUpdater.swc -- myApp.mxml W poniższym przykładzie kompilator ładuje plik ApplicationUpdater_UI.swc file z podkatalogu lib pakietu Flex SDK: amxmlc -library-path+=lib/ApplicationUpdater_UI.swc -- myApp.mxml W przypadku tworzenia aplikacji za pomocą kompilatora Flash Builder należy dodać plik SWC na karcie ścieżki biblioteki w ustawieniach ścieżki kompilacji Flex w oknie dialogowym właściwości. Pliki SWC należy koniecznie skopiować do katalogu, do którego będziemy odwoływać się w kompilatorze amxmlc (w przypadku użycia pakietu Flex SDK) lub w programie Flash Builder. Uwzględnianie plików architektury w aplikacji AIR opartej na kodzie HTMLKatalog frameworks/html architektury aktualizacji zawiera następujące pliki:
Kod JavaScript w aplikacjach AIR może korzystać z klas zdefiniowanych w plikach SWF. Aby korzystać z infrastruktury aktualizacji, należy umieścić plik applicationupdater.swf albo applicationupdater_ui.swf w katalogu (lub podkatalogu) aplikacji. Następnie w pliku HTML, w którym infrastruktura będzie stosowana (w kodzie JavaScript) należy umieścić znacznik script wczytujący ten plik. <script src="applicationUpdater.swf" type="application/x-shockwave-flash"/> Można też użyć poniższego znacznika script w celu wczytania pliku applicationupdater_ui.swf. <script src="applicationupdater_ui.swf" type="application/x-shockwave-flash"/> Interfejs API zdefiniowany w tych dwóch plikach został opisany w dalszej części niniejszego dokumentu. Prosty przykład: korzystanie z wersji ApplicationUpdaterUIWersja architektury aktualizacji zapisana w pliku ApplicationUpdaterUI udostępnia prosty interfejs, który łatwo można włączyć do własnych aplikacji. Poniżej przedstawiono prosty przykład. Najpierw tworzymy aplikację AIR, która wywołuje architekturę aktualizacji:
Następnie dodajemy zaktualizowaną wersję aplikacji AIR na serwer WWW:
Choć jest to prosty przykład, zapewnia on funkcjonalność aktualizacji wystarczającą w wielu zastosowaniach. W pozostałej części tego dokumentu opisano sposoby wykorzystania architektury aktualizacji odpowiednio do indywidualnych potrzeb. Dodatkowe przykłady użycia architektury aktualizacji zawierają następujące aplikacje w serwisie Adobe AIR Developer Center:
Aktualizowanie do środowiska AIR 2.5Zasady przydzielania numerów wersji do aplikacji zostały zmienione w środowisku AIR 2.5, dlatego infrastruktura aktualizacji środowiska AIR 2 nie może przeanalizować informacji o wersji w deskryptorze aplikacji środowiska AIR 2.5. Ta niezgodność oznacza, że należy zaktualizować aplikację w celu korzystania z nowej infrastruktury aktualizacji, ZANIM aplikacja zostanie zaktualizowana w celu korzystania z zestawu SDK środowiska AIR 2.5. Dlatego aktualizowanie aplikacji z dowolnej wersji środowiska AIR starszej niż 2.5 w celu korzystania ze środowiska AIR 2.5 lub nowszej wersji wymaga DWÓCH aktualizacji. Pierwsza aktualizacja musi używać przestrzeni nazw środowiska AIR 2 i uwzględniać bibliotekę infrastruktury aktualizacji środowiska AIR 2.5. (Pakiet aplikacji można utworzyć za pomocą zestawu SDK środowiska AIR 2.5). Druga aktualizacja może używać przestrzeni nazw środowiska AIR 2.5 i uwzględniać nowe funkcje aplikacji. Pośrednia aktualizacja może również nie wykonywać żadnych operacji oprócz zaktualizowania aplikacji do wersji dla środowiska AIR 2.5 przy użyciu klasy Updater środowiska AIR w bezpośredni sposób. Poniższy przykład przedstawia aktualizowanie aplikacji z wersji 1.0 do 2.0. Wersja 1.0 używa starej przestrzeni nazw wersji 2.0. Wersja 2.0 używa przestrzeni nazw wersji 2.5 i zawiera nowe funkcje zaimplementowane przy użyciu interfejsów API środowiska 2.5.
<?xml version="1.0" encoding="utf-8"?> <update xmlns="http://ns.adobe.com/air/framework/update/description/2.5"> <version>2.0</version> <url>http://example.com/updates/sample_2.0.air</url> <description>This is the intermediate version.</description> </update> Definiowanie plików deskryptora aktualizacji i dodawanie pliku AIR do serwera internetowegoPodczas pracy z infrastrukturą aktualizacji środowiska AIR należy zdefiniować podstawowe informacje o dostępnej aktualizacji w plikach deskryptora aktualizacji przechowywanych na serwerze internetowym. Plik deskryptora aktualizacji jest prostym plikiem XML. Infrastruktura aktualizacji dołączona do aplikacji sprawdza zawartość tego pliku, aby stwierdzić, czy na serwerze została umieszczona nowa wersja. Format pliku deskryptora aktualizacji uległ zmianie w środowisku AIR 2.5. W nowym formacie jest używana inna przestrzeń nazw. Oryginalna przestrzeń nazw to „http://ns.adobe.com/air/framework/update/description/1.0”. Przestrzeń nazw środowiska AIR 2.5 to „http://ns.adobe.com/air/framework/update/description/2.5”. Aplikacje AIR utworzone dla wersji środowiska AIR starszych niż 2.5 mogą odczytywać tylko deskryptor aktualizacji dotyczący wersji 1.0. Aplikacje AIR utworzone za pomocą infrastruktury aktualizacji zawartej w środowisku AIR 2.5 lub nowszym mogą odczytywać tylko deskryptor aktualizacji dotyczący wersji 2.5. Z powodu tej niezgodności wersji często trzeba tworzyć dwa pliki deskryptora aktualizacji. Logika obsługująca aktualizowanie w wersjach aplikacji dla środowiska AIR 2.5 musi pobierać deskryptor aktualizacji korzystający z nowego formatu. Starsze wersje aplikacji AIR muszą nadal korzystać z oryginalnego formatu. Dla każdej wydanej aktualizacji należy zmodyfikować oba pliki (do czasu zakończenia obsługi wersji utworzonych dla wersji środowiska AIR starszych niż 2.5). Plik deskryptora aktualizacji zawiera następujące dane:
Elementy version i url są wymagane. Element description jest opcjonalny. Oto przykładowy plik deskryptora aktualizacji dla wersji 2.5: <?xml version="1.0" encoding="utf-8"?> <update xmlns="http://ns.adobe.com/air/framework/update/description/2.5"> <versionNumber>1.1.1</versionNumber> <url>http://example.com/updates/sample_1.1.1.air</url> <description>This is the latest version of the Sample application.</description> </update> Oto przykładowy plik deskryptora aktualizacji dla wersji 1.0: <?xml version="1.0" encoding="utf-8"?> <update xmlns="http://ns.adobe.com/air/framework/update/description/1.0"> <version>1.1.1</version> <url>http://example.com/updates/sample_1.1.1.air</url> <description>This is the latest version of the Sample application.</description> </update> Aby zdefiniować znacznik description w wielu językach, należy zastosować wiele elementów text definiujących atrybut lang: <?xml version="1.0" encoding="utf-8"?> <update xmlns="http://ns.adobe.com/air/framework/update/description/2.5"> <versionNumber>1.1.1</versionNumber> <url>http://example.com/updates/sample_1.1.1.air</url> <description> <text xml:lang="en">English description</text> <text xml:lang="fr">French description</text> <text xml:lang="ro">Romanian description</text> </description> </update> Umieszczamy plik deskryptora aktualizacji wraz z plikiem AIR aktualizacji na serwerze WWW. Katalog templates dołączony do deskryptora aktualizacji zawiera przykładowe pliki deskryptorów aktualizacji. Zawierają one wersje w jednym języku oraz wersje wielojęzyczne. Tworzenie instancji klasy UpdaterPo załadowaniu architektury aktualizacji AIR w kodzie (patrz Konfigurowanie środowiska programistycznego Flex i Uwzględnianie plików architektury w aplikacji AIR opartej na kodzie HTML) konieczne jest utworzenie instancji klasy Updater, co ilustruje poniższy przykład. Przykład w języku ActionScript: var appUpdater:ApplicationUpdater = new ApplicationUpdater(); Przykład w języku JavaScript: var appUpdater = new runtime.air.update.ApplicationUpdater(); W powyższym kodzie zastosowano klasę ApplicationUpdater (która nie udostępnia interfejsu użytkownika). Oto kod, w którym zastosowano klasę ApplicationUpdaterUI (z interfejsem użytkownika). Przykład w języku ActionScript: var appUpdater:ApplicationUpdaterUI = new ApplicationUpdaterUI(); Przykład w języku JavaScript: var appUpdater = new runtime.air.update.ApplicationUpdaterUI(); W przykładach kodu zamieszczonych w dalszej części tego dokumentu przyjęto założenie, że został utworzony obiekt Updater o nazwie appUpdater. Konfigurowanie ustawień aktualizacjiZarówno klasę ApplicationUpdater, jak i klasę ApplicationUpdaterUI można skonfigurować za pośrednictwem pliku konfiguracji dostarczonego z aplikacją lub za pomocą kodu ActionScript bądź JavaScript w aplikacji. Definiowanie ustawień aktualizacji w pliku konfiguracyjnym XMLPlik konfiguracyjny aktualizacji jest plikiem XML. Może zawierać następujące elementy:
Plik konfiguracyjny dla klasy ApplicationUpdaterUI może, oprócz elementów updateURL i delay, zawierać następujący element:
Oto przykładowy plik konfiguracyjny dla architektury ApplicationUpdater: <?xml version="1.0" encoding="utf-8"?> <configuration xmlns="http://ns.adobe.com/air/framework/update/configuration/1.0"> <url>http://example.com/updates/update.xml</url> <delay>1</delay> </configuration> Oto przykładowy plik konfiguracyjny dla architektury ApplicationUpdaterUI zawierający definicję elementów defaultUI: <?xml version="1.0" encoding="utf-8"?> <configuration xmlns="http://ns.adobe.com/air/framework/update/configuration/1.0"> <url>http://example.com/updates/update.xml</url> <delay>1</delay> <defaultUI> <dialog name="checkForUpdate" visible="false" /> <dialog name="downloadUpdate" visible="false" /> <dialog name="downloadProgress" visible="false" /> </defaultUI> </configuration> Właściwość configurationFile powinna wskazywać na położenie tego pliku: Przykład w języku ActionScript: appUpdater.configurationFile = new File("app:/cfg/updateConfig.xml");Przykład w języku JavaScript: appUpdater.configurationFile = new air.File("app:/cfg/updateConfig.xml"); Katalog templates architektury aktualizacji zawiera przykładowy plik konfiguracyjny o nazwie config-template.xml. Definiowanie ustawień aktualizacji za pomocą kodu ActionScript lub JavaScriptTe same parametry konfiguracyjne można ustawić za pośrednictwem kodu aplikacji, tak jak w poniższym przykładzie: appUpdater.updateURL = " http://example.com/updates/update.xml"; appUpdater.delay = 1; Obiekt Updater ma właściwości updateURL i delay. Właściwości te opisują te same ustawienia, co elementy updateURL i delay w pliku konfiguracyjnym: adres URL pliku deskryptora aktualizacji i interwał sprawdzania dostępności aktualizacji. W wypadku określenia ustawień w pliku konfiguracyjnym i w kodzie wszelkie właściwości ustawione w kodzie przesłaniają odpowiednie ustawienia w pliku. Właściwość updateURL musi być zdefiniowana — albo w pliku konfiguracyjnym, albo za pomocą skryptu (patrz Definiowanie plików deskryptora aktualizacji i dodawanie pliku AIR do serwera internetowego) — przed użyciem obiektu Updater (przed wywołaniem metody initialize() obiektu Updater, co opisano w sekcji Inicjowanie architektury aktualizacji). W architekturze ApplicationUpdaterUI zdefiniowane są następujące dodatkowe właściwości obiektu Updater:
Każda z właściwości odpowiada jednemu lub większej liczbie okien dialogowych w interfejsie użytkownika architektury ApplicationUpdaterUI. Wszystkie właściwości są typu Boolean i mają wartość domyślną true. Ustawienie wartości false powoduje, że odpowiednie okna dialogowe nie będą pojawiać się w trakcie procedury aktualizacji. Właściwości okien dialogowych przesłaniają ustawienia w pliku konfiguracyjnym aktualizacji. Proces aktualizacjiArchitektura aktualizacji AIR realizuje proces aktualizacji w następujących krokach:
Obiekt Updater wywołuje zdarzenia po zakończeniu każdego z tych kroków. W architekturze ApplicationUpdater możliwe jest anulowanie zdarzeń wskazujących na pomyślne zakończenie kroków procesu. W wypadku anulowania jednego z takich zdarzeń anulowany zostanie następny krok procesu. W architekturze ApplicationUpdaterUI obiekt Updater wyświetla okno dialogowe umożliwiające użytkownikowi anulowanie lub wykonanie każdego z kroków procesu. W wypadku anulowania zdarzenia możliwe jest wznowienie procesu poprzez wywołanie metod obiektu Updater. W miarę, jak obiekt Updater w wersji ApplicationUpdater realizuje kolejne etapy aktualizacji, jego bieżący stan jest zapisywany we właściwości currentState. Tej właściwości przypisywany jest ciąg znaków o jednej z następujących możliwych wartości:
Niektóre metody obiektu Updater są wykonywane tylko wtedy, gdy obiekt ten jest w określonym stanie. Inicjowanie architektury aktualizacjiPo ustawieniu właściwości konfiguracyjnych (patrz Prosty przykład: korzystanie z wersji ApplicationUpdaterUI) należy wywołać metodę initialize() w celu zainicjowania aktualizacji: appUpdater.initialize(); Metoda ta wykonuje następujące operacje:
Wywołanie tej metody może spowodować, że obiekt Updater wywoła następujące zdarzenia:
Po wywołaniu zdarzenia UpdateEvent.INITIALIZED proces aktualizacji jest ukończony. Wywołanie metody initialize() powoduje, że obiekt Updater rozpoczyna proces aktualizacji i wykonuje wszystkie kroki z uwzględnieniem ustawionego opóźnienia. Możliwe jest jednak także rozpoczęcie procesu aktualizacji w dowolnej chwili, poprzez wywołanie metody checkNow() obiektu Updater: appUpdater.checkNow(); Jeśli proces aktualizacji już trwa, ta metoda nie wykonuje żadnych czynności. W przeciwnym razie rozpoczyna proces aktualizacji. Obiekt Updater może wywoływać następujące zdarzenie w wyniku wywołania metody checkNow():
Jeśli zdarzenie checkForUpdate zostanie anulowane, można wywołać metodę checkForUpdate() obiektu Updater. (Patrz następna sekcja). Jeśli zdarzenie nie zostanie anulowane, proces aktualizacji przechodzi do etapu sprawdzania, czy istnieje plik deskryptora aktualizacji. Zarządzanie procesem aktualizacji w wersji ApplicationUpdaterUIW wersji ApplicationUpdaterUI użytkownik może anulować proces za pomocą przycisków Anuluj w oknach dialogowych interfejsu użytkownika. Możliwe jest także programowe anulowanie procesu aktualizacji poprzez wywołanie metody cancelUpdate() obiektu ApplicationUpdaterUI. W celu określenia, które okna dialogowe potwierdzeń mają być wyświetlane przez obiekt Updater, można ustawić właściwości obiektu ApplicationUpdaterUI lub zdefiniować elementy pliku konfiguracyjnego aplikacji. Szczegółowe informacje zawiera sekcja Konfigurowanie ustawień aktualizacji. Zarządzanie procesem aktualizacji w wersji ApplicationUpdaterMożliwe jest wywoływanie metody preventDefault() obiektów zdarzeń wywoływanych przez obiekt ApplicationUpdater w celu anulowania odpowiednich kroków procesu aktualizacji (patrz Proces aktualizacji). Anulowanie domyślnego zachowania stwarza aplikacji możliwość wyświetlenia komunikatu z pytaniem, czy użytkownik chce kontynuować. W dalszych sekcjach opisano sposób kontynuacji procesu aktualizacji w wypadku anulowania jednego z kroków procesu. Pobieranie i interpretowanie pliku deskryptora aktualizacjiObiekt ApplicationUpdater wywołuje zdarzenie checkForUpdate przed rozpoczęciem procesu aktualizacji, tuż przed próbą pobrania pliku deskryptora aktualizacji. Jeśli domyślne zachowanie zdarzenia checkForUpdate zostanie anulowane, obiekt Updater nie pobierze pliku deskryptora aktualizacji. Można wywołać metodę checkForUpdate() i tym samym wznowić proces aktualizacji: appUpdater.checkForUpdate(); Wywołanie metody checkForUpdate() powoduje, że obiekt Updater asynchronicznie pobierze i zinterpretuje plik deskryptora. W wyniku wywołania metody checkForUpdate() obiekt Updater może wywołać następujące zdarzenia:
Pobieranie pliku AIR aktualizacjiObiekt ApplicationUpdater wywołuje zdarzenie updateStatus po tym, jak pomyślnie pobierze i zinterpretuje plik deskryptora aktualizacji. Zachowanie domyślne polega na rozpoczęciu pobierania pliku aktualizacji, o ile jest on dostępny. Jeśli zachowanie domyślne zostanie anulowane, można wywołać metodę downloadUpdate() w celu wznowienia procesu aktualizacji. appUpdater.downloadUpdate(); Wywołanie tej metody powoduje, że obiekt Updater rozpoczyna asynchroniczne pobieranie wersji pliku AIR będącej aktualizacją. Metoda downloadUpdate() może wywoływać następujące zdarzenia:
Aktualizowanie aplikacjiObiekt ApplicationUpdater wywołuje zdarzenie downloadComplete po zakończeniu pobierania pliku aktualizacji. Jeśli zachowanie domyślne zostanie anulowane, można wywołać metodę installUpdate() w celu wznowienia procesu aktualizacji. appUpdater.installUpdate(file); Wywołanie tej metody powoduje, że obiekt Updater zainstaluje plik AIR aktualizacji. Metoda ma jeden parametr, file, który jest obiektem File wskazującym plik AIR aktualizacji. Obiekt ApplicationUpdater może wywołać zdarzenie beforeInstall w wyniku wywołania metody installUpdate():
Instalowanie z arbitralnie wybranego pliku AIRIstnieje możliwość wywołania metody installFromAIRFile() w celu zainstalowania zaktualizowanej wersji aplikacji z pliku AIR na komputerze użytkownika: appUpdater.installFromAIRFile(); Metoda ta powoduje, że obiekt Updater instaluje aktualizację aplikacji z pliku AIR. Metoda installFromAIRFile() może wywoływać następujące zdarzenia:
Anulowanie procesu aktualizacjiMetoda cancelUpdate() umożliwia anulowanie procesu aktualizacji: appUpdater.cancelUpdate(); Metoda ta anuluje wszystkie oczekujące operacje pobierania, usuwa wszystkie nie w pełni pobrane pliki i ponownie uruchamia zegar odliczający interwał między sprawdzeniami dostępności aktualizacji. Metoda nie wykonuje żadnych czynności, jeśli trwa inicjowanie obiektu Updater. Lokalizowanie interfejsu ApplicationUpdaterUIKlasa ApplicationUpdaterUI udostępnia domyślny interfejs użytkownika procesu aktualizacji. W jego skład wchodzą okna dialogowe umożliwiające rozpoczęcie procesu, anulowanie procesu i wykonywanie innych pokrewnych czynności. Element description pliku deskryptora aktualizacji umożliwia zdefiniowanie opisu aplikacji w wielu językach. Należy w tym celu użyć wielu elementów text definiujących atrybuty lang, co zilustrowano poniżej: <?xml version="1.0" encoding="utf-8"?> <update xmlns="http://ns.adobe.com/air/framework/update/description/1.0"> <version>1.1a1</version> <url>http://example.com/updates/sample_1.1a1.air</url> <description> <text xml:lang="en">English description</text> <text xml:lang="fr">French description</text> <text xml:lang="ro">Romanian description</text> </description> </update> Architektura aktualizacji wybiera opis najlepiej dopasowany do łańcucha lokalizacji użytkownika końcowego. Więcej informacji zawiera sekcja Definiowanie pliku deskryptora aktualizacji i dodawanie pliku AIR na serwer WWW. Programiści korzystający ze środowiska Flex mogą bezpośrednio dodawać nowe języki do pakunku "ApplicationUpdaterDialogs". W języku JavaScript można wywoływać metodę addResources() obiektu Updater. Ta metoda dynamicznie dodaje nowy pakunek zasobów dla języka. Pakunek zasobów definiuje zlokalizowane ciągi znaków w danym języku. Ciągi te są używane w polach tekstowych okien dialogowych. W języku JavaScript można skorzystać z właściwości localeChain klasy ApplicationUpdaterUI w celu zdefiniowania łańcucha ustawień narodowych używanego w interfejsie użytkownika. Zazwyczaj z właściwości tej korzystają tylko programiści posługujący się językiem JavaScript (HTML). W środowisku Flex do zarządzania łańcuchem ustawień narodowych można używać menedżera zasobów. Poniższy przykładowy kod w języku JavaScript definiuje pakunki zasobów dla języka rumuńskiego i węgierskiego: appUpdater.addResources("ro_RO", {titleCheck: "Titlu", msgCheck: "Mesaj", btnCheck: "Buton"}); appUpdater.addResources("hu", {titleCheck: "Cím", msgCheck: "Üzenet"}); var languages = ["ro", "hu"]; languages = languages.concat(air.Capabilities.languages); var sortedLanguages = air.Localizer.sortLanguagesByPreference(languages, air.Capabilities.language, "en-US"); sortedLanguages.push("en-US"); appUpdater.localeChain = sortedLanguages; Szczegółowe informacje zawiera opis metody addResources() klasy ApplicationUpdaterUI w skorowidzu języka. |
|