따뜻한 대한민국 겨울만들기
AIR 업데이터란..

예를 하나 들어..

네이트오프을 꼈을때 가끔씩 자동으로 업데이트를 할 때가 있습니다.

AIR도 마찬가지로 배포 후 사용자들이 실행 아이콘을 클릭하면,

자동으로 버전을 체크하여 업데이트를 해주는 것을 말합니다.

그동안 작업했던 방식과는 다른 아주 신기한 방식이 아닐 수 없습니다.

그러나 없어서는 안될 기능이며 배포를 목적으로 한다면 기본사양(?)

이라고 할 수 있겠습니다.

우선 AIR UPDATER FRAMEWORK 에서 프래임웍 소스샘플을 다운받고,

air_appupdater_062408 → frameworks 폴더를 보면 swc로 된 프래임웍이 있습니다.

applicationupdater_ui.swc : 기본 지원 업데이트 UI를 사용할때.
applicationupdater.swc      : 사용자 정의 업데이트 UI를 사용할때.

이 프래임웍을 Project → Properties → Library path → Add SWC Folder 로 가서

폴더 채로 라이브러리에 추가시킵니다.



라이브러리에 추가시키면, 아래와 같은 패키지 클래스들을 사용할 수가 있겠습니다.

import air.update.ApplicationUpdater;
import air.update.events.DownloadErrorEvent;
import air.update.events.StatusUpdateErrorEvent;
import air.update.events.StatusUpdateEvent;
import air.update.events.UpdateEvent;

이제 사용하는 것만 남았습니다.


프래임웍 샘플파일 보시면...

아주 뭔소린지 모르겠습니다.

샘플 폴더에서 air_appupdater_samples_062408 → samples → Flex폴더를 보시면,

headless, simple, simple_ui, ui 이렇게 4개의 폴더가 보입니다.

이것은 업데이터의 표현방식에 따라 샘플들이 나눠져 있는 것입니다.

simple_ui 폴더는 기본 업데이터(default interface)를 사용하는 예제이고,

simple 폴더는 사용자 정의 업데이터를 사용하는 예제입니다.

저는 사용자 정의 업데이터를 만들 것이므로, simple 폴더에 있는 예제를 사용하겠습니다.

air_appupdater_samples_062408 → samples → Flex → simple → en → src → com → adobe → samples 폴더에 이 업데이터를 적용하는데에 핵심인 UpdateManager 클래스 파일이 있습니다.

UpdateManager.as 파일을 제가 아는데로 설명해 보겠습니다.

//Event metadata 태그로 Flex 컴파일러에게
//사용자 정의 이벤트(readyStateChanged)를 알린다.

[Event(name="readyStateChanged", type="flash.events.Event")]
private static const READY_STATE_CHANGED:String = "readyStateChanged";

// 업데이트를 할 준비가 되어있는지를 알리는 변수
// 값이 true 이면, 업데이트 체크를 기다리는 중이거나,
// 생행되는 파일이 최신버전이거나,
// 업데이트 체크 중 에러가 발생하였을때이고
// 값이 false이면, 업데이트 체크를 하고있는 상태를 말한다.         

private var _ready:Boolean = true;

// readyStateChanged 이벤트에 의해 _ready 값이 변경되면 _ready를 리턴한다.         
[Bindable('readyStateChanged')]
public function ready():Boolean{
     return _ready;
}
// 업데이트 할 파일이 있으면 띄우는 팝업창
private var updaterDialog:UpdaterDialog = new UpdaterDialog;

// 사용자 정의 업데이트를 위해선 ApplicationUpdater 를 클래스 사용
// 기본 지원 업테이트 UI를 위해선 ApplicationUpdaterUI 클래스를 사용
private var appUpdater:ApplicationUpdater = new ApplicationUpdater;
public function get applicationUpdater():ApplicationUpdater{
     return appUpdater;                   
}         

/**
   * Update URL : 업데이트 유무를 확인하기 위한 XML파일
   *  이 XML파일과 현재 내컴퓨터에 깔린 버전을 비교한다.
   *  그러므로 .AIR 파일이 버전업 될때마다 이 XML파일의
   *  버전도 같이 변경해야 한다.
   * 기본적으로 -app.xml 파일의 identifier id 와
   *  Build할때 필요한 Digital Signature도 비교를 한다.
   *  ex) updateURL = "
http://www.example.com/update.xml";
   */

public function set updateURL(value:String):void{
     appUpdater.updateURL = value;
}
         
public function get updateURL():String{
     return appUpdater.updateURL;
}
         
