更新 AIR 應用程式

使用者可以在電腦上按兩下 AIR 檔或 (使用隱藏安裝功能) 從瀏覽器進行 AIR 應用程式的安裝或更新。Adobe® AIR® 安裝程式會管理安裝作業,並在更新現有應用程式時警告使用者

但是,您也可以使用 Updater 類別,讓已安裝的應用程式自行更新至新版本 (已安裝的應用程式可以偵測到已有新版可供下載及安裝)。Updater 類別包含 update() 方法,可以讓您指向使用者電腦上的 AIR 檔,並更新至該版本。您的應用程式必須封裝成 AIR 檔案,才能使用 Updater 類別。封裝成原生執行檔或套件的應用程式應該使用原生平台提供的更新功能。

更新 AIR 檔的應用程式 ID 和發行者 ID 都必須與要更新的應用程式相符。發行者 ID 是從簽署憑證衍生而來。更新和要更新的應用程式都必須以相同的憑證簽署。

對於 AIR 1.5.3 或更新版本,應用程式描述器檔案可包含 <publisherID> 元素。如果有任何應用程式版本是使用 AIR 1.5.2 或更早版本所開發的,您就必須使用此元素。如需詳細資訊,請參閱 publisherID

從 AIR 1.1 及更新版本開始,您可以移轉應用程式,以使用新的程式碼簽署憑證。移轉應用程式以使用新簽名,包含了同時用新的和原始的憑證來簽署 AIR 更新檔。憑證移轉是單向程序。移轉之後,只有以新憑證 (或以兩種憑證) 簽署的 AIR 檔才會被視為現有應用程式的更新。

管理應用程式更新是一項複雜的工作。AIR 1.5 含有 AdobeAIR 應用程式所適用的全新更新架構。這個架構提供了 API,以協助開發人員賦予 AIR 應用程式良好的更新能力。

您可以使用憑證移轉,從自我簽署憑證變更為商業程式碼簽署憑證,或是從自我簽署或商業憑證變更為其它憑證。如果未移轉憑證,現有使用者就必須先移除目前版本的應用程式,才能安裝新版。如需詳細資訊,請參閱變更憑證

建議您在應用程式中加入更新機制。如此一來,如果您建立了新版的應用程式,更新機制就會提示使用者安裝新版本。

安裝、更新或移除 AIR 應用程式時,AIR 應用程式安裝程式會建立記錄檔。您可以查閱這些記錄檔,判斷任何安裝問題的發生原因。請參閱安裝記錄

