음... air.swf를 이용하면 설치된 애플리케이션을 실행할 수 있으며, Adobe AIR가 설치가 되어있지 않으면 설치도 할 수 있는 기능이 있는 SWF입니다.
http://airdownload.adobe.com/air/browserapi/air.swf

음....문제점이 한쪽에서 air.swf를 로딩하고 나서 getApplicationVersion(애플리케이션이 설치되었는지 확인하는 함수)을 하고 있습니다. 그런데 다른 한쪽에서 air.swf를 로딩해서 getStatus(air가 설치되어있는지 상태값 받기)를 하면 air가 설치 되어있음에도 불구하고 available(AIR설치는 안되어있으나 설치가 가능함)을 받는 경우가 발생합니다.

그래서 더 찾아보니 우야꼬님의 글을 보다가 알았는데요. air.swf 없이도 AIR애플리케이션을 설치하고 실행할 수 있다고 한다는 글을 보았습니다. 그래서 이 현상이 버그인지 확인해보려고 직접 구현하려고 했지만........-_-
생각보다 조낸 어렵네요-_- 우야꼬님께서 ProductManager클래스를 이용해야 한다는 힌트만 주셔서 ㅠ
ProductManger는 뭐하는 놈인지 검색해도 잘 안나와요-_- 어디서 뜯어봐야하는지ㅠ 근데 이놈을 이용해서 AIR애플리케이션을 리스타트하는 프로그램을 만들 수도 있더라구요.
http://www.hufkens.net/2009/03/how-to-restart-an-air-application-from-code/
productmanager가 air프로그램 실행하고 그러는 것 같긴 한데, launch라는 함수가 있는데 이것에 대한 커맨드라인 명령어 같은 게 설명이 잘 안나왔네요 ㅠ

암튼, air.swf를 로딩해서 getApplicationVersion을 무한 반복하는 애플리케이션을 만들고, 그걸 2개를 띄워볼께요-_-
AirService.as
[code]package
{
    import flash.display.Loader;
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.net.URLRequest;
    import flash.system.ApplicationDomain;
    import flash.system.LoaderContext;
   
    public class AirService extends EventDispatcher
    {
        private var _loader:Loader;
        public var _service:Object;
       
        public function AirService()
        {
            _loader = new Loader();
            var context:LoaderContext = new LoaderContext();
            context.applicationDomain = ApplicationDomain.currentDomain;
            _loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler);
            var swf:String = "http://airdownload.adobe.com/air/browserapi/air.swf";
            var request:URLRequest = new URLRequest(swf);
            _loader.load(request, context);
        }
       
        private function initHandler(event:Event):void
        {
            _service = _loader.content;
            dispatchEvent(new Event(Event.COMPLETE));
        }
       
        public function getStatus():String {
            return _service.getStatus();
        }
       
        public function getApplicationVersion(applicationId:String, publisherId:String, callback:Function):void
        {
            _service.getApplicationVersion(applicationId, publisherId, callback);
        }
       
        public function installApplication(url:String, runtimeVersion:String, parameters:Array = null):void
         {
            _service.installApplication(url, runtimeVersion, parameters);        
         }
        
         public function launchApplication(applicationId:String, publisherId:String, parameters:Array = null):void
         {
             _service.launchApplication(applicationId, publisherId, parameters);
         }
    }
}[/code]
Main.mxml
[code]<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="vertical" verticalAlign="middle"
    applicationComplete="applicationCompleteHandler()" width="100%" height="100%">
   
    <mx:Script>
        <![CDATA[
            import adobe.utils.ProductManager;
           
            private var airService:AirService;
           
            private function applicationCompleteHandler():void
            {
                airService = new AirService();
                airService.addEventListener(Event.COMPLETE, completeHandler);
            }
           
            private function completeHandler(event:Event):void
            {
                trace(airService.getStatus());
                ta.text += airService.getStatus() + "\n";
                if (airService.getStatus() == "installed")
                {
                    airService.getApplicationVersion("AirApplication",
                        "2D0F512A27635B8D26E3FE2622F4AAEDDA9D3CFC.1",
                        applicationVersion);
                }
            }
           
            private function applicationVersion(version:String):void
            {
                trace("version=" + version + ", status = " + airService.getStatus());
                ta.text += "version=" + version + ", status = " + airService.getStatus() + "\n";
                ta.verticalScrollPosition = ta.maxVerticalScrollPosition;
                airService.getApplicationVersion("AirApplication",
                    "2D0F512A27635B8D26E3FE2622F4AAEDDA9D3CFC.1",
                    applicationVersion);
            }
           
        ]]>
    </mx:Script>
    <mx:TextArea id="ta" height="100%" width="50%"/>
</mx:Application>[/code]
두개를 띄워보면
사용자 삽입 이미지
한놈은 available을 받습니다-_- 왜그러지-_-
대체 getApplicationVersion에서 어떤 일을 하는지 궁금해지기 시작했습니다.