public function UpdateManager()
{
     super();
     updaterDialog.updateManager = this;

     // 업데이트 체크 기간을 설정하는 속성
     // delay = 0 이면, 이벤트가 왔을때만 체크
     // delay = 1 이면, 하루에 한번씩 체크
     // delay = 0.0001이면, 10초에 한번씩 체크
     appUpdater.delay = 0;
     appUpdater.addEventListener(UpdateEvent.DOWNLOAD_COMPLETE, onDownloadComplete);
     appUpdater.addEventListener(StatusUpdateEvent.UPDATE_STATUS, onStatusUpdate);
     appUpdater.addEventListener(StatusUpdateErrorEvent.UPDATE_ERROR, onStatusUpdateError);
     appUpdater.addEventListener(DownloadErrorEvent.DOWNLOAD_ERROR, onDownloadError);
     appUpdater.addEventListener(ErrorEvent.ERROR, onError);
              
     addEventListener(FlexEvent.PREINITIALIZE, onPreInitialize);
}

/**
   *  ApplicationUpdater을 초기화 한다
   *  초기화하면 ApplicationUpdater에 이벤트 리스너를 등록하게된다.
   *  맨 먼저 실행이 된다
   */

private function onPreInitialize(ev:FlexEvent):void{
     appUpdater.initialize();
}
/**
   *  알 수 없는 에러(-_-?)가 발생했을때 호출된다
   */
         
private function onError(ev:ErrorEvent):void{
              
}
/**
   *  update.xml 파일의 버전과 현재 깔린 버전을 비교한다.
   */

private function onStatusUpdate(ev:StatusUpdateEvent):void{
     if(!ev.available) {
          // 버전이 같으면 업데이트 할 필요가 없음을 알린다.
          Alert.show("No update is available!");
          _ready=true;
          dispatchEvent(new Event(READY_STATE_CHANGED));
     }
}
/**
   *  update.xml 파일의 문법상의 문제가 발생하였을 경우 호출된다.
   */

private function onStatusUpdateError(ev:StatusUpdateErrorEvent):void{
     ev.preventDefault();
     Alert.show("Update descriptor error!");
     _ready=true;
     dispatchEvent(new Event(READY_STATE_CHANGED));         
}
/**
   *  update.xml 파일의 버전과 서버에 올라가있는 .air 파일의 버전이
   *  일치하지 않을때 호출된다.
   */
         
private function onDownloadError(ev:DownloadErrorEvent):void{
     ev.preventDefault();
     Alert.show("Download error!");
     _ready=true;
     dispatchEvent(new Event(READY_STATE_CHANGED));
}
/**
   *  서로 버전이 다르면 서버로 부터 최신.air파일을 다운받고,
   *  다운이 완료되면 호출된다.
   *  업데이트를 할 준비가 완료된 것이다.
   *  그러므로 업데이트 의사를 묻는 사용자 정의 팝업을 띄워준다.
   */
         
private function onDownloadComplete(ev:UpdateEvent):void{
     ev.preventDefault();
     PopUpManager.addPopUp(updaterDialog, this.parent, true);
     PopUpManager.centerPopUp(updaterDialog);
}
/**
   *  사용자 정의 팝업에서 취소를 누르면 업데이트가 취소된다.
   */
         
public function cancel():void{
     PopUpManager.removePopUp(updaterDialog);
     appUpdater.cancelUpdate();
     _ready = true;
     dispatchEvent(new Event(READY_STATE_CHANGED));
}
/**
   *  사용자 정의 팝업에서 install now를 누르면 새로운 버전으로
   *  업데이트를 시작한다.
   *  업데이트가 끝난 후 자동으로 재시작 된다.
   */
         
public function installNow():void{              
     PopUpManager.removePopUp(updaterDialog);         
     appUpdater.installUpdate();         
}
/**
   *  업데이트 유무를 체크한다.
   */
              
public function checkForUpdate():void{
     appUpdater.checkNow();
     // _ready의 값을 변화시키고 readyStateChanged 이벤트를
     // 호출하였으므로 바뀐 _ready값을 리턴해준다.
     _ready = false;
     dispatchEvent(new Event(READY_STATE_CHANGED));
}

이 클래스와 simple폴더에 있는 파일들과 연계하여 어느정도 이해하시면,

활용하는건 어렵지 않을 것입니다.

예를 들어, 위의 예제는 어플리케이션을 띄운뒤 업데이트 체크 버튼을 누르면 업데이트 프로세스가

진행되는 방식이지만,

메인 어플리케이션을 띄우기 전에 자동으로 업데이트 체크를 한뒤 업데이트 유무 확인 팝업을 띄우고

그 다음 단계에 메인이 실행되는 과정으로도 만드실 수가 있겠습니다.


▶ 참고로 AIR 1.1 환경하에 기본 지원 업데이트 인터페이스를 사용하실려면,
Updating an AIR application with the Update Framework - AIR 1.1
를 보시면 되겠습니다.

※ 소스 출처 : http://labs.adobe.com/wiki/index.php/Adobe_AIR_Update_Framework