Обновление приложений AIR

Пользователи могут установить или обновить приложение AIR, дважды нажав файл AIR на компьютере или в обозревателе (пользуясь функцией автоматической установки). Программа установки Adobe® AIR® будет управлять установкой, уведомив пользователя о том, что выполняется обновление уже существующего приложения.

Однако обновить приложение можно и при помощи класса Updater. (Установленное приложение может проверять наличие новой версии для загрузки и установки.) Класс Updater имеет метод update(), который позволяет указать файл AIR на компьютере пользователя и обновить приложение до этой версии. Для использования класса Updater необходимо, чтобы приложение было упаковано в файл AIR. Приложения, упакованные в виде собственного исполняемого файла или пакета, должны использовать средства обновления, предоставляемые собственной платформой.

Идентификатор приложения и идентификатор издателя файла обновления AIR должны соответствовать обновляемому приложению. Идентификатор издателя можно получить из сертификата подписи. Обновление, и обновляемое приложение должны быть подписаны одним сертификатом.

В AIR 1.5.3 или более поздней версии файл дескриптора приложения содержит элемент <publisherID>. Этот элемент необходимо использовать, если версии приложения создавались в AIR 1.5.2 или более ранней версии. Дополнительные сведения см. в разделе «publisherID».

Что касается AIR 1.1 и более поздних версий, можно выполнить перенос приложения для использования нового сертификата подписи кода. Перенос приложения в целях использования новой подписи включает в себя подписывание файла обновления AIR новым и исходным сертификатом. Перенос сертификата является односторонним процессом. После переноса только файлы AIR, подписанные новым сертификатом (или обоими сертификатами), будут распознаны как обновления существующей установки.

Управление обновлением приложений может быть достаточно сложным. AIR 1.5 содержит новую инфраструктуру обновления для приложений AdobeAIR. Эта инфраструктура обеспечивает прикладные интерфейсы программирования, помогающие разработчикам создавать удобные возможности обновления в приложениях AIR.

Перенос сертификата можно выполнить для замены самозаверяющего сертификата коммерческим сертификатом подписи кода или смены одного самозаверяющего или коммерческого сертификата на другой. Если не выполнить перенос сертификата, пользователи должны будут удалить текущую версию приложения перед установкой новой. Дополнительные сведения см. в разделе «Замена сертификатов».

Рекомендуется включить новый механизм обновления в приложение. При появлении новой версии приложения, механизм обновления выведет пользователю приглашение на ее установку.

Программа установки приложения AIR создает файлы журнала при установке, обновлении или удалении приложения AIR. Журналы установок позволяют определить причины проблем при установке или обновлении. См. статью Журналы установки.

Примечание. Новые версии среды Adobe AIR могут включать в себя обновленные версии WebKit. Обновленная версия WebKit может привести к неожиданным изменениям в содержимом HTML развернутого приложения AIR. Поэтому может потребоваться обновить приложение. Механизм обновления может уведомлять пользователей о выходе новой версии приложения. Дополнительные сведения см. в разделе Сведения о среде HTML (для разработчиков ActionScript) или Сведения о среде HTML (для разработчиков HTML).

Об обновлении приложений

Класс Updater (в пакете flash.desktop) содержит один метод, update(), который можно использовать для обновления выполняемого приложения. Например, если на рабочем столе пользователя размещена версия файла AIR («Sample_App_v2.air»), следующий код обновляет приложение.

Пример 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);

Пример JavaScript:

var updater = new air.Updater(); 
var airFile = air.File.desktopDirectory.resolvePath("Sample_App_v2.air"); 
var version = "2.01"; 
updater.update(airFile, version);

Перед использованием класса Updater приложением пользователь или приложение должны загрузить обновленную версию файла AIR на компьютер. Дополнительные сведения см. в разделе «Загрузка файла AIR на компьютер пользователя».

Результаты вызова метода Updater.update()

Когда приложение вызывает в среде выполнения метод update(), среда выполнения закрывает приложение, а затем пытается установить новую версию из файла AIR. Среда выполнения проверяет идентификатор приложения и идентификатор издателя, указанные в файле AIR, на соответствие идентификатору приложения и идентификатору издателя приложения, вызывающего метод update(). (Сведения об идентификаторе приложения и идентификаторе издателя см. в разделе «Файлы дескриптора приложения AIR».) Она также проверяет соответствие строки version строке version, передаваемой методу update(). Если установка прошла успешно, среда выполнения открывает новую версию приложения. В противном случае (если установка не может быть завершена) снова открывается существующая (до установки) версия приложения.

В случае с системой Mac OS для установки обновленной версии приложения пользователь должен иметь соответствующие системные привилегии для установки в каталог приложения. В Windows и Linux пользователь должен обладать правами администратора.

Если обновленная версия приложения требует обновленной версии среды выполнения, устанавливается новая версия среды выполнения. Для обновления среды выполнения на компьютере необходимы права администратора.

При тестировании приложения в ADL вызов метода update() выдает исключение среды выполнения.

О строке version

Строка, представленная параметром version метода update(), должна соответствовать строке в элементе version или versionNumber в файле дескриптора приложения устанавливаемого файла AIR. Задание параметра version является обязательным в целях защиты. Заставив приложение проверять номер версии в файле AIR, можно предотвратить случайную установку старой версии приложения. (В более старой версии приложения возможны уязвимые места в системе защиты, которые были исправлены в установленном приложении.) Приложение должно сверить строку version в файле AIR со строкой version установленного приложения во избежание атак с установкой устаревшей версии.

