AIR アプリケーションのアップデート



ユーザは、コンピュータ上の AIR ファイルをダブルクリックするかブラウザから(シームレスインストール機能を使用して)AIR アプリケーションをインストールまたアップデートできます。Adobe® AIR™ インストーラアプリケーションによってインストールが管理され、既に存在するアプリケーションをアップデートする場合はユーザに警告が表示されます(AIR アプリケーションの配布、インストール、実行を参照してください)。

一方、Updater クラスを使用して、インストールされているアプリケーションの新しいバージョンへのアップデートをアプリケーション自体で行うこともできます(インストールされているアプリケーションで、新しいバージョンをダウンロードしてインストールできるようになったことを検出できます)。Updater クラスに含まれる update() メソッドを使用することにより、ユーザのコンピュータ上の AIR ファイルを参照してそのバージョンにアップデートすることができます。

アップデート AIR ファイルのアプリケーション ID と 発行者 ID の両方が、アップデートするアプリケーションと一致する必要があります。発行者 ID は署名者の証明書から取得します。つまり、アップデートおよびアップデートされるアプリケーションの両方を同じ証明書を使用して署名する必要があります。

AIR 1.1 では、アプリケーションを移行して新しいコード署名証明書を使用できます。アプリケーションを移行して新しい署名を使用するには、新しい証明書と元の証明書の両方を使用してアップデート AIR ファイルに署名する必要があります。証明書の移行は一方的なプロセスです。移行後は、新しい証明書(または両方の証明書)で署名した AIR ファイルのみが既存のインストールへのアップデートとして認識されます。

証明書の移行により、自己署名証明書から商用コード署名証明書に切り替えたり、自己署名証明書間または商用コード署名証明書間で切り替えたりすることができます。証明書を移行しないと、既存のユーザは現在のバージョンのアプリケーションをアンインストールしてから新しいバージョンをインストールする必要があります。詳しくは、証明書の変更を参照してください。

アプリケーションのアップデートについて

Updater クラス(flash.desktop パッケージのクラス)には、update() という 1 つのメソッドが含まれています。このメソッドを使用すると、現在実行されているアプリケーションを別のバージョンにアップデートすることができます。例えば、AIR ファイルのバージョン(「Sample_App_v2.air」)がユーザのデスクトップに保存されている場合にアプリケーションをアップデートするコードの例を次に示します。

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 ファイルのダウンロードを参照してください。

メソッド呼び出しの結果

ランタイムのアプリケーションで update() メソッドを呼び出すと、ランタイムによってアプリケーションが終了され、AIR ファイルからの新しいバージョンのインストールが試行されます。ランタイムによって、AIR ファイルで指定されたアプリケーション ID および発行者 ID が、update() メソッドの呼び出し元アプリケーションのアプリケーション ID および発行者 ID と一致するかどうかが確認されます(アプリケーション ID および発行者 ID について詳しくは、AIR アプリケーションプロパティの設定を参照してください)。さらに、バージョンストリングが、update() メソッドに渡された version ストリングと一致するかどうかが確認されます。インストールが正常に完了した場合、ランタイムによって新しいバージョンのアプリケーションが起動します。それ以外の場合(インストールを完了できなかった場合)は、既存(インストール前)のバージョンのアプリケーションが再度起動します。

Macintosh でアプリケーションのアップデートバージョンをインストールするには、アプリケーションディレクトリにインストールするための適切なシステム権限が必要です。Windows では、管理権限が必要です。

アップデートバージョンのアプリケーションで、アップデートバージョンのランタイムが必要な場合は、新しいランタイムバージョンがインストールされます。ランタイムをアップデートするためには、ユーザは対象のコンピュータの管理権限を持っている必要があります。

ADL を使用してアプリケーションをテストしているときに update() メソッドを呼び出すと、ランタイム例外が発生します。

バージョンストリングについて

update() メソッドの version パラメータとして指定するストリングは、インストールする AIR ファイルのアプリケーション記述ファイルでメイン application エレメントの version 属性に指定されたストリングと一致する必要があります。セキュリティ上の理由から、必ず version パラメータを指定する必要があります。AIR ファイルのアプリケーションのバージョン番号の確認を必須とすることで、現在インストールされているアプリケーションでは修正済みのセキュリティ上の脆弱性が含まれている可能性がある古いバージョンのアプリケーションが、誤ってインストールされることがなくなります。また、ダウングレード攻撃を回避するために、AIR ファイルのバージョンストリングとインストールされたアプリケーションのバージョンストリングが一致するかどうかをアプリケーションで確認する必要があります。