備註: Adobe AIR 執行階段的新版本可能包含 WebKit 的更新版本。WebKit 的更新版本可能會導致部署的 AIR 應用程式 HTML 內容發生無法預期的變更。這些變更可能會要求您更新應用程式。更新機制可通知使用者有新版的應用程式可用。如需詳細資訊,請參閱關於 HTML 環境 (適用於 ActionScript 開發人員) 或 About the HTML environment (適用於 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 檔中所指定的應用程式 ID 和發行者 ID 是否與呼叫 update() 方法之應用程式的應用程式 ID 和發行者 ID 相符 (如需有關應用程式 ID 和發行者 ID 的詳細資訊,請參閱AIR 應用程式描述器檔案)。它也會檢查版本字串是否與傳遞給 update() 方法的 version 字串相符。如果安裝程序順利完成,執行階段就會開啟新版應用程式;否則 (如果安裝程序無法完成),就會重新開啟現有 (安裝前) 版本應用程式。

若要在 Mac OS 上安裝更新版的應用程式,使用者必須具有適當的系統權限,才能在應用程式目錄內進行安裝。在 Windows 和 Linux 中,使用者必須具有系統管理權限。

如果更新版的應用程式需要更新版的執行階段,則會安裝新的執行階段版本。若要更新執行階段,使用者必須具有電腦的系統管理權限。

測試使用 ADL 的應用程式時,呼叫 update() 方法會產生執行階段例外。

關於版本字串

指定為 update() 方法的 version 參數之字串必須與要安裝 AIR 檔的應用程式描述器檔案中的 versionversionNumber 元素中的字串相符。基於安全考量,指定 version 參數為必要的程序。藉由在 AIR 檔中要求應用程式必須確認版本號碼的方式,應用程式將不會誤裝舊的版本 (舊的應用程式版本可能包含目前所安裝應用程式內已修正的安全性弱點)。應用程式也應該以已安裝應用程式中的版本字串,檢查 AIR 檔中的版本字串,以防止降級攻擊。

在 AIR 2.5 之前,版本字串可以是任何格式。例如,可以是 "2.01" 或 "version 2"。但在 AIR 2.5 或更新版本中,版本字串最多可以有三個序列,而每個序列 (以句號分隔) 中最多可有 3 位數。例如,“.0”、“1.0”和 “67.89.999” 全是有效的版本號碼。您應該在更新應用程式之前,先驗證更新版本字串。

如果 Adobe AIR 應用程式透過網路下載 AIR 檔,那麼最好制定機制,讓網路服務可透過該機制通知下載中的 Adobe AIR 應用程式版本。然後,應用程式就能使用此字串做為 update() 方法的 version 參數。如果 AIR 檔是透過其它方式取得,其中的 AIR 檔版本不明,AIR 應用程式可以檢查 AIR 檔,以判斷版本資訊 (AIR 檔是以 ZIP 壓縮的存檔檔案,而應用程式描述器檔案是存檔檔案中的第二筆記錄)。

如需有關應用程式描述器檔案的詳細資訊,請參閱AIR 應用程式描述器檔案

應用程式更新的簽署工作流程

以臨時方式發佈更新會使管理多個應用程式版本的工作變得更加複雜,也會使追蹤憑證的到期日期變得更加困難。憑證可能在您可以發佈更新之前便已過期。

Adobe AIR 執行階段會將已發佈但沒有移轉簽名的應用程式更新視為新的應用程式。使用者必須解除安裝目前的 AIR 應用程式,才能安裝應用程式更新。

若要解決此問題,請以最新的憑證將每個更新的應用程式上傳至不同的部署 URL。請包括提醒您憑證必須在 180 天的寛限期內套用移轉簽名的機制。如需詳細資訊,請參閱簽署 AIR 應用程式的更新版本

如需有關如何套用簽名的詳細資訊,請參閱 ADT 命令

執行下列工作以簡化套用移轉簽名的程序:

  • 將每個更新的應用程式上傳至不同的部署 URL。

  • 將升級描述器 XML檔案及更新的最新憑證上傳至相同的 URL。

  • 使用最新的憑證簽署更新的應用程式。

  • 透過用以簽署舊版應用程式的憑證 (位於不同 URL),將移轉簽名套用至更新的應用程式。

呈現自訂的應用程式更新使用者介面

AIR 包含預設的更新介面:

使用者初次在電腦上安裝一種應用程式版本時,一律會使用此介面,但是,您可以自行定義後續實體要使用的介面。如果您的應用程式定義了自訂的更新介面,請在目前所安裝應用程式的應用程式描述器檔案中指定 customUpdateUI 元素:

<customUpdateUI>true</customUpdateUI>

安裝應用程式後,使用者透過與已安裝應用程式相符的應用程式 ID 和發行者 ID 來開啟 AIR 檔時,執行階段就會開啟該應用程式,而不會開啟預設 AIR 應用程式安裝程式。如需詳細資訊,請參閱 customUpdateUI

應用程式可以在執行時 (也就是當 NativeApplication.nativeApplication 物件傳送 load 事件時) 決定是否 (使用 Updater 類別) 更新應用程式。如果決定更新,可以向使用者呈現本身的安裝介面 (與其標準執行介面不同)。

將 AIR 檔下載至使用者的電腦

若要使用 Updater 類別,使用者或應用程式必須先以本機方式將 AIR 檔儲存在使用者的電腦上。

備註: AIR 1.5 所具備的更新架構可協助開發人員賦予 AIR 應用程式良好的更新能力。使用這個架構可能比直接使用 Update 類別的 update() 方法簡單得多。如需詳細資訊,請參閱使用更新架構

下列程式碼會從 URL (http://example.com/air/updates/Sample_App_v2.air) 讀取 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> 

如果您的應用程式以本機方式儲存資料 (例如,存放在應用程式儲存目錄中),您可以在首次執行時,檢查先前是否已儲存任何 (舊版) 資料。

使用更新架構

管理應用程式的更新可能是非常冗長而單調的作業。Adobe AIR 應用程式更新架構提供的 API 可讓開發人員在 AIR 應用程式中提供高效的更新功能。AIR 更新架構會為開發人員執行下列工作:

  • 根據間隔時間或使用者的要求定期檢查更新

  • 從網路來源下載 AIR 檔 (更新項目)

  • 在使用者初次執行新安裝版本時提出警示

  • 確認使用者是否要檢查更新

  • 向使用者顯示新的更新版本相關資訊

  • 向使用者顯示下載進度和錯誤資訊

AIR 更新架構為您的應用程式提供了一個簡易的使用者介面樣本。此介面為使用者提供了應用程式更新的基本資訊和組態選項。您的應用程式也可以定義自訂使用者介面,以搭配此更新架構使用。

AIR 更新架構可讓您以簡單的 XML 設定檔儲存 AIR 應用程式更新版本的相關資訊。對大部分應用程式而言,設定這些組態檔並加入若干基本程式碼,便能為使用者提供完善的更新功能。

即使未使用更新架構,Adobe AIR 仍包含了 Updater 類別,可讓 AIR 應用程式使用此類別升級至新版本。此 Updater 類別可以讓應用程式升級成使用者電腦中之 AIR 檔所包含的版本。不過,升級管理所牽涉的作業,可能不僅僅是讓應用程式根據本機儲存的 AIR 檔進行升級即可。

AIR 更新架構檔案

AIR 更新架構包含在 AIR 2 SDK 的 frameworks/libs/air 目錄中。它包含以下檔案:

  • applicationupdater.swc:定義更新元件庫的基本功能,適用於 ActionScript。此版本不包含使用者介面。

  • applicationupdater.swf:定義更新元件庫的基本功能,適用於 JavaScript。此版本不包含使用者介面。

  • applicationupdater_ui.swc:定義更新元件庫的基本功能 (Flex 4 版本),包括應用程式可用來顯示更新選項的使用者介面。

  • applicationupdater_ui.swf:定義更新元件庫的基本功能 (JavaScript 版本),包括應用程式可用來顯示更新選項的使用者介面。

如需詳細資訊,請參閱以下各節:

設定您的 Flex 開發環境

AIR 2 SDK 下 frameworks/libs/air 目錄中的 SWC 檔案會定義開發 Flex 和 Flash 時可使用的類別。

若要在以 Flex SDK 進行編譯時使用更新架構,請在針對 amxmlc 編譯器進行的呼叫中納入 ApplicationUpdater.swc 或 ApplicationUpdater_UI.swc 檔案。在下列範例中,編譯器會載入 Flex SDK 目錄內 lib 子目錄中的 ApplicationUpdater.swc 檔案:

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

在下列範例中,編譯器會載入 Flex SDK 目錄內 lib 子目錄中的 ApplicationUpdater_UI.swc 檔案:

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

使用 Flash Builder 進行開發時,請在「屬性」對話方塊將 SWC 檔案加至「Flex 建置路徑」設定的「元件庫路徑」中。

請務必將 SWC 檔案複製至您要在 amxmlc 編譯器 (使用 Flex SDK) 或 Flash Builder 參考的目錄中。

將架構檔案納入 HTML 類型的 AIR 應用程式

更新架構的 frameworks/html 目錄含有下列 SWF 檔:

  • ApplicationUpdater.swf—定義更新元件庫的基本功能,無使用者介面

  • ApplicationUpdater_UI.swf—定義更新元件庫的基本功能,並提供使用者介面供您的應用程式顯示更新選項

AIR 應用程式中的 JavaScript 程式碼可以使用 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"/>

這兩個檔案中所定義的 API 將於本文件稍後的部分中描述。

基本範例:使用 ApplicationUpdaterUI 版本

更新架構的 ApplicationUpdaterUI 版本提供了基本介面,可讓您輕鬆應用於應用程式中。以下提供一個基本範例。

首先,建立一個呼叫更新架構的 AIR 應用程式:

  1. 如果您的應用程式是 HTML 類型的 AIR 應用程式,請載入 applicationupdaterui.swf 檔案:

    <script src="ApplicationUpdater_UI.swf" type="application/x-shockwave-flash"/>
  2. 在 AIR 應用程式的程式邏輯中,實體化 ApplicationUpdaterUI 物件。

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

    編輯 updateConfig.xml 檔案的 URL 元素,使其符合更新描述器檔案在您網站伺服器上的最終位置 (請參閱下一個程序)。

    delay 為應用程式檢查更新的間隔天數。

  4. 將 updateConfig.xml 檔案加入 AIR 應用程式的專案目錄。

  5. 讓 Updater 物件參照 updateConfig.xml 檔案,並呼叫物件的 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>

    編輯 updateDescriptor.xml 檔案的 versionNumberURLdescription,使其符合更新 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>

    編輯 updateDescriptor.xml 檔案的 versionURLdescription,使其符合更新 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。因此,請將您的應用程式從 2.5 以前的任何 AIR 版本更新為 AIR 2.5 或更新的版本。您需要進行「兩次」更新。第一次更新必須使用 AIR 2 命名空間,並包括 AIR 2.5 更新架構元件庫 (您仍然可以使用 AIR 2.5 SDK 來建立應用程式套件)。第二次更新可以使用 AIR 2.5 命名空間,並包括您應用程式的新功能。

您也可以使用中繼更新,不執行其他動作,只使用 AIR Updater 類別將應用程式直接更新為 AIR 2.5 應用程式。

下列範例說明如何將應用程式從 1.0 版本更新至 2.0 版本。1.0 版本使用舊的 2.0 命名空間。2.0 版本使用 2.5 命名空間,並使用 AIR 2.5 API 實作了一些新功能。

  1. 以應用程式 1.0 版本為基礎,建立應用程式的中繼版本 1.0.1。

    1. 在建立應用程式時,請使用 AIR 2.5 應用程式更新程式架構。

      備註: 若為使用 Flash 技術的 AIR 應用程式,請使用 applicationupdater.swcapplicationupdater_ui.swc,若為 HTML 類型的 AIR 應用程式,請使用 applicationupdater.swfapplicationupdater_ui.swf
    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. 針對使用 AIR 2.5 API 與 2.5 命名空間的應用程式建立 2.0 版本。

  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 2.5 之前建立的 AIR 應用程式只能讀取 1.0 版本的更新描述器。使用 AIR 2.5 或更新版本的更新程式架構所建立的 AIR 應用程式只能讀取 2.5 版本的更新描述器。因為這個版本的不相容性,您通常需要建立兩個更新描述器檔案。應用程式 AIR 2.5 版本中的更新邏輯,必須下載使用新格式的更新描述器。舊版的 AIR 應用程式必須繼續使用原始格式。您發行的每個更新都必須修改這兩個檔案 (直到您停止支援在 AIR 2.5 之前建立的版本)。

更新描述器檔案包含下列資料:

  • versionNumber—AIR 應用程式的新版本。使用更新描述器中的 versionNumber 元素來更新 AIR 2.5 應用程式。此值必須與新 AIR 應用程式描述器檔案的 versionNumber 元素中所使用的字串相同。如果更新描述器檔案中的版本號碼不符合更新 AIR 檔案的版本號碼,更新架構就會擲出例外。

  • version—AIR 應用程式的新版本。使用更新描述器中的 version 元素來更新在 AIR 2.5 之前建立的更新應用程式。此值必須與新 AIR 應用程式描述器檔案的 version 元素中所使用的字串相同。如果更新描述器檔案中的版本不符合更新 AIR 檔案的版本,更新架構就會擲出例外。

  • versionLabel—顯示給使用者看的易懂版本字串。versionLabel 為選擇性項目,但是只能在 2.5 版的更新描述器檔案中指定。如果您在應用程式描述器中使用 versionLabel,請使用它並設定為相同值。

  • url—更新 AIR 檔案的位置。此為包含 AIR 應用程式更新版本的檔案。

  • description—新版本的相關資訊。此項資訊可在更新程序中向使用者顯示。

versionurl 元素是強制性的元素。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 標籤,請使用定義 lang 特質的多個 text 元素:

<?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 應用程式),您必須實體化一個 Updater 物件,如下所示。

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();

這份文件其餘的程式碼樣本皆假設您已實體化一個名為 appUpdater 的 Updater 物件。

調整更新設定

ApplicationUpdater 和 ApplicationUpdaterUI 都可以透過應用程式所提供的設定檔進行設定,或透過應用程式中的 ActionScript 或 JavaScript 進行設定。

在 XML 設定檔中定義更新設定

更新設定檔為 XML 檔,當中可以含有下列元素:

  • updateURL— 字串。代表更新描述器在遠端伺服器上的位置。任何有效的 URLRequest 位置皆可。您必須定義 updateURL 屬性,無論是透過設定檔或透過指令碼定義皆可 (請參閱定義更新描述器檔案並將 AIR 檔案加入您的網站伺服器)。您必須先定義這個屬性才能使用更新程式 (亦即,在呼叫 Updater 物件的 initialize() 方法之前;請參閱初始化更新架構)。

  • delay—數字。代表檢查更新的時間間隔,以天數表示 (允許使用 0.25 之類的值)。值為 0 (預設) 時表示更新程式不會執行自動定期檢查。

除了 updateURLdelay 元素以外,ApplicationUpdaterUI 的設定檔還可以含有下列元素:

  • defaultUIdialog 元素清單。每一個 dialog 元素都有一個 name 特質,該特質會對應到使用者介面中的對話方塊。每一個 dialog 元素都有一個 visible 特質,該特質會定義對話方塊是否要顯示。預設值是 truename 特質的可能值包括:

    • "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 物件的屬性為 updateURLdelay。這些屬性所定義的設定,與設定檔內 updateURLdelay 元素所定義的設定相同:更新描述器檔案的 URL 以及檢查更新的時間間隔。如果您在程式碼中指定了設定檔「與」設定,則所有透過程式碼設定的屬性都優先於該屬性在設定檔中所對應的設定。

您必須透過設定檔或透過指令碼定義 updateURL 屬性 (請參閱定義更新描述器檔案並將 AIR 檔案加入您的網站伺服器),然後才可以使用更新程式 (亦即,在呼叫 Updater 物件的 initialize() 方法之前;請參閱初始化更新架構)。

ApplicationUpdaterUI 架構可定義 Updater 物件的其它屬性,包含:

  • isCheckForUpdateVisible—對應至「檢查更新」、「沒有更新」和「更新錯誤」對話方塊

  • isDownloadUpdateVisible—對應至「下載更新」對話方塊

  • isDownloadProgressVisible—對應至「下載進度」和「下載錯誤」對話方塊

  • isInstallUpdateVisible—對應至「安裝更新」對話方塊

  • isFileUpdateVisible—對應至「檔案更新」、「檔案沒有更新」和「檔案錯誤」對話方塊

  • isUnexpectedErrorVisible—對應「未預期的錯誤」對話方塊

每一個屬性都會對應到 ApplicationUpdaterUI 使用者介面中的一或多個對話方塊。每一個屬性都是一個 Boolean 值,預設值為 true。設定為 false 時,對應的對話方塊就不會在更新程序中顯示。

這些對話方塊屬性會覆寫更新設定檔中的設定。

更新程序

AIR 更新架構會透過下列步驟來完成更新程序:

  1. 更新程式初始化程序會查看更新檢查作業是否根據所定義的時間間隔執行 (請參閱調整更新設定)。如果已到執行更新檢查作業的時間,更新程序就會接著執行。

  2. 更新程式下載並解譯更新描述器檔案。

  3. 更新程式下載更新 AIR 檔案。

  4. 更新程式安裝應用程式的更新版本。

Updater 物件會在各個步驟完成時傳送事件。在 ApplicationUpdater 版本中,您可以取消各個表示程序步驟成功完成的事件。如果您取消當中的任一事件,下一個程序步驟也會遭到取消。在 ApplicationUpdaterUI 版本中,更新程式會顯示一個對話方塊,讓使用者取消或繼續進行各個程序步驟。

如果您取消了事件,則可以呼叫 Updater 物件的方法,以恢復程序。

在更新程序進行時,Updater 的 ApplicationUpdater 版本會將本身的目前狀態記錄在 currentState 屬性中。這個屬性已設定為字串,可能的值如下:

  • "UNINITIALIZED"—更新程式尚未初始化。

  • "INITIALIZING"—更新程式正在初始化。

  • "READY"—更新程式已經初始化。

  • "BEFORE_CHECKING"—更新程式尚未檢查是否有更新描述器檔案。

  • "CHECKING"—更新程式正在檢查是否有更新描述器檔案。

  • "AVAILABLE"—有可用的更新描述器檔案。

  • "DOWNLOADING"—更新程式正在下載 AIR 檔案。

  • "DOWNLOADED"—更新程式已經下載 AIR 檔案。

  • "INSTALLING"—更新程式正在安裝 AIR 檔案。

  • "PENDING_INSTALLING"—更新程式已經初始化,並有擱置中的更新。

Updater 物件的部分方法只會在更新程式處於特定狀態時執行。

初始化更新架構

在設定了組態屬性之後 (請參閱基本範例:使用 ApplicationUpdaterUI 版本),請呼叫 initialize() 方法來初始化更新:

appUpdater.initialize();

此方法會執行下列動作:

  • 初始化更新架構,以無訊息的方式同步執行所有擱置中的更新。應用程式必須在啟動時呼叫此方法,因為此方法在接受呼叫時可能會重新啟動應用程式。

  • 檢查是否有延緩的更新並加以安裝。

  • 更新程序若發生錯誤,便清除應用程式儲存區中的更新檔案和版本資訊。

  • 如果更新間隔時間已過期,便啟動更新程序。否則,便重新啟動計時器。

呼叫此方法可能會導致 Updater 物件傳送下列事件:

  • UpdateEvent.INITIALIZED—當初始化完成時即傳送。

  • ErrorEvent.ERROR—當初始化發生錯誤時即傳送。

在傳送 UpdateEvent.INITIALIZED 事件時,更新程序便宣告完成。

當您呼叫 initialize() 方法時,更新程式就會啟動更新程序,並根據時間延遲設定來完成所有步驟。不過,您也可以隨時呼叫 Updater 物件的 checkNow() 方法來啟動更新程序。

appUpdater.checkNow();

如果更新程序已經在執行,這個方法就不會產生任何結果,否則,便會啟動更新程序。

呼叫 checkNow() 方法會導致 Updater 物件傳送下列事件:

  • UpdateEvent.CHECK_FOR_UPDATE 事件會在嘗試下載更新描述器檔案前傳送。

如果您取消了 checkForUpdate 事件,則可以呼叫 Updater 物件的 checkForUpdate() 方法 (請參閱下一節)。如果您沒有取消事件,更新程序就會進行下一個步驟,開始檢查更新描述器檔案。

管理 ApplicationUpdaterUI 版本的更新程序

在 ApplicationUpdaterUI 版本中,使用者可以在使用者介面的對話方塊中按一下「取消」按鈕,取消程序。此外,您也可以透過程式設計的方式來取消更新程序,也就是呼叫 ApplicationUpdaterUI 物件的 cancelUpdate() 方法。

您可以設定 ApplicationUpdaterUI 物件的屬性,或定義更新設定檔中的元素,指定更新程式要顯示何種對話方塊以進行確認。如需詳細資訊,請參閱調整更新設定

管理 ApplicationUpdater 版本的更新程序

您可以呼叫 ApplicationUpdater 物件所傳送事件物件的 preventDefault() 方法,以取消執行更新程序中的步驟 (請參閱更新程序)。取消預設行為時,應用程式會向使用者顯示一則訊息,詢問是否要繼續。

下列各節將說明如何在程序中的步驟遭到取消時,繼續執行更新程序。

下載並解譯更新描述器檔案

ApplicationUpdater 物件會在更新程序開始前傳送 checkForUpdate 事件,也就是在更新程式嘗試下載更新描述器檔案之前。如果您取消 checkForUpdate 事件的預設行為,更新程式就不會下載更新描述檔案。您可以呼叫 checkForUpdate() 方法以繼續更新程序:

appUpdater.checkForUpdate();

呼叫 checkForUpdate() 方法會使更新程式以非同步方式下載並解譯更新描述器檔案。在呼叫 checkForUpdate() 方法後,Updater 物件可能會傳送下列事件:

  • StatusUpdateEvent.UPDATE_STATUS—更新程式已成功下載並解譯更新描述器檔案。這個事件具有下列屬性:

    • available—Boolean 值。如果有與目前應用程式不同的版本存在,則設定為 true;否則會設定為 false (表示沒有不同的版本)。

    • version—字串。更新檔案之應用程式描述器檔案的版本

    • details—陣列。如果沒有當地語系化版本的說明,此陣列便將空字串 ("") 做為所傳回的第一個元素,然後將說明做為所傳回的第二個元素。

      如果一份說明有多種版本 (位於更新描述器檔案),陣列中就會包含多個子陣列。每一個陣列都具有兩個元素:第一個元素是語言碼 (例如 "en"),第二個元素則是該語言所對應的說明 (字串)。請參閱定義更新描述器檔案並將 AIR 檔案加入您的網站伺服器

  • StatusUpdateErrorEvent.UPDATE_ERROR—發生錯誤,更新程式無法下載或解譯更新描述器檔案。

下載更新 AIR 檔案

ApplicationUpdater 物件會在更新程式成功下載並解譯更新描述器檔案之後傳送 updateStatus 事件。預設的行為是在出現可用的更新檔案時開始下載。如果您取消了預設行為,可以呼叫 downloadUpdate() 方法以繼續更新程序:

appUpdater.downloadUpdate();

呼叫這個方法會使更新程式以非同步方式下載 AIR 檔案的更新版本。

downloadUpdate() 方法可以傳送下列事件:

  • UpdateEvent.DOWNLOAD_START—與伺服器的連線已經建立。使用 ApplicationUpdaterUI 元件庫時,此事件會顯示一個含有進度列的對話方塊來追蹤下載進度。

  • ProgressEvent.PROGRESS—在檔案下載期間定期傳送。

  • DownloadErrorEvent.DOWNLOAD_ERROR—當連線或下載更新檔案發生錯誤時即傳送。此事件也會在發生無效的 HTTP 狀態時傳送 (例如「404 - 找不到檔案」)。這個事件有一個 errorID 屬性,該屬性為整數,可定義額外錯誤資訊。另一個額外的 subErrorID 屬性可能會包含更多錯誤資訊。

  • UpdateEvent.DOWNLOAD_COMPLETE—更新程式已成功下載並解譯更新描述器檔案。如果您沒有取消這個事件,ApplicationUpdater 版本就會進行下一個步驟,開始安裝更新版本。在 ApplicationUpdaterUI 版本中,會出現一個對話方塊,讓使用者選擇是否要繼續進行。

更新應用程式

當更新檔案的下載作業完成時,ApplicationUpdater 物件就會傳送 downloadComplete 事件。如果您取消了預設行為,則可以呼叫 installUpdate() 方法以繼續更新程序:

appUpdater.installUpdate(file);

呼叫這個方法會使更新程式安裝 AIR 檔案的更新版本。這個方法包含一個 file 參數,該參數是 File 物件,會參考將做為更新的 AIR 檔案。

呼叫 installUpdate() 方法會使 ApplicationUpdater 物件傳送 beforeInstall 事件:

  • UpdateEvent.BEFORE_INSTALL—在開始安裝更新前傳送。有時候,能夠避免立即安裝本次更新的做法是非常實用的,因為,這麼做的話,使用者就可以在執行更新前先完成目前的工作。呼叫 Event 物件的 preventDefault() 方法可延後安裝作業,直到下次重新啟動為止,在那之前,將不會進行其它更新程序 (包括呼叫 checkNow() 方法後或執行定期檢查後所需執行的更新)。

從任意 AIR 檔案執行安裝

您可以呼叫 installFromAIRFile() 方法,從使用者電腦上的 AIR 檔案安裝更新版本。

appUpdater.installFromAIRFile();

這個方法會使安裝程式從 AIR 檔案安裝應用程式的更新版本。

installFromAIRFile() 方法可以傳送下列事件:

  • StatusFileUpdateEvent.FILE_UPDATE_STATUS—在 ApplicationUpdater 成功驗證以 installFromAIRFile() 方法傳送的檔案後,傳送此事件。這個事件具有下列屬性:

    • available—如果有與目前應用程式不同的版本存在,則設定為 true;否則會設定為 false (表示沒有不同的版本)。

    • version—代表全新可用版本的字串。

    • path—代表更新檔案的原生路徑。

    如果 StatusFileUpdateEvent 物件的可用屬性設為 true,您便可以取消此事件。取消此事件會一併取消進行更新作業。呼叫 installUpdate() 方法可繼續執行取消的更新作業。

  • StatusFileUpdateErrorEvent.FILE_UPDATE_ERROR—發生錯誤,更新程式無法安裝 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 開發人員可以呼叫 Updater 物件的 addResources() 方法。這個方法會動態新增語言的資源組合包。資源組合包會定義某語言的當地語系化字串。這些字串將用在各個對話方塊文字欄位中。

JavaScript 開發人員可以使用 ApplicationUpdaterUI 類別的 localeChain 屬性來定義使用者介面所使用的地區鍊。一般來說,只有 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;

如需詳細資訊,請參閱語言參考中針對 ApplicationUpdaterUI 類別之 addResources() 方法的說明。