До версии AIR 2.5 строка version может иметь любой формат. Например, это может выглядеть как «2.01» или как «version 2». Начиная с версии AIR 2.5 строка version должна содержать последовательность из не более чем трех трехзначных чисел, разделенных точкой. Например, допустимыми номерами версий могут быть следующие: «.0», «1.0» и «67.89.999». Перед обновлением приложения необходимо задать корректную строку version.

Если приложение Adobe AIR загружает файл AIR из Интернета, рекомендуется иметь механизм, при помощи которого веб-служба может сообщить приложению Adobe AIR номер загружаемой версии. Приложение может затем использовать эту строку в качестве параметра version метода update(). При получении файла AIR из другого источника, который не предоставляет информацию о версии файла AIR, приложение AIR может проверить файл AIR для получения информации о версии. (Файл AIR является сжатым ZIP-архивом, а файл дескриптора приложения занимает вторую позицию в архиве.)

Дополнительные сведения о файле дескриптора приложения см. в разделе «Файлы дескриптора приложения AIR».

Процедура подписания для обновлений приложений

Публикация обновлений специальным образом усложняет управление несколькими версиями приложений, а также создает сложности в отслеживании срока действий сертификата. Срок действия сертификата может заканчиваться до публикации обновления.

Среда выполнения Adobe AIR рассматривает обновления приложений, опубликованные без подписи переноса, как новые приложения. Пользователям необходимо удалить текущую версию приложений AIR, прежде чем они смогут установить обновление.

Для разрешения проблемы загрузите все обновленные приложения с последним сертификатом на отдельный URL развертывания. Добавьте механизм, который будет напоминать вам применять подпись переноса до окончания 180-дневного льготного периода. Дополнительные сведения см. в разделе «Подписание обновленной версии приложения AIR».

Дополнительные сведения см. в разделе «Команды ADT».

Выполнение следующих операций позволит упростить процесс применения подписи переноса.

  • Загрузка каждого обновленного приложения на отдельный URL развертывания.

  • Загрузка обновленного XML-файла дескриптор и последнего сертификата для обновления на один URL.

  • Подписание обновленного приложения с помощью последнего сертификата.

  • Применение подписи переноса для загруженных приложений с помощью сертификата, который использовался для подписания предыдущей версии, расположенной на другом URL.

Использование настраиваемого пользовательского интерфейса обновления приложения

AIR включает в себя интерфейс обновления по умолчанию:

Этот интерфейс используется при первой установке пользователем на компьютер версии приложения. Однако можно задать собственный интерфейс для последующих версий. Если в приложении определяется настраиваемый пользовательский интерфейс обновления, укажите элемент customUpdateUI в файле дескриптора приложения для текущего установленного приложения.

<customUpdateUI>true</customUpdateUI>

После установки приложения и открытия пользователем файла AIR с идентификатором приложения и идентификатором издателя, соответствующими установленному приложению, среда выполнения открывает приложение, а не программу установки приложения AIR по умолчанию. Дополнительные сведения см. в разделе «customUpdateUI».

При выполнении приложения оно может принять решение (при отправке объектом NativeApplication.nativeApplication события load) об установке обновления (при помощи класса Updater). Если принято решение в пользу обновления, приложение может предоставить пользователю собственный интерфейс установки (который отличается от стандартного интерфейса выполнения).

Загрузка файла AIR на компьютер пользователя

Для использования класса Updater пользователь или приложение должны сначала сохранить файл AIR на компьютер пользователя.

Примечание. AIR 1.5 содержит инфраструктуру обновления, помогающую разработчикам создавать удобные возможности обновления в приложениях AIR. Использовать эту инфраструктуру гораздо проще, чем напрямую применять метод update() класса Update. Дополнительные сведения см. в разделе «Использование инфраструктуры обновления».

Следующий код выполняет чтение файла AIR с URL-адреса (http://example.com/air/updates/Sample_App_v2.air) и сохраняет этот файл AIR в каталог хранилища приложения.

Пример 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."); 
}

Пример 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."); 
}

Дополнительные сведения см. в разделе:

Проверка факта первичного запуска приложения

После обновления приложения можно отобразить экран приветствия. При запуске приложение проверяет факт первичного запуска и принимает решение о том, отображать приветствие или нет.

Примечание. AIR 1.5 содержит инфраструктуру обновления, помогающую разработчикам создавать удобные возможности обновления в приложениях AIR. Эта инфраструктура предоставляет удобные методы проверки, первый ли раз запущена версия приложения. Дополнительные сведения см. в разделе «Использование инфраструктуры обновления».

Для этого можно сохранить файл в каталог хранилища приложения при инициализации приложения. При каждом запуске приложения оно должно проверять наличие этого файла. Если файл не существует, то приложение выполняется первый раз для данного пользователя. Существование файла означает, что приложение уже выполнялось по крайней мере один раз. Если файл существует и содержит номер более старой версии, чем номер текущей версии, значит пользователь выполняет новую версию приложения в первый раз.

Следующий пример Flex иллюстрирует данную концепцию:

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

В следующем примере показана реализация этой концепции в 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> 

Если приложение сохраняет данные локально (например, в каталоге хранилища приложения), можно проверить ранее сохраненные данные (предыдущими версиями) при первом запуске.

Использование инфраструктуры обновления

