トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   ActionScript 3.0 特設会議室
     air自動アップデートでAIR ファイルが破損しているというエラーがきえません
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
1010real
Åê¹ÆNo.43619
投稿日時: 2009-10-5 17:53
新米
居住地: 東京
投稿: 5
使用環境:
WinXP, Flash CS4,CS3
air自動アップデートでAIR ファイルが破損しているというエラーがきえません
現在、AIRアプリを作成しており、air update frameworkを使って、AIRアプリ起動時に自動アップデートを試みているのですが、一箇所どうしてもわからない場所がありましたので、投稿させていただきました。

現象としては、バージョンチェック→ファイルのダウンロードまでは正常に行われるのですが、ダウンロードしたAIRファイルのインストール中に
「エラーが発生しました。

AIR ファイルが破損しているためアプリケーションをインストールできませんでした。アプリケーション作成者に問い合わせて、新しい AIR ファイルを入手してください。」

と表示されてしまい、一度もアップデートに成功したことがありません。

パブリッシュしたAIRファイルを直接クリックしてインストールすることはできるので、ファイルの破損ということは無いと思います。


ググったりして、1点気になっているのがデジタル署名がどうのこうのという記事なのですが、以下の記事を参考にとりあえず自己署名証明書にて作成しているのですが、有料のものを使用しないとアップデートはできなかったりするのでしょうか?
http://www.adobe.com/jp/devnet/air/articles/signing_air_applications_05.html


また、インストールログには以下のようなエラーメッセージが表示されています。
Unpackaging to C:\Documents and Settings\XXXXX\Local Settings\Temp\flaB5.tmp
failed while unpackaging: [IOErrorEvent type="ioError" bubbles=false cancelable=false eventPhase=2 text="Error #2032" errorID=2032]

※インストールログについては以下を参考にしました。
http://www.adobe.com/jp/support/kb/ts/233/ts_233635_ja-jp.html


どなたか成功した方いましたら、ご教授いただければ幸いです。

環境はWinXP, CS4 10.0.2, AIR 1.5.2です。


以下、実装ソースです。
-------------------------------------
var appUpdater:ApplicationUpdaterUI = new ApplicationUpdaterUI();
appUpdater.configurationFile = new File("app:/updateConfig.xml");

if (appUpdater.isFirstRun) {
return;
}

appUpdater.addEventListener(UpdateEvent.INITIALIZED, onInitialized);

appUpdater.initialize();
-------------------------------------

上記asファイル内で読み込んでいる updateConfig.xml の内容です。
----------------------------------
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns="http://ns.adobe.com/air/framework/update/configuration/1.0">
<url>http://xxxxxx/updateDescriptor.xml</url>
<delay>1</delay>
<defaultUI>
<dialog name="checkForUpdate" visible="false" />
<dialog name="downloadUpdate" visible="true" />
<dialog name="downloadProgress" visible="true" />
</defaultUI>
</configuration>
-----------------------------------

上記updateConfig.xmlファイル内で指定しているupdateDescriptor.xml の内容です。
----------------------------------
<?xml version="1.0" encoding="utf-8"?>
<update xmlns="http://ns.adobe.com/air/framework/update/description/1.0">
<version>0.0.2</version>
<url>http://xxxxxx/test.air</url>
<description>
<text xml:lang="en">description for english</text>
<text xml:lang="ja">日本語の説明</text>
</description>
</update>
-----------------------------------

とても長文で申し訳ありません。
とりあえず、自分で調べた限りのことは記しました。

何卒よろしくお願いいたします


----------------
ブログやってます。よろしくお願いします
http://1010real.hateblo.jp/

1010real
Åê¹ÆNo.43652
投稿日時: 2009-10-8 15:51
新米
居住地: 東京
投稿: 5
使用環境:
WinXP, Flash CS4,CS3
Re: air自動アップデートでAIR ファイルが破損しているというエラーがきえません
自己回答です。

原因としましては、アップデートがある場合、ない場合どちらの場合にも、アプリの起動処理を入れてしまっていたことが原因だったようです。

起動処理の内容にもよると思うのですが、基本的にはアップデートをしない場合にのみ、続きの処理を実行する様にすべきだったみたいです。

具体的には以下を追加しました。
-------------------------------------
//initialize呼び出し前に追加
appUpdater.addEventListener(StatusUpdateEvent.UPDATE_STATUS, onUpdateStatus);

