2010-04-17 3 views
9

Flash에서 SWF를 게시 한 날짜를 보여주는 일/월 상자를 추가하는 작은 클래스를 작성하고 싶습니다.ActionScript에서 SWF가 게시 된시기를 알 수 있습니까?

제가 일하는 회사는 수개월 동안 반복적으로 많은 SWF와 여러 버전을 만들어냅니다. 클라이언트와 통신하기 위해 사용 된 버전 추적 시스템은 SWF가 게시 된 날짜를 제공하는 일/월 날짜 상자입니다. 지금까지는 게시 날짜를 직접 작성했습니다. 환상적인 ActionScript로 프로그래밍 할 수있는 방법이 있다면.

어떤 통찰력이라도 있습니까? 기본적으로, 필자에게 공개 날짜를 알려주는 호출이 필요합니다. SWF가 게시 된 상황에 대한 정보도 있습니다.이 SWF에 고유 한 자동화 된 버전 식별 형식으로 롤아웃하는 데 사용할 수 있습니다.

그래서 ActionScript는 SWF가 게시 된시기를 알려줍니다.

답변

23

조지가 맞습니다. Adobe는 컴파일 된 모든 swf에 컴파일 날짜가 포함 된 문서화되지 않은 ProductInfo 태그를 몰래 사용합니다. DisplayObject.loaderInfo.bytes에는 표시 객체를로드 한 전체 압축되지 않은 SWF가 들어 있습니다.

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/DisplayObject.html#loaderInfo

그래서 가장 빠른 방법은 (표시 객체에서) 외부 라이브러리없이 SWF의 컴파일 날짜를 얻을 :

import flash.utils.Endian; 
import flash.display.LoaderInfo; 
import flash.utils.ByteArray; 
... 

private function getCompilationDate():Date{ 
    if(!stage) throw new Error("No stage"); 

    var swf:ByteArray = stage.loaderInfo.bytes; 
    swf.endian = Endian.LITTLE_ENDIAN; 
    // Signature + Version + FileLength + FrameSize + FrameRate + FrameCount 
    swf.position = 3 + 1 + 4 + (Math.ceil(((swf[8] >> 3) * 4 - 3)/8) + 1) + 2 + 2; 
    while(swf.position != swf.length){ 
    var tagHeader:uint = swf.readUnsignedShort(); 
    if(tagHeader >> 6 == 41){ 
     // ProductID + Edition + MajorVersion + MinorVersion + BuildLow + BuildHigh 
     swf.position += 4 + 4 + 1 + 1 + 4 + 4; 
     var milli:Number = swf.readUnsignedInt(); 
     var date:Date = new Date(); 
     date.setTime(milli + swf.readUnsignedInt() * 4294967296); 
     return date; // Sun Oct 31 02:56:28 GMT+0100 2010 
    }else 
     swf.position += (tagHeader & 63) != 63 ? (tagHeader & 63) : swf.readUnsignedInt() + 4; 
    } 
    throw new Error("No ProductInfo tag exists"); 
} 

는 SWF 사양 : 당신이 http://www.adobe.com/content/dam/Adobe/en/devnet/swf/pdf/swf_file_format_spec_v10.pdf

+1

+1. 절대 멋지다. 나는이 정보가 swf에서 사용 가능하다는 것을 알지 못했다. (최소한, MXMLC로 컴파일 할 때). 컴파일 날짜를 알아야 할 경우에 대비하여이 점을 명심하십시오. 나는 당신이 여분의 빌드 타임 속임수없이 모든 데이터를 가질 수 있다는 것과 파운더를 사용하지 않아도된다는 것을 좋아한다. 그건 그렇고, @ spiralganglion이 현재 받아 들여지는 답변 대신이 대답을 받아 들일지는 모르겠지만, 분명히 내 것보다 낫다.) –

1

나는 당신이 액션 스크립트에서 그것을 할 수없는 것 같습니다. swf를 작성하는 방법에 따라 두 가지 옵션이있을 수 있습니다. 예를 들어, Flash IDE를 사용하는 경우 JSFL script을 사용하여 swf를 게시 할 수 있습니다. 이 jsfl은 게시 날짜를 저장할 자리 표시 자 변수를 대체 할 수 있으며 swf를 게시 할 수 있습니다 (오랜 시간에 JSFL 스크립트를 작성하지는 않았지만이 작업을 수행하는 것은 너무 어렵지 않음).

자, 당신이 버전 클래스가 있다고 가정 해 봅시다 :

public class Version { 

    public var publicationDate:Date = new Date(); 

} 

이 클래스의 삶, 그 라인을 찾아 현재 날짜로 교체 파일 읽어야 스크립트 :이 같은

뭔가 :

var curDate = new Date(); 
var dateLine = "public var publication:Date = new Date(" + curDate.getFullYear() + "," + curDate.getMonth() + "," + curDate.getDate() +");"; 
+0

. 이 작업을 수행하기 위해 JSFL을 사용해야 할 수도 있다고 생각했습니다. 불행히도, 나는 당분간 그렇게 할 수는 없지만 그렇게 할 수 있다는 것을 아는 것이 좋다. – ivanreese

0

확실하지 않음이 작동합니다,하지만 당신은 (당시)이있는 컴파일 타임에 파일을 외부에서 생성이 .as에서 호출하는 '포함'문을 사용할 수 있다면 현재 날짜가 하드 코딩되어 있습니까? 이 파일을 최신 상태로 유지하려면 하루에 한 번이 파일을 업데이트하려면 서버에서 실행중인 스크립트가 있어야합니다.

+0

이 방법이 효과가 있다고 생각하지만, 서버를 운영하지 않는 것처럼 우리가 설정하는 것이 약간 어려울 것입니다. 이러한 SWF는 개별 개발자가 게시합니다. 나는 일종의 배치 또는 무언가를 함께 해킹 할 수 있다고 생각하지만 그것은 까다 롭습니다. 아이디어를 가져 주셔서 감사합니다. – ivanreese

2

또한 멋진 as3swf 라이브러리로 SWF 바이트 코드에서 날짜를 읽을 수 있습니다. this을 확인하십시오.

+0

유망 해 보입니다. 나는 그것을 시험해 볼 것이고 그것이 효과가 있다는 것을 확인할 때 대답을 바꿀 것이다. 이것 대단히 감사합니다. – ivanreese

관련 문제