Управление обновлениями приложений может быть трудоемкой задачей. Инфраструктура обновления для приложений AdobeAIRпредоставляет API-интерфейсы, которые позволяют разработчикам реализовывать возможности обновления в приложениях AIR. Инфраструктура обновления AIR выполняет следующие задачи для разработчиков:

  • Периодическая проверка обновлений через определенный период времени или по запросам пользователей.

  • Загрузка файлов AIR (обновлений) из веб-источника.

  • Оповещение пользователя о первом запуске вновь установленной версии.

  • Подтверждение того, что пользователю требуется проверять наличие обновлений.

  • Отображение информации о новой версии обновления пользователю.

  • Отображение хода выполнения загрузки и информации об ошибках пользователю.

Инфраструктура обновления AIR предлагает пользовательский интерфейс, который может использоваться приложением. Она предоставляет пользователю основную информацию и параметры конфигурации для обновлений приложений. Приложение также может определить настраиваемый пользовательский интерфейс для использования с инфраструктурой обновления.

Инфраструктура обновления AIR позволяет сохранять информацию по обновлению версии приложения AIR в простых файлах конфигурации XML. Благодаря настройке файлов конфигурации, позволяющей включить базовый код, большинство приложений способны предложить своим конечным пользователям хорошие функциональные возможности обновления.

Даже без использования инфраструктуры обновлений Adobe AIR содержит класс Updater, который можно применять для перехода на новые версии. Класс Updater позволяет приложению выполнить обновление до версии, содержащейся в файле AIR на компьютере пользователя. Но управление обновлениями может включать задачи, более сложные, чем обновление из локально сохраненного файла AIR.

Файлы инфраструктуры обновления AIR

Инфраструктура обновления AIR содержится в каталоге frameworks/libs/air пакета AIR 2 SDK. Она включает следующие файлы:

  • applicationupdater.swc: определяет основные функциональные возможности библиотеки обновления, используемые в ActionScript. В этой версии отсутствует интерфейс пользователя.

  • applicationupdater.swf: определяет основные функциональные возможности библиотеки обновления, используемые в JavaScript. В этой версии отсутствует интерфейс пользователя.

  • applicationupdater_ui.swc: определяет основные функциональные возможности библиотеки обновления версии Flex 4, включая интерфейс пользователя, с помощью которого приложение может отображать параметры обновления.

  • applicationupdater_ui.swf: определяет основные функциональные возможности библиотеки обновления версии JavaScript, включая интерфейс пользователя, с помощью которого приложение может отображать параметры обновления.

Дополнительные сведения см. в следующих разделах:

Настройка среды разработки Flex

В файлах SWC в каталоге frameworks/libs/air пакета AIR 2 SDK определены классы, которые можно использовать при разработке в средах Flex и Flash.

Чтобы использовать инфраструктуру обновления при компиляции с помощью пакета Flex SDK, необходимо включить файл ApplicationUpdater.swc или ApplicationUpdater_UI.swc в вызов компилятора amxmlc. В следующем примере компилятор загружает файл ApplicationUpdater.swc в подкаталог lib пакета Flex SDK.

amxmlc -library-path+=lib/ApplicationUpdater.swc  -- myApp.mxml

В следующем примере компилятор загружает файл ApplicationUpdater_UI.swc в подкаталог lib пакета Flex SDK.

amxmlc -library-path+=lib/ApplicationUpdater_UI.swc  -- myApp.mxml

При разработке с помощью Flash Builder добавьте SWC-файл на вкладке «Путь к библиотеке» в настройках путей к библиотекам Flex Builder в диалоговом окне «Свойства».

Обязательно скопируйте SWC-файлы в каталог, который будет указан при вызове компилятора amxmlc (во Flex SDK) или Flash Builder.

Включение файлов инфраструктуры в HTML-приложение AIR

В каталоге frameworks/html инфраструктуры обновления размещаются cледующие SWF-файлы:

  • applicationupdater.swf — определяет основные функциональные возможности библиотеки обновления без использования какого-либо интерфейса пользователя.

  • applicationupdater_ui.swf — определяет основные функциональные возможности библиотеки обновления, включая интерфейс пользователя, с помощью которого приложение может отображать параметры обновления.

Код JavaScript в приложениях AIR может использовать классы, определенные в SWF-файлах.

Чтобы использовать инфраструктуру обновления, добавьте файл applicationupdater.swf или applicationupdater_ui.swf в каталог приложения (или его подкаталог). Затем включите в HTML-файл, который будет использовать инфраструктуру (в коде JavaScript), тег script, загружающий этот файл.

<script src="applicationUpdater.swf" type="application/x-shockwave-flash"/>

Также можно использовать тег script для загрузки файла applicationupdater_ui.swf.

<script src="applicationupdater_ui.swf" type="application/x-shockwave-flash"/>

Прикладной интерфейс программирования, определенный в этих двух файлах, описывается в оставшейся части данного документа.

Простой пример: использование версии ApplicationUpdaterUI (с интерфейсом пользователя)

Входящая в инфраструктуру обновления версия файла ApplicationUpdater с интерфейсом пользователя предлагает простой интерфейс, который можно использовать в приложении. Далее приведен простейший пример его использования.