バージョンストリングは、任意の形式で指定することができます。例えば、「2.01」や「version 2」のように指定できます。このストリングの形式は、アプリケーション開発者が決定します。ランタイムではバージョンストリングの検証は行われないため、アプリケーションのアップデート前にアプリケーションコードで検証する必要があります。

Adobe AIR アプリケーションで Web 経由で AIR ファイルをダウンロードする場合の優れた方法として、ダウンロードしている Adobe AIR アプリケーションのバージョンを Web サービスで通知できるメカニズムがあります。その後、このストリングを、アプリケーションで update() メソッドの version パラメータとして使用できます。AIR ファイルをこれ以外の方法で取得した場合は AIR ファイルのバージョンが不明な場合がありますが、AIR アプリケーションで AIR ファイルを確認してバージョン情報を特定することができます(AIR ファイルは ZIP 圧縮されたアーカイブで、アプリケーション記述ファイルはそのアーカイブの 2 つ目のレコードです)。

アプリケーション記述ファイルについて詳しくは、AIR アプリケーションプロパティの設定を参照してください。

カスタムのアプリケーションアップデートユーザインターフェイスの表示

AIR には、デフォルトのアップデートインターフェイスがあります。

ユーザがアプリケーションのバージョンを最初にマシンにインストールしたときは、常にこのインターフェイスが使用されます。ただし、独自のインターフェイスを定義して以降のインスタンスに使用することができます。これを行うには、現在インストールされているアプリケーションのアプリケーション記述ファイルで customUpdateUI エレメントを指定します。

<customUpdateUI>true</customUpdateUI>

アプリケーションがインストールされ、インストールされたアプリケーションとアプリケーション ID および発行者 ID が一致する AIR ファイルがユーザによって開かれると、デフォルトの AIR アプリケーションインストーラではなくランタイムによってアプリケーションが起動します。詳しくは、アプリケーションアップデート用のカスタムユーザインターフェイスの提供を参照してください。

アプリケーションが起動されたとき(NativeApplication.nativeApplication オブジェクトから invoke イベントが送出されたとき)に、アプリケーションを(Updater クラスを使用して)アップデートするかどうかをアプリケーションで指定できます。アップデートするように指定する場合、アプリケーション独自の(標準で実行されるインターフェイスとは異なる)インストールインターフェイスをユーザに表示することができます。

ユーザのコンピュータへの AIR ファイルのダウンロード

Updater クラスを使用するには、ユーザまたはアプリケーションによって、ユーザのローカルコンピュータに AIR ファイルがあらかじめ保存されている必要があります。例えば、次のコードでは、URL(http://example.com/air/updates/Sample_App_v2.air)から AIR ファイルを読み取り、その AIR ファイルをアプリケーション記憶領域ディレクトリに保存します。

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."); 
}

詳しくは、ファイルの読み取りと書き込みのワークフローを参照してください。

アプリケーションが初めて実行されたかどうかの確認

アプリケーションのアップデートの完了後に、ユーザに「はじめに」または「ようこそ」などのメッセージを表示することができます。起動時に、メッセージを表示するかどうかを判断できるように、初めて実行されたかどうかがアプリケーションで確認されます。

そのための 1 つの方法として、アプリケーションの初期化時にファイルがアプリケーション記憶領域ディレクトリに保存されます。アプリケーションが起動されるたびに、そのファイルが存在するかどうかをアプリケーションで確認します。ファイルが存在しない場合、アプリケーションは現在のユーザに初めて実行されたことになります。ファイルが存在する場合は、既に少なくとも 1 回はアプリケーションが実行されています。ファイルが存在し、ファイルに現在のバージョン番号よりも古いバージョン番号が含まれていれば、ユーザが新しいバージョンを初めて実行していると判断できます。

次の例は、このコンセプトを示しています。

<html> 
    <head> 
        <script src="AIRAliases.js” /> 
        <script> 
            var file; 
            var currentVersion = "1.2"; 
            function init() { 
                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 prevVersion = stream.readUTFBytes(stream.bytesAvailable); 
                stream.close(); 
                if (prevVersion != 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="init()"> 
        <textarea id="log" rows="100%" cols="100%" /> 
    </body> 
</html> 

アプリケーションでデータをローカル(アプリケーション記憶領域ディレクトリなど)に保存している場合、初めて実行されたときに保存された(以前のバージョンの)データがあるかどうかを確認することができます。