2010-04-17 12 views
9

Ich möchte eine kleine Klasse schreiben, die ein Tag/Monat-Feld hinzufügt, das das Datum zeigt, an dem eine SWF aus Flash veröffentlicht wurde.Kann ActionScript mitteilen, wann eine SWF-Datei veröffentlicht wurde?

Die Firma, für die ich arbeite, produziert viele, viele SWFs und viele Versionen von jedem, die im Laufe von Monaten iterieren. Ein Versions-Tracking-System, das wir zur Kommunikation mit unseren Kunden verwendet haben, ist eine Tag/Monat-Datums-Box, die das Datum angibt, an dem die SWF veröffentlicht wurde. Bis jetzt haben wir das Veröffentlichungsdatum manuell ausgefüllt. Wenn es irgendwie möglich ist, dies programmatisch mit ActionScript zu machen, wäre das fantastisch.

Irgendein Einblick? Alles, was ich brauche, ist der Aufruf, der mir das Veröffentlichungsdatum gibt, oder sogar irgendetwas über die Umstände, unter denen eine SWF veröffentlicht wurde, die ich verwenden könnte, um in eine automatisierte Versionskennung zu gelangen, die für diese SWF einzigartig ist.

Kann ActionScript also sagen, wann eine SWF-Datei veröffentlicht wurde?

Antwort

23

George hat Recht. Adobe schlägt ein undokumentiertes ProductInfo-Tag ein, das das Kompilierungsdatum in jedem kompilierten SWF enthält. Die Datei DisplayObject.loaderInfo.bytes enthält das vollständige unkomprimierte swf, das das Anzeigeobjekt geladen hat.

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

So ist der schnellste Weg, um die SWFs Compilation Datum ohne externe Bibliotheken (von einem Display-Objekt) zu erhalten:

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"); 
} 

Die SWF-Spezifikation: http://www.adobe.com/content/dam/Adobe/en/devnet/swf/pdf/swf_file_format_spec_v10.pdf

+1

+1. Absolut cool. Ich war mir nicht bewusst, dass diese Informationen in der swf out of the box (na ja, zumindest wenn mit MXMLC kompiliert). Ich werde dies im Hinterkopf behalten, falls ich das Datum der Kompilation benötige. Ich mag die Tatsache, dass Sie diese Daten ohne jede Art von Build-Time-Tricks haben können und ohne einen vollen Parser verwenden zu müssen, der übertrieben erscheint, wenn Sie nur diese Information haben wollen. Übrigens würde es mir nichts ausmachen, wenn @spiralganglion diese Antwort anstelle des aktuell akzeptierten akzeptiert, da es eindeutig besser ist als meines;) –

1

Ich fürchte, Sie können es nicht in Actionscript tun. Abhängig davon, wie Sie die swfs erstellen, gibt es möglicherweise ein paar Optionen. Wenn Sie beispielsweise die Flash-IDE verwenden, können Sie zum Veröffentlichen der SWF-Datei JSFL script verwenden. Dieses jsfl könnte eine Platzhaltervariable ersetzen, in der Sie das Veröffentlichungsdatum speichern und das swf veröffentlichen (haben Sie nicht ein JSFL-Skript für eine lange Zeit geschrieben, aber es sollte nicht zu schwer sein, das zu funktionieren).

So lassen Sie uns sagen, dass Sie eine Version Klasse:

public class Version { 

    public var publicationDate:Date = new Date(); 

} 

Ihr Skript sollte die Datei lesen, wo diese Klasse Leben, diese Linie finden und es mit dem aktuellen Datum ersetzen:

Soetwas :

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

, die sicherlich keine schlechte Idee. Ich hatte gedacht, dass ich mich vielleicht an JSFL wenden müsste, um das zu erreichen. Leider kann ich das vorläufig nicht, aber es ist gut zu wissen, dass es auf diese Weise erreicht werden kann. – ivanreese

0

nicht sicher, ob das funktionieren würde, aber könnten Sie verwenden, um eine ‚include‘ Aussage, die in einem extern erzeugten .as ruft bei der Kompilierung-Datei, die die (dann) aktuelles Datum fest codiert? Sie müssen ein Skript auf Ihrem Server haben, um diese Datei einmal am Tag zu aktualisieren, um sie aktuell zu halten.

+0

Ich denke, das könnte funktionieren, aber es wäre ein bisschen schwierig für uns einzurichten, da wir keine Server betreiben. Diese SWFs werden von einzelnen Entwicklern veröffentlicht. Ich nehme an, ich könnte einen Haufen oder so etwas zusammenhacken, aber das wäre schwierig. Danke für die Idee. – ivanreese

2

Sie können auch das Datum aus dem SWF-Bytecode mit der beeindruckenden Bibliothek as3swf lesen. Überprüfen Sie this aus.

+0

Das sieht vielversprechend aus. Ich werde es ausprobieren und die Antwort ändern, wenn ich verifiziere, dass es funktioniert. Vielen Dank dafür. – ivanreese

Verwandte Themen