Вначале создайте приложение AIR, которое вызывает инфраструктуру обновления.

  1. Если это HTML-приложение AIR, загрузите файл applicationupdaterui.swf:

    <script src="ApplicationUpdater_UI.swf" type="application/x-shockwave-flash"/>
  2. Инициируйте объект ApplicationUpdaterUI в программной логике приложения AIR.

    В ActionScript используйте следующий программный код.

    var appUpdater:ApplicationUpdaterUI = new ApplicationUpdaterUI(); 

    В JavaScript используйте следующий программный код.

    var appUpdater = new runtime.air.update.ApplicationUpdaterUI(); 

    Возможно, потребуется добавить этот код в функцию инициализации, которая выполняется при загрузке приложения.

  3. Создайте текстовый файл с именем updateConfig.xml и добавьте к нему следующий код:

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

    Отредактируйте элемент URL файла updateConfig.xml в соответствии с фактическим местоположением файла дескриптора на веб-сервере (см. следующую процедуру).

    Свойство delay указывает число дней, которое приложение ждет, прежде чем выполнить следующую проверку наличия обновлений.

  4. Добавьте файл updateConfig.xml к каталогу проекта своего приложения AIR.

  5. Проверьте ссылку на файл updateConfig.xml в объекте Updater и вызовите для него метод initialize().

    В ActionScript используйте следующий программный код.
    appUpdater.configurationFile = new File("app:/updateConfig.xml"); 
    appUpdater.initialize();
    В JavaScript используйте следующий программный код.
    appUpdater.configurationFile = new air.File("app:/updateConfig.xml"); 
    appUpdater.initialize();
  6. Создайте вторую версию приложения AIR, отличающуюся номером версии от первого приложения. (Версия указывается в файле дескриптора приложения, в элементе version.)

Затем добавьте обновленную версию приложения AIR на веб-сервер.

  1. Поместите на веб-сервер обновленную версию файла AIR.

  2. Создайте текстовый файл с именем updateDescriptor.2.5.xml и добавьте к нему следующий код:

    <?xml version="1.0" encoding="utf-8"?> 
         <update xmlns="http://ns.adobe.com/air/framework/update/description/2.5"> 
           <versionNumber>1.1</versionNumber> 
           <url>http://example.com/updates/sample_1.1.air</url> 
           <description>This is the latest version of the Sample application.</description> 
        </update>

    Отредактируйте значения versionNumber, URL и description в файле updateDescriptor.xml для соответствия с обновленным файлом AIR. Данный формат дескриптора обновления используется приложением, в которых применяется инфраструктура обновления, включенная в пакет AIR 2.5 SDK (и более поздние версии).

  3. Создайте текстовый файл с именем updateDescriptor.1.0.xml и добавьте к нему следующий код:

    <?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://example.com/updates/sample_1.1.air</url> 
           <description>This is the latest version of the Sample application.</description> 
        </update>

    Отредактируйте значения version, URL и description в файле updateDescriptor.xml для соответствия с обновленным файлом AIR. Данный формат дескриптора обновления используется приложением, в которых применяется инфраструктура обновления, включенная в пакет AIR 2 SDK (и более ранние версии).

    Примечание. Второй файл дескриптора обновления требуется создавать только в случаях, когда реализуется поддержка обновлений для приложений, разработанных с помощью версий до AIR 2.5.
  4. Добавьте файлы updateDescriptor.2.5.xml и updateDescriptor.1.0.xml в тот же каталог на веб-сервере, в котором содержится файл обновления AIR.

Это простейший пример, но в нем показано, как работает функция обновления, очень важная для многих приложений. В оставшейся части этого документа описывается, как оптимально использовать инфраструктуру обновления.

Другой пример использования инфраструктуры обновления см. в следующих демонстрационных приложениях в центре разработки Adobe AIR:

Обновление до AIR 2.5

Поскольку начиная с версии AIR 2.5 были изменены правила назначения номеров версии, инфраструктура обновления AIR 2 не может обрабатывать информацию о версии, указанную в дескрипторе приложений AIR 2.5. По причине такой несовместимости необходимо обновить приложение для использования новой инфраструктуры обновления, ПРЕЖДЕ чем настраивать в нем использование AIR 2.5 SDK. Таким образом, процедура обновления приложения версии более ранней, чем AIR 2.5, до версии AIR 2.5 и более поздней состоит из ДВУХ шагов. Первое обновление должно использовать пространство имен AIR 2 и включать библиотеку инфраструктуры обновления AIR 2.5 (при этом пакет приложения можно создать с помощью AIR 2.5 SDK). Второе обновление может использовать пространство имен AIR 2.5 и включать новые функции приложения.

Кроме того, можно применить промежуточное обновление, которое используется только для обновления приложения AIR 2.5 с помощью класса AIR Updater.

В следующем примере представлен процесс обновления приложения с версии 1.0 до версии 2.0. В версии 1.0 используется старое пространство имен 2.0. В версии 2.0 используется пространство имен 2.5 и новые функции, реализованные с помощью API-интерфейсов AIR 2.5.

  1. Создайте промежуточную версию приложения — версию 1.0.1 на базе приложения версии 1.0.

    1. При создании приложения используйте инфраструктуру AIR 2.5 Application Updater.

      Примечание. Используйте файл applicationupdater.swc или applicationupdater_ui.swc для Flash-приложений AIR и файл applicationupdater.swf или applicationupdater_ui.swf для HTML-приложений AIR.
    2. Создайте файл дескриптора приложения для версии 1.0.1, используя старое пространство имен и версию, как показано ниже:

      <?xml version="1.0" encoding="utf-8"?> 
          <update xmlns="http://ns.adobe.com/air/framework/update/description/2.0"> 
              <version>1.0.1</version> 
              <url>http://example.com/updates/sample_1.0.1.air</url> 
              <description>This is the intermediate version.</description> 
          </update>
  2. Создайте версию 2.0 приложения, в которой используются API-интерфейсы AIR 2.5 или пространство имен 2.5.

  3. Создайте дескриптор для обновления приложения с версии 1.0.1 до версии 2.0.

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

Определение файла дескриптора обновления и добавление файла AIR на веб-сервер