private function onUpdateStatus( e:StatusUpdateEvent ) {
if (!e.available) {

////// ここに起動時処理 ///////

}
-------------------------------------

お騒がせいたしました。
今後ともよろしくお願いいたします。


----------------
ブログやってます。よろしくお願いします
http://1010real.hateblo.jp/

1010real
Åê¹ÆNo.43685
投稿日時: 2009-10-12 23:33
新米
居住地: 東京
投稿: 5
使用環境:
WinXP, Flash CS4,CS3
Re: air自動アップデートでAIR ファイルが破損しているというエラーがきえません
自己回答(その2)です。

前回の回答時に、
「起動処理の内容にもよると思うのですが、」
という記述をしていたのですが、その内容についておそらくこれだろうという部分がありましたので記入させていただきました。
(※あくまで仮説ですが。。。)

今回、アプリ起動時にタスクバーを出したくなかったため、デフォルトのNativeWindowを閉じて、新たにウインドウを生成して、そこにアプリを表示するという処理を上記の起動処理に含んでいます。

これだとアップデート処理の際に、メインのウインドウが既に閉じられていることになるのですが、ここでエラーが出ているのではないかと思っています。

おそらく、air自動アップデートでは、

「今すぐインストール」を押す

メインのウインドウを閉じる

インストール処理

という動作をしているのではないかと思います。
なので、普通にデフォルトウインドウにてアプリを動作させている場合には問題ないのではないでしょうか?

※あくまで仮説です。。。間違っていたらどなたか訂正してください。。。


----------------
ブログやってます。よろしくお願いします
http://1010real.hateblo.jp/

961832p
Åê¹ÆNo.43726
投稿日時: 2009-10-16 5:57
常連
居住地: Akiruno-shi
投稿: 155
使用環境:
 
:AS3:
- Adobe Flex SDK, Eclipse, AIR GEAR
- LB.Log AS3, Alcon2

:AS2:
- AMES(ASDT, MTASC, Eclipse, swfmill)
- Natural Entry Point Method
- LB.Log, Zeroi

Pro, Firefox, Chromium(Iron), IE

----------------
Pro,
Re: air自動アップデートでAIR ファイルが破損しているというエラーがきえません
 
自分の作成環境がFlexなので少し違ってくるかもしれませんが、ちょうど…といいますかようやく(汗笑)AIRをやってみようかなと思いはじめていたので、今回を機に挑戦してみました。

引用:
今回、アプリ起動時にタスクバーを出したくなかったため、デフォルトのNativeWindowを閉じて、新たにウインドウを生成して、そこにアプリを表示するという処理を上記の起動処理に含んでいます。

この「タスクバーに表示させたくない」という部分にフォーカスをあてて、自分もAIRアップデートフレームワークを使ってみることに。
まずは「AIR タスクバー 非表示」で検索してみると、エントリーした自身の visibleプロパティ を false にする事でタスクバーには表示されなくなる事がわかり、自環境でも確認できました。

アップデート時のダイアログはタスクバーに表示されてしまいますが、兄弟ウインドウ(?)の作成時は typeプロパティ を NativeWindowType.NORMAL 以外にするとタスクバーには表示されない事がわかりました。
自分にはタスクバーに何にも表示されないのが少し不安だったので、検索時に知ったタスクトレイに表示させる処理を加えることに。実行すると何だか常駐ソフトみたいです(笑)。

Adobe Flex SDK 3.4.0.9271 で作成、WinXP Pro SP3 + Adobe AIR 1.5.2.8900 で動作確認しました。
 ・サンプル実行時のスクリーンショット
 ・サンプルのインストールページ

サンプルのAIRパッケージへの署名には、SDK付属のadtコマンドで生成した自己署名証明書を使用しています。
Thawte社の無料で発行している個人証明書がコード署名にも使えるという情報があったので申請してみるも途中から先に進めず、どうやら受付は終了しているもようです…残念。
 ・Thawteのデジタル証明書無料発行サービスが終了 - スラッシュドット・ジャパン
コード署名に使える無料の証明書が他にもあるのか気になりました。

…また日記みたいになってしまい、まともな回答になっていないのですが(汗)、ウインドウを閉じずに、visibleプロパティを使ってタスクバーに表示させない方法を試してみるのはどうでしょうか?

サンプルのソースコード

package{
    import my.Log;
    import my.FlexDefaultComponents;
    import my.AIRDefaultComponents;
    … 省略 …
    //========================================================================//
    public class Main extends WindowedApplication{
        private var m_appUpdater:ApplicationUpdaterUI;
        //--------------------------------------------------------------------//
        public function Main() {
            super();
            FlexDefaultComponents.stylesInit();
            AIRDefaultComponents.stylesInit();
            this.visible = false; // 自身は非表示に
            this.addEventListener(FlexEvent.APPLICATION_COMPLETE, onApplicationComplete, false, 0, true);
        }
        //--------------------------------------------------------------------//
        private function onApplicationComplete(a_event:FlexEvent):void{
            Log.trace("i onApplicationComplete:" + a_event);
            //アップデートフレームワークの準備
            m_appUpdater = new ApplicationUpdaterUI();
            m_appUpdater.configurationFile = new File("app:/update_conf.xml");
            m_appUpdater.addEventListener(UpdateEvent.INITIALIZED, onInitialized);
            m_appUpdater.addEventListener(ErrorEvent.ERROR, onError);
            m_appUpdater.addEventListener(StatusUpdateEvent.UPDATE_STATUS, onUpdateStatus);
            m_appUpdater.initialize();
            //アプリケーション記述ファイル(application.xml)の中身を
            var appDesc:XML = NativeApplication.nativeApplication.applicationDescriptor;
            var ns:Namespace = appDesc.namespace();
            //タスクトレイ(WinOS)
            if (NativeApplication.supportsSystemTrayIcon) {
                var sysTrayIcon:SystemTrayIcon = NativeApplication.nativeApplication.icon as SystemTrayIcon;
                sysTrayIcon.tooltip = appDesc.ns::name.ns::text + " " + appDesc.ns::version;
                //メニュー
                var menu:NativeMenu = new NativeMenu();
                var item:NativeMenuItem = new NativeMenuItem("終了");
                item.addEventListener(Event.SELECT, onSelect, false, 0, true);
                menu.addItem(item);
                sysTrayIcon.menu = menu;
                //アイコン
                var icon16x16:BitmapData = new BitmapData(16, 16, false, 0xFFFF0000);
                sysTrayIcon.bitmaps = new Array(icon16x16);
            }
            //ウインドウ
            var options:NativeWindowInitOptions = new NativeWindowInitOptions();
            options.systemChrome = NativeWindowSystemChrome.STANDARD;
            options.transparent = false;
            options.type = NativeWindowType.UTILITY;
            var window1:NativeWindow = new NativeWindow(options);
            window1.title = appDesc.ns::name.ns::text + " - NativeWindowクラス";
            window1.width = 320;
            window1.height = 240;
            window1.activate();
            //ウインドウ(Flex)
            var window2:Window = new Window();
            window2.setStyle("backgroundColor", 0xFFFFFF);
            window2.setStyle("paddingTop", 6);
            window2.setStyle("paddingLeft", 6);
            window2.systemChrome = NativeWindowSystemChrome.STANDARD;
            window2.transparent = false;
            window2.type = NativeWindowType.UTILITY;
            window2.title = appDesc.ns::name.ns::text + " - Windowクラス+システムクロム";
            window2.width = 320;
            window2.height = 240;
            window2.open();
            window2.move(window1.x+50, window1.y+50);
            //ボタン
            var button:Button = new Button();
            button.label = "更新チェック";
            button.addEventListener(MouseEvent.CLICK, onClick, false, 0, true);
            window2.addChild(button);
        }
        //--------------------------------------------------------------------//
        private function onClick(a_event:MouseEvent):void{
            Log.trace("i onClick:" + a_event);
            //更新チェック
            m_appUpdater.checkNow();
        }
        //--------------------------------------------------------------------//
        private function onSelect(a_event:Event):void {
            Log.trace("i onSelect:" + a_event);
            //終了
            NativeApplication.nativeApplication.icon.bitmaps = [];
            NativeApplication.nativeApplication.exit();
        }
        //--------------------------------------------------------------------//
        private function onInitialized(a_event:UpdateEvent):void{
            Log.trace("i onInitialized:" + a_event);
        }
        private function onError(a_event:ErrorEvent):void{
            Log.trace("i onError:" + a_event);
        }
        private function onUpdateStatus(a_event:StatusUpdateEvent):void{
            Log.trace("i onUpdateStatus:" + a_event);
        }
    }
}


----------------
:961832p:
- だんだんAS3に慣れてきた“なんちゃって”AMES使いの日曜プログラマー

1010real
Åê¹ÆNo.43743
投稿日時: 2009-10-19 16:41
新米
居住地: 東京
投稿: 5
使用環境:
WinXP, Flash CS4,CS3
Re: air自動アップデートでAIR ファイルが破損しているというエラーがきえません
ありがとうございます!!
961832pさんのやり方で見事にアップデート処理を行うことができました!

引用:
ウインドウを閉じずに、visibleプロパティを使ってタスクバーに表示させない方法を試してみるのはどうでしょうか?

メインのウインドウを閉じなくてもvisible=falseでタスクバーに表示されなくなるんですね。まさに目から鱗でした。
この方法だと、確かにエラーが出なくなりました!

実は、前の自己返答後、
「今すぐインストール」が押された場合 → 起動処理しない
それ以外の場合 → 起動処理を行う
と考えて色々試していたのですが、ApplicationUpdaterUIクラスには、ダイアログで何のボタンが押されたかを取得するイベントが全く無くて、押されたボタンによって処理を変える事ができなかったです。

おそらく押されたボタンによって処理を変える等の処理を行うにはApplicationUpdaterクラスを使って、1から組み立てるしかないのだと思って正直愕然としていました。
なのですごく助かりました!

引用:
検索時に知ったタスクトレイに表示させる処理を加えることに。実行すると何だか常駐ソフトみたいです(笑)。

今回まさにその常駐ソフト的な感じのものを作りたかったので、タスクトレイ化もしてました。それも原因なのかなと一時期は疑ってたりしたんですが、全く関係なかったです(笑)

引用:
コード署名に使える無料の証明書が他にもあるのか気になりました。

確かに気になりますね。ググってもあまり「これ」っていう情報出てこないんで。。。

以下、とりあえず、自分がアップデートに成功したソースです。
961832pさんのやり方を参考に、新しく作ったウインドウが閉じられた際に、アプリケーション自体が終了する処理を入れてみました。

引用:

package
{
import air.update.events.DownloadErrorEvent;
import air.update.events.StatusFileUpdateErrorEvent;
import air.update.events.StatusUpdateErrorEvent;

...省略...

import air.update.ApplicationUpdaterUI;

public class DummyWindow {
private var stage:Stage;
private var mainWindow:NativeWindow;
private var appUpdater:ApplicationUpdaterUI;

public function DummyWindow (mc) {
stage = mc.stage;

updateCheck();

}

private function updateCheck() {
appUpdater = new ApplicationUpdaterUI();
appUpdater.configurationFile = new File("app:/updateConfig.xml");

appUpdater.addEventListener(StatusUpdateEvent.UPDATE_STATUS, onUpdateStatus);
appUpdater.addEventListener(UpdateEvent.INITIALIZED, onUpdateEventHandler);

appUpdater.addEventListener(DownloadErrorEvent.DOWNLOAD_ERROR, onDownloadError);
appUpdater.addEventListener(ErrorEvent.ERROR, onError);
appUpdater.addEventListener(StatusFileUpdateErrorEvent.FILE_UPDATE_ERROR, onFileUpdateError);
appUpdater.addEventListener(StatusUpdateErrorEvent.UPDATE_ERROR, onUpdateError);

appUpdater.initialize();

createWindow();
}

private function onUpdateEventHandler ( e:UpdateEvent ) {
appUpdater.checkNow();
}

private function onUpdateStatus( e:StatusUpdateEvent ) {

}

private function onDownloadError( e:DownloadErrorEvent ) {
trace(e);
}

private function onError( e:ErrorEvent ) {
trace(e);
}

private function onFileUpdateError( e:StatusFileUpdateErrorEvent ) {
trace(e);
}

private function onUpdateError( e:StatusUpdateErrorEvent ) {
trace(e);
}

// 新たにウインドウ作成
private function createWindow() {
var option:NativeWindowInitOptions = new NativeWindowInitOptions();
option.type = NativeWindowType.UTILITY;
option.systemChrome = NativeWindowSystemChrome.NONE;
option.transparent = true;
option.maximizable = false;
option.minimizable = false;
option.resizable = false;
mainWindow = new NativeWindow(option);
mainWindow.title = "xxxx";
mainWindow.stage.align =StageAlign.TOP_LEFT;
mainWindow.stage.scaleMode = StageScaleMode.NO_SCALE;
var mainContent:MovieClip = new MainMC(); //MainMCがメインのコンテンツ
mainWindow.stage.addChild(mainContent);
mainWindow.activate();
mainWindow.visible = true;

NativeApplication.nativeApplication.addEventListener(Event.ACTIVATE, activateHandler);
NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, deactivateHandler);

mainWindow.stage.nativeWindow.addEventListener(Event.CLOSE, closeHandler);

}

// アプリケーションがアクティブ化された際に、新しく作ったウインドウをアクティブ化
private function activateHandler( e:Event ) {
NativeApplication.nativeApplication.activate(mainWindow);
}

private function deactivateHandler( e:Event ) {

}

//新しく作ったウインドウが閉じられた際にアプリケーションを終了
private function closeHandler( e:Event ) {
NativeApplication.nativeApplication.exit();
}
}
}


上記の部分だけだとそんなに変わらない印象なんですけど、実際、flexとflashだときっと結構違うんですよね。。。
air開発はflexの方が分があるっていう話を良く聞くので、自分もflex勉強しなきゃなと思う今日この頃です。


----------------
ブログやってます。よろしくお願いします
http://1010real.hateblo.jp/

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops