Adobe Air 자동 업데이트

프로그래밍/Adobe Air | 2010. 8. 24. 18:04
Posted by 애니스
데스크톱 위젯을 Air로 만들다 보니 가장 중요한 자동 업데이트 기능이 필요하다.

ApplicationUpdaterUI를 사용하여 간단하게 만들어 보았다.

ApplicationUpdaterUI은 UI를 제공하여 준다.

( 디자인 감각이 완전 꽝이라 걱정했는데 별 부담 없음. ㅋ )
<?xml version="1.0" encoding="utf-8"?>

<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" >

 <mx:Script>
  <![CDATA
   import air.update.ApplicationUpdaterUI;
   import air.update.events.UpdateEvent;
    // 업데이트 폼 객체 생성   
  private static var updater:ApplicationUpdaterUI = new ApplicationUpdaterUI();
   // 설정 정보를 담은 xml파일을 File 객체로 생성
   private static var configFile:File = new File("app:/update-config.xml");
   
   // xml에 담긴 설정 정보를 업데이트 폼 객체에 적용
   updater.configurationFile = configFile;
   
   //초기화시 시간이 걸리므로 바로 updater.checkNow()를 실행시키면 메소드가 동작하지 않는다.
   //이벤트를 사용하여 처리하여야 할 것 같음...
   updater.addEventListener(UpdateEvent.INITIALIZED, initializedUpdateEventHandler);
   
   //설정 정보에 맞춰 업데이트 폼 객체의 초기화
   updater.initialize();
   
   //updater 초기화 후 동작하는 함수
   private static function initializedUpdateEventHandler(event:UpdateEvent):void {
    updater.checkNow();
   }
</mx:Script>
</mx:WindowedApplication>


여기서 가장 중요한 부분은 아래 부분이 될 것이다.
  //설정 정보에 맞춰 업데이트 폼 객체의 초기화
   updater.initialize();
   // updater.checkNow();
이게 update-config.xml파일의 설정을 읽어 들여 초기화 하는 부분이다.
처음에는 초기화 후에 바로 updater.checkNow()를 실행시켜 업데이트 확인을 할려고 하였으나,
정상동작 하지 않았다.
checkNow는 초기화가 완료된 후에 동작을 하는데, 바로 아랫줄에서 실행을 시키면 안된다.
아마도 initialize 이놈이 쓰래드로 돌아가는 것일까? ㅋ
깊게 들어가는 것이 아니라서 패스!!

해결 방법은 updater객체에 업데이트 완료 이벤트를 걸어 처리하였다.
내용은 아랫부분 참조!!

updater.addEventListener(UpdateEvent.INITIALIZED, initializedUpdateEventHandler);

이벤트 완료 후 돌아가는 initializedUpdateEventHandler 함수에는 checkNow  밖에 없다.
private static function initializedUpdateEventHandler(event:UpdateEvent):void {
    updater.checkNow();
   }




위 내용에서 업데이트 정보 및 설정에 관한 내용은 아래 내용을 확인하면 된다.

    // 설정 정보를 담은 xml파일을 File 객체로 생성
   private static var configFile:File = new File("app:/update-config.xml");

여기서 update-config.xml 파일의 경로에 app:/를 설정하였는데, 이 경로는 src폴더를 지칭하는 것 같다.
( 아직 배운지 얼마 안되서 정확한 내용은 잘 모른다. ㅋ )

그럼 update-config.xml 파일 내용을 살펴보자.

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns="http://ns.adobe.com/air/framework/update/configuration/1.0" >
 <!-- 최신 업데이트가 있는지 확인할 수 있는 서버측 xml //-->
 <url>http://localhost/wizet/update.xml</url>
 <delay>1</delay>
 <defaultUI>
 <!-- 상기 설정에 관한 자세한 정보는 검색을 이용  //-->
  <dialog name="checkForUpdate" visible="false" />
  <dialog name="downloadUpdate" visible="true" />
  <dialog name="downloadProgress" visible="true" />
  <dialog name="installUpdate" visible="true" />
  <dialog name="fileUpdate" visible="true" />
  <dialog name="unexpectedError" visible="true" />
 </defaultUI>
</configuration>

중요한 부분은 아니지만 defaultUI의 checkForUpdate옵션을 짚고 넘어가자.

checkForUpdate는 업데이트 가능 여부에 상관없이 업데이트 확인창을 말한다.

즉. 업데이트가 없더라도 무조껀 업데이트 확인을 하게 되어 있어 불편하였다.

그래서 false로 옵션을 바꾸니 업데이트가 있을 경우만 창이 뜬다.

다른 옵션은 확인 안해봤음. 아마도 업데이트시 뜨는 UI창의 실행여부 일 것이다.


가장 중요한 부분은 URL에 해당하는 update.xml파일이 되겠다.
update.xml파일은 서버측에 위치하고 있으며,
서버측 업데이트 파일의 버젼 정보 및 파일의 경로가 담겨 있다.

내용을 살펴보면 버젼을 확인 할 수 있다.
updater에서 버젼을 확인하여, 업데이트 여부를 판단하며, 로컬 파일의 버젼과 서버측 update.xml파일의 version을 비교하여 처리하는 것 같다.
version은 그대로인데 서버측 파일이 바뀌더라도 업데이트를 하지 않는다.

참고1. 서버측 버젼은 프로젝트명-app.xml 파일에 version에 지정하도록 되어 있다.
참고2.

version바로 아래 서버측 air파일의 경로가 있고, description은 업데이트 팝업창 오픈시 상세 설명이라 보면 될 것이다.
<?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://localhost/wizet/wizet.air
</url>
<description><![CDATA[* Version 1.1 업데이트 내용
 1. 사용자 UI가 개선되었습니다.
]]></description>
</update>


아래는 air동작시 업데이트 창이 뜨는 화면이다.
기본 제공 UI도 그렇게 디자인이 후지거나 하지 않타 ㅋㅋ
앞으로 자주 이용해야겠음 ㅋ



 
블로그 이미지

애니스

카테고리

분류 전체보기 (10)
프로그래밍 (10)
애니스전용 (0)