При использовании инфраструктуры обновления AIR основные сведения о доступном обновлении определяются в файлах дескрипторов обновления, хранящихся на веб-сервере. Файл дескриптора обновления является простым XML-файлом. Инфраструктура обновления, входящая в приложение, проверяет этот файл, чтобы определить, не выложена ли новая версия.

Формат файла дескриптора обновления был изменен в версии AIR 2.5. В новом формате используется другое пространство имен. Исходное пространство имен: «http://ns.adobe.com/air/framework/update/description/1.0». Пространство имен AIR 2.5: «http://ns.adobe.com/air/framework/update/description/2.5».

Приложения AIR, созданные в версии среды до AIR 2.5, могут считывать только дескриптор обновления версии 1.0. Приложения AIR, созданные с использованием инфраструктуры обновления, включенной в AIR 2.5 и более поздние версии, могут считывать только дескриптор обновления версии 2.5. По причине несовместимости версий часто требуется создавать два файла дескриптора обновления. В соответствии с логикой обновления в версиях AIR 2.5 необходимо загрузить дескриптор обновления, который использует новый формат. В более ранних версиях приложения AIR следует по-прежнему использовать исходный формат. Для каждого выпускаемого обновления требуется изменять оба файла (до тех пор, пока поддерживаются версии, созданные с помощью AIR версии до 2.5).

Файл дескриптора обновления содержит следующие данные:

  • versionNumber — новая версия приложения AIR. Используйте элемент versionNumber в дескрипторе обновления, который применяется для обновления приложений AIR 2.5. В качестве значения следует использовать строку из элемента versionNumber нового файла дескриптора приложения AIR. Если версия в файле дескриптора обновления не соответствует версии обновленного файла AIR, инфраструктура обновления вызывает исключение.

  • version — новая версия приложения AIR. Используйте элемент version в дескрипторе обновления для приложений, созданных в среде AIR до версии 2.5. В качестве значения следует использовать строку из элемента version нового файла дескриптора приложения AIR. Если версия в файле дескриптора обновления не соответствует версии обновленного файла AIR, инфраструктура обновления вызывает исключение.

  • versionLabel — удобочитаемая строка с версией, которая отображается для пользователей. Элемент versionLabel является необязательным, однако его можно указывать только в файлах дескрипторов обновлений версии 2.5. Используйте данный элемент, если в дескрипторе приложения определен элемент versionLabel, и установите для него такое же значение.

  • url — Местоположение обновленного файла AIR. Это файл, который содержит обновленную версию приложения AIR.

  • description — Подробные сведения о новой версии. Эта информация может отображаться пользователю во время выполнения обновления.

Элементы version и url обязательны. Элемент description не обязателен.

Здесь приведен пример файла дескриптора обновления версии 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>

Здесь приведен пример файла дескриптора обновления версии 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>

Если требуется определить тег description для нескольких языков, используйте несколько элементов text, определяющих атрибут 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>

Поместите файл дескриптора обновления вместе с обновленным файлом AIR на веб-сервер.

В создаваемом с дескриптором обновления каталоге templates также располагаются демонстрационные файлы дескриптора обновления. Среди них есть дескрипторы для одного языка и для нескольких языков.

Создание экземпляра объекта Updater

После загрузки инфраструктуры обновления AIR в программном коде (см. разделы «Настройка среды разработки Flex» и «Включение файлов инфраструктуры в HTML-приложение AIR») необходимо создать экземпляр объекта, как показано в следующем примере.

Пример ActionScript:

var appUpdater:ApplicationUpdater = new ApplicationUpdater();

Пример JavaScript:

var appUpdater = new runtime.air.update.ApplicationUpdater();

В предыдущем примере используется класс ApplicationUpdater (который не предоставляет интерфейса пользователя). Если требуется использовать класс ApplicationUpdaterUI (предоставляющий интерфейс пользователя), код должен быть следующим.

Пример ActionScript:

var appUpdater:ApplicationUpdaterUI = new ApplicationUpdaterUI();

Пример JavaScript:

var appUpdater = new runtime.air.update.ApplicationUpdaterUI();

В оставшихся примерах кода в этом документе предполагается, что уже создан экземпляр объекта Updater с именем appUpdater.

Настройка параметров обновления

Как класс ApplicationUpdater, так и класс ApplicationUpdaterUI можно настроить с помощью файла конфигурации, поставляемого с приложением, используя ActionScript или JavaScript.

Определение параметров обновления в файле конфигурации XML

Конфигурационный файл обновления — это XML-файл. В нем содержатся следующие элементы:

  • updateURL — Значение типа String. Задает местоположения дескриптора обновления на удаленном сервере. Разрешено любое допустимое местоположение URLRequest. Необходимо определить свойство updateURL либо с помощью файла конфигурации, либо с помощью сценария (см. раздел «Определение файла дескриптора обновления и добавление файла AIR на веб-сервер»). Необходимо определить это свойство до того, как будет использоваться объект updater (перед вызовом метода initialize() для объекта updater, описанного в разделе Инициализация инфраструктуры обновления).

  • delay — Значение типа Number. Задает интервал времени в днях (разрешены такие значения, как 0.25) для проверки наличия обновлений. Значение 0 (задаваемое по умолчанию) означает, что объект updater не выполняет периодической автоматической проверки.

Файл конфигурации для класса ApplicationUpdaterUI может содержать следующий элемент в дополнение к элементам updateURL и delay.

  • defaultUI: Список элементов dialog. Каждый элемент dialog имеет атрибут name, соответствующий диалоговому окну в интерфейсе пользователя. Каждый элемент dialog имеет атрибут visible, определяющий, видимо ли это диалоговое окно. Значение по умолчанию — true. Для атрибута name возможны следующие значения:

    • "checkForUpdate" — Соответствует диалоговым окнам «Проверка обновления», «Нет обновлений» и «Ошибка обновления»

    • "downloadUpdate" — Соответствует диалоговому окну «Загрузка обновления»

    • "downloadProgress" — Соответствует диалоговым окнам «Выполнение загрузки» и «Ошибка загрузки»

    • "installUpdate" — Соответствует диалоговому окну «Установка обновления»

    • "fileUpdate" — Соответствует диалоговым окнам «Обновление файла», «Без обновления файла» и «Ошибка файла»

  • "unexpectedError" — Соответствует диалоговому окну «Непредвиденная ошибка»

    Если установлено значение false, соответствующее диалоговое окно не отображается в ходе процедуры обновления.

Здесь приведен пример файла конфигурации для инфраструктуры 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>

Здесь приведен пример файла конфигурации для инфраструктуры ApplicationUpdaterUI, которая содержит определение элемента 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>

Укажите местоположение этого файла в свойстве configurationFile:

Пример ActionScript:

appUpdater.configurationFile = new File("app:/cfg/updateConfig.xml");
Пример JavaScript:
appUpdater.configurationFile = new air.File("app:/cfg/updateConfig.xml");

Каталог templates инфраструктуры обновления содержит демонстрационный файл конфигурации config-template.xml.

Код ActionScript или JavaScript для определения параметров обновления

Эти параметры конфигурации также могут быть установлены с помощью программного кода приложения, как в следующем примере:

appUpdater.updateURL = " http://example.com/updates/update.xml"; 
appUpdater.delay = 1;

Свойствами объекта updater являются updateURL и delay. Эти свойства определяют те же параметры, что и элементы updateURL и delay в файле конфигурации: адрес URL файла дескриптора обновления и интервал времени между проверками обновлений. Если в программном коде указывается файл конфигурации и параметры, то любое свойство, установленное в коде, переопределяет соответствующие параметры файла конфигурации.

Необходимо определить свойство updateURL либо с помощью файла конфигурации, либо с помощью сценария (см. раздел «Определение файла дескриптора обновления и добавление файла AIR на веб-сервер») прежде, чем использовать объект updater (до вызова метода initialize() объекта updater, как описано в разделе «Инициализация инфраструктуры обновления»).

Инфраструктура ApplicationUpdaterUI определяет эти дополнительные свойства объекта updater следующим образом:

  • isCheckForUpdateVisible — Соответствует диалоговым окнам «Проверка обновления», «Нет обновлений» и «Ошибка обновления»

  • isDownloadUpdateVisible — Соответствует диалоговому окну «Загрузка обновления»

  • isDownloadProgressVisible — Соответствует диалоговым окнам «Выполнение загрузки» и «Ошибка загрузки»

  • isInstallUpdateVisible — Соответствует диалоговому окну «Установка обновления»

  • isFileUpdateVisible — Соответствует диалоговым окнам «Обновление файла», «Без обновления файла» и «Ошибка файла»

  • isUnexpectedErrorVisible — Соответствует диалоговому окну «Непредвиденная ошибка»

Каждое свойство соответствует одному или нескольким диалоговым окнам в интерфейсе пользователя ApplicationUpdaterUI. Каждое свойство является логическим значением, для которого по умолчанию задано значение true. Если установлено значение false, соответствующие диалоговые окна не отображаются в ходе процедуры обновления.

Эти свойства диалоговых окон переопределяют параметры, установленные в файле конфигурации обновления.

Процесс обновления

Инфраструктура обновления AIR выполняет процесс обновления, используя следующие шаги:

  1. При инициализации объекта updater выполняется проверка, определяющая, проверялось ли наличие обновлений в течение заданного интервала задержки (см. раздел «Настройка параметров обновления»). Если проверка наличия обновлений только предстоит, процесс обновления продолжается.

  2. Объект updater загружает и интерпретирует файл дескриптора обновления.

  3. Объект updater загружает обновленный файл AIR.

  4. Объект updater устанавливает обновленную версию приложения.

Объект updater отправляет соответствующие события при завершении каждого из описанных шагов. В версии ApplicationUpdater (без интерфейса пользователя) можно отменить события, сообщающие об успешном выполнении шагов этого процесса. Если какое-то из этих событий отменяется, то отменяется и следующий шаг в процессе. В версии ApplicationUpdaterUI (с интерфейсом пользователя) объект updater открывает диалоговые окна, позволяющие пользователю отменить или выполнить каждый шаг в процессе обновления.

Если отменяется событие, можно вызвать соответствующие методы объекта updater для возобновления процесса.

По мере того как версия ApplicationUpdater объекта updater выполняет различные этапы процесса обновления, она фиксирует его текущее состояние в свойстве currentState. Для этого свойства устанавливается переменная типа string со следующими возможными значениями:

  • "UNINITIALIZED" — Объект updater не был инициализирован.

  • "INITIALIZING" — Объект updater инициализируется.

  • "READY" — Объект updater инициализирован

  • "BEFORE_CHECKING" — Объект updater еще не выполнил поиск файла дескриптора обновления.

  • "CHECKING" — Объект updater выполняет поиск файла дескриптора обновления.

  • "AVAILABLE" — Файл дескриптора обновления доступен.

  • "DOWNLOADING" — Объект updater выполняет загрузку файла AIR.

  • "DOWNLOADED" — Объект updater выполнил загрузку файла AIR.

  • "INSTALLING" — Объект updater выполняет установку файла AIR.

  • "PENDING_INSTALLING" — Объект updater инициализирован и есть неоконченные обновления.