그래서 대처 방법으로는....-_- getApplicationVersion을 동시에 하지 않으면 돼요-_- 사용자가 클릭할 때 하면 되는데, 이렇게 되면 launchApplication을 할 때에 또 클릭해줘야 해요. launchApplication은 사용자 액션에 의해서만 되더라구요.

PS. 혹시......이 글을 보게 되시는 분들중에서.....AIR애플리케이션을 launch하는 사이트를 목격 하시면 댓글 달아주세요ㅠ

 
Posted by 머드초보

댓글을 달아 주세요

  1. 장문영 2009.06.04 15:57  댓글주소  수정/삭제  댓글쓰기

    http://msp.skbroadband.com 공인인증서 로그인 누르세요
    현재도 개발중이며 계속 버전업 중입니다.
    저도 이 현상을 겪었었습니다.우야꼬님 방명록에 물어봤던 흔적이 아직도 있을거에요...답변은 못들었지만-_-;

    추가로 air.swf 로딩을 하지않고 웹에서 Air를 launch 시키는 방법을 알게 되시면 포스팅 좀 해주세요 ㅎㅎ

    • 머드초보 2009.06.05 09:34  댓글주소  수정/삭제

      air.swf를 두군데서 로딩하나봐요
      저희도 두군데서 로딩을 해야해서 문제가 발생했는데,
      그냥 한개 로딩완료 후 다음swf에서 로딩하는 방식으로
      변경했었습니다^^
      공인인증서를 air로 하다니 대단하네요 ^^

  2. BlogIcon 우야꼬 2009.12.30 10:49  댓글주소  수정/삭제  댓글쓰기

    아이고 요즘 정신이 없어서 제대로된 포스팅을 못하고 있는데
    조만간 ProductManager에 대해서 제가 아는대로 한번 올려볼께요. ㅠ.ㅠ
    글 올리고나서 트랙백 쏘겠슴돠~ ㅎㅎ

    • 머드초보 2009.12.31 12:46  댓글주소  수정/삭제

      앗~ 우야꼬님 반갑습니다^^
      감사해요~
      아직도 저희사이트에서 AIR재설치 문제가 발생해서-_-
      저도 좀 알아보니까 getApplicationversion할 때 air.swf에서 로컬커넥션으로 어디다가 쏘는 것 같더라구요.
      음 그 과정에서 좀 문제가 생기는 것 같은데...
      암튼, 해보시면 알려주세요 ㅠㅠ

  3. 무로 2010.05.25 17:59  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 요즘 AIR 2.0에서 air.swf를 이용해서 PC의 AIR Application을 실행하는
    프로그램을 개발하는 중에 AIR 2.0 Runtime이 설치되어 있음에도 불구하고 getStatus 함수에서
    계속 "available" 문자열만 리턴하는 문제가 있어 여기까지 찾아오게 되었습니다~

    위에 포스팅하신 내용과는 조금 다른것 같지만 현상은 거의 동일해서
    제가 발견한 오류를 기록하고 가겠습니다 ^^;

    제가 발견한 오류는 AIR 2.0 Runtime을 PC에 바로 설치하였을 때 발생하였습니다.
    무슨 말씀이냐면 AIR 1.5 Runtime을 설치하고 AIR 2.0(정확히는 rc1) Runtime으로 업데이트하면
    getStatus 함수에서 "installed"라는 문자열을 리턴했지만 테스트를 하기 위해서 다른 PC에
    AIR 2.0 Runtime을 바로 설치했을 때는 계속해서 "available" 문자열만 리턴하였습니다.

    AIR 1.5 Runtime을 설치했을 때는 "C:\Documents and Settings\username\Application Data\Macromedia\Flash Player\www.macromedia.com\bin\airappinstaller" 디렉토리에 파일이 생성되던데 여기 있는 파일이 없을 경우 문제가 되더군요....
    AIR 2.0 Runtime을 바로 설치하였을 경우에는 디렉토리와 파일이 생성되지 않았으며 다른 PC에 있는 파일을 복사하면 "installed"가 리턴되었습니다.
    정식 릴리즈가 나오면 해결될지 모르겠습니다...

    오늘 급하게 확인한 것이라 정확한지는 모르겠지만
    같은 원인으로 고생하시는 분이 계실까봐 몇 자 적고 갑니다.

    PS. 블로그에서 많은 도움 받고 갑니다. 감사해요~ ^^

    • 머드초보 2010.06.03 18:07  댓글주소  수정/삭제

      저희사이트는 요즘도 발생해서 ㅠㅠ
      아직도 왜그런지 모르겠어요 ㅠㅠ

  4. 아무개 2011.11.18 10:03  댓글주소  수정/삭제  댓글쓰기

    airSWF.getApplicationVersion(appID, pubID, versionDetectCallback);
    function versionDetectCallback(version:String):void {
    trace(version);
    }

    이렇게 쓰는듯.