Некоторые методы объекта updater выполняются только в определенном состоянии этого объекта.

Инициализация инфраструктуры обновления

После установки параметров конфигурации (см. раздел «Простой пример: использование версии ApplicationUpdaterUI (с интерфейсом пользователя)»), вызовите метод initialize() для инициализации обновления.

appUpdater.initialize();

Этот метод выполняет следующие действия:

  • Инициализируется инфраструктура обновления, автоматически в синхронном режиме устанавливаются все незавершенные обновления. Необходимо вызывать этот метод во время запуска приложения, поскольку при его вызове приложение может быть перезапущено.

  • Выполняется проверка, нет ли отложенных обновлений, а затем завершается их установка.

  • Если в ходе процесса обновления происходит ошибка, файл обновления и информация о версии удаляются из области хранения приложения.

  • Если истекает время задержки, начинается процесс обновления. Иначе происходит перезапуск таймера.

Вызов этого метода может привести к отправке следующих событий объектом updater:

  • UpdateEvent.INITIALIZED — Событие отправляется, когда выполнена инициализация.

  • ErrorEvent.ERROR — Событие отправляется, если в ходе инициализации произошла ошибка.

После отправки события UpdateEvent.INITIALIZED процесс обновления завершается.

При вызове метода initialize() объект updater запускает процесс обновления и выполняет все шаги, учитывая параметр задержки таймера. Однако также можно запустить процесс обновления в любой момент времени, вызвав метод checkNow() объекта updater:

appUpdater.checkNow();

Этот метод не делает ничего, если процесс обновления уже запущен. Иначе происходит запуск процесса обновления.

Объект updater может отправлять следующие события в результате вызова метода checkNow():

  • Событие UpdateEvent.CHECK_FOR_UPDATE отправляется точно перед тем, как будет предпринята попытка загрузить файл дескриптора обновления.

Если отменяется событие checkForUpdate, можно вызвать метод checkForUpdate() объекта updater. (См. следующий раздел.) Если событие не отменяется, процесс обновления выполняет проверку файла дескриптора обновления.

Управление процессом обновления в версии ApplicationUpdaterUI (с интерфейсом пользователя)

В версии ApplicationUpdaterUI (с интерфейсом пользователя) пользователь может отменить процесс с помощью кнопки «Отмена» в диалоговом окне интерфейса пользователя. Также процесс обновления можно отменить программно, вызвав метод cancelUpdate() объекта ApplicationUpdaterUI.

Можно задать свойства объекта ApplicationUpdaterUI или определить элементы в файле конфигурации обновления, указав какие подтверждения в диалоговых окнах будут отображаться объектом updater. Дополнительные сведения см. в разделе «Настройка параметров обновления».

Управление процессом обновления в версии ApplicationUpdater (без интерфейса пользователя)

Можно вызвать метод preventDefault() объектов событий, созданных объектом ApplicationUpdater, чтобы отменить шаги процесса обновления (см. раздел «Процесс обновления»). Отмена заданного по умолчанию поведения позволяет приложению отобразить сообщение пользователю, запросив у него подтверждение выполнения.

В следующих разделах описано, как продолжить процесс выполнения, если какой-либо шаг этого процесса был отменен.

Загрузка и интерпретирование файла дескриптора обновления

Объект ApplicationUpdater отправляет событие checkForUpdate перед началом процесса обновления, до того момента, как объект updater попытается загрузить файл дескриптора обновления. Если отменяется заданное по умолчанию поведение события checkForUpdate, то объект updater не загружает файл дескриптора обновления. Можно вызвать метод checkForUpdate(), чтобы возобновить процесс обновления:

appUpdater.checkForUpdate();

Вызов метода checkForUpdate() заставляет объект updater загружать и интерпретировать файл дескриптора обновления в асинхронном режиме. В результате вызова метода checkForUpdate() объект updater может отправлять следующие события:

  • StatusUpdateEvent.UPDATE_STATUS — Объект updater успешно загрузил и интерпретировал файл дескриптора обновления. Это событие имеет следующие свойства:

    • available — Логическое значение. Установите значение true, если доступна другая версия, кроме текущей версии приложения; иначе устанавливается значение false (версии совпадают).

    • version — Значение типа String. Номер версии в файле дескрипторе приложения из файла обновления

    • details — Массив. Если нет локализованной версии описания, этот массив возвращает пустую ("") в качестве первого элемента и описание в качестве второго элемента.

      При наличии нескольких версий описания (в файле дескриптора обновления), этот массив содержит несколько подмассивов. Каждый массив содержит два элемента: первый с кодом языка (таким, как "en"), а второй с соответствующим описанием (значением типа String) для этого языка. См. раздел «Определение файла дескриптора обновления и добавление файла AIR на веб-сервер».

  • StatusUpdateErrorEvent.UPDATE_ERROR — произошла ошибка, и объект updater не смог загрузить и интерпретировать файл дескриптора обновления.

Загрузка AIR-файла обновления

Объект ApplicationUpdater отправляет событие updateStatus после того, как объект updater успешно загрузит и интерпретирует файл дескриптора обновления. По умолчанию, если доступен файл обновления, должна запускаться его загрузка. Если поведение по умолчанию отменено, можно вызвать метод downloadUpdate(), чтобы возобновить процесс обновления.

appUpdater.downloadUpdate();

Вызов этого метода заставляет объект updater асинхронно загружать обновленную версию AIR-файла.

Метод downloadUpdate() может отправлять следующие события:

  • UpdateEvent.DOWNLOAD_START — Установлено соединение с сервером. При использовании библиотеки ApplicationUpdaterUI это событие открывает диалоговое окно с индикатором выполнения для отслеживания текущего состояния загрузки.

  • ProgressEvent.PROGRESS — Отправляется периодически, по мере выполнения загрузки файла.

  • DownloadErrorEvent.DOWNLOAD_ERROR — Отправляется, если произошла ошибка при подключении или загрузке файла обновления. Также отправляется в случае недопустимых HTTP-состояний (например, «404 — Файл не найден»). У этого события есть свойство errorID, целое значение, определяющее дополнительную информацию об ошибке. Дополнительное свойство subErrorID может содержать дополнительные сведения об ошибке.

  • UpdateEvent.DOWNLOAD_COMPLETE — Объект updater успешно загрузил и интерпретировал файл дескриптора обновления. Если это событие не отменено, в версии ApplicationUpdater (без интерфейса пользователя) продолжается установка обновления. В версии ApplicationUpdaterUI (с интерфейсом пользователя) пользователю предлагается диалоговое окно, позволяющее им подтвердить продолжение обновления.

Обновление приложения

Объект ApplicationUpdater отправляет событие downloadComplete после завершения загрузки файла обновления. Если поведение по умолчанию отменено, можно вызвать метод installUpdate(), чтобы возобновить процесс обновления:

appUpdater.installUpdate(file);

Вызов этого метода заставляет объект updater устанавливать обновленную версию AIR-файла. Этот метод включает один параметр, file, который является объектом File и содержит ссылку на AIR-файл, используемый для обновления.

Объект ApplicationUpdater может отправлять событие beforeInstall в результате вызова метода installUpdate().

  • UpdateEvent.BEFORE_INSTALL — Отправляется непосредственно перед установкой обновления. Иногда бывает полезно приостановить немедленную установку обновления, чтобы пользователь мог завершить текущую работу перед началом процесса обновления. Вызов метода preventDefault() объекта Event откладывает установку до следующего перезапуска, при этом никакой дополнительный процесс обновления не может быть запущен. (Сюда входят обновления, сведения о которых появляются в результате вызова метода checkNow() или в результате периодических проверок.)

Установка из произвольно выбранного AIR-файла

Можно вызвать метод installFromAIRFile() для установки обновленной версии из AIR-файла на компьютере пользователя.

appUpdater.installFromAIRFile();

Этот метод заставляет объект updater устанавливать обновленную версию приложения из указанного AIR-файла.

Метод installFromAIRFile() может отправлять следующие события:

  • StatusFileUpdateEvent.FILE_UPDATE_STATUS — Отправляется после того, как ApplicationUpdater подтвердит успешную отправку файла с помощью метода installFromAIRFile(). Это событие обладает следующими свойствами.

    • available — Установите значение true, если доступна другая версия, кроме текущей версии приложения; иначе устанавливается значение false (версии совпадают).

    • version — В этой переменной типа string указывается новая доступная версия.

    • path — Передает исходный путь к файлу обновления.

    Это событие можно отменить, если для свойства Available объекта StatusFileUpdateEvent установлено значение true. Отмена этого события отменяет процесс обновления. Вызовите метод installUpdate(), чтобы продолжить отмененное обновление.

  • StatusFileUpdateErrorEvent.FILE_UPDATE_ERROR — произошла ошибка и объект updater не смог установить приложение AIR.

Отмена процесса обновления

Можно вызвать метод cancelUpdate(), чтобы отменить процесс обновления.

appUpdater.cancelUpdate();

Этот метод отменяет любые незавершенные загрузки, удаляет любые незавершенные файлы загрузки и перезапускает таймер периодических проверок.

Этот метод не выполняет никаких действий, если инициализирован объект updater.

Локализация интерфейса ApplicationUpdaterUI

Класс ApplicationUpdaterUI обеспечивает интерфейс для выполнения процесса обновления, предоставляемый пользователю по умолчанию. Этот интерфейс пользователя содержит диалоговые окна, позволяющие запускать и отменять процесс, а также выполнять связанные действия.

Элемент description файла дескриптора обновления позволяет определить описание приложения на нескольких языках. Можно использовать несколько элементов text, определяющих атрибуты lang, как показано в следующем примере:

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

Инфраструктура обновления использует описание, которое лучше соответствует цепочке языковых настроек пользователя. Дополнительные сведения см. в разделе «Определение файла дескриптора обновления и добавление файла AIR на веб-сервер».

Разработчики Flex могут добавить поддержку нового языка непосредственно к пакету "ApplicationUpdaterDialogs".

Разработчики JavaScript могут вызвать метод addResources() объекта updater. Этот метод динамически добавляет новый пакет ресурсов для языка. Этот пакет ресурсов определяет локализованные строки для языка. Эти строки используются в различных текстовых полях диалоговых окон.

Разработчики JavaScript могут использовать свойство localeChain класса ApplicationUpdaterUI для определения цепочки локалей, используемой интерфейсом пользователя. Обычно разработчики JavaScript (HTML) используют это свойство. Разработчики Flex могут применять ResourceManager для управления цепочкой локалей.

Например, в следующем коде JavaScript определяются пакеты ресурсов для румынского и венгерского языков:

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;

Дополнительные сведения см. в описании метода addResources() класса ApplicationUpdaterUI в справочнике ActionScript® 3.0 для Adobe® Flash® Professional CS5.