2010-04-17 14 views
9

Me gustaría escribir una pequeña clase que agregue un cuadro Día/Mes que muestre la fecha en que se publicó un SWF desde Flash.¿Puede ActionScript decir cuándo se publicó un archivo SWF?

La empresa para la que trabajo regularmente produce muchos, muchos SWF y muchas versiones de cada uno, que se repiten en el transcurso de los meses. Un sistema de seguimiento de versiones que hemos estado utilizando para comunicarnos con nuestros clientes es un cuadro de día/mes que da la fecha en que se publicó el archivo SWF. Hasta ahora, hemos estado completando la fecha de publicación a mano. Si hay alguna manera de hacerlo programáticamente con ActionScript sería fantástico.

¿Alguna idea? Básicamente, todo lo que necesito es la llamada que me da la fecha de publicación, o incluso ... cualquier cosa sobre las circunstancias bajo las cuales se publicó un SWF que podría utilizar para rodar de alguna forma ... identificación de versión automatizada, exclusiva de este SWF.

Entonces, ¿puede ActionScript saber cuándo se publicó un archivo SWF?

Respuesta

23

George es correcto. Adobe escanea una etiqueta ProductInfo no documentada que contiene la fecha de compilación en cada swf compilado. DisplayObject.loaderInfo.bytes contiene el archivo swf sin comprimir completo que cargó el objeto de visualización.

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

Así que la forma más rápida de la fecha de compilación del SWF sin librerías externas (de un objeto de visualización):

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

El SWF Especificación: http://www.adobe.com/content/dam/Adobe/en/devnet/swf/pdf/swf_file_format_spec_v10.pdf

+1

+1. Absolutamente genial. No sabía que esta información estaba disponible en el archivo swf de manera inmediata (bueno, al menos cuando se compila con MXMLC). Lo tendré en cuenta en caso de que necesite obtener la fecha de compilación. Me gusta el hecho de que puedes tener estos datos sin ningún tipo de engaño extra de compilación y sin tener que usar un analizador completo, lo que parece excesivo si lo único que quieres es esa información. Por cierto, no me importaría si @spiralganglion aceptara esta respuesta en lugar de la actualmente aceptada, ya que es claramente mejor que la mía;) –

1

Me temo que no puedes hacerlo en Actionscript. Dependiendo de cómo construyas los swfs, puede haber un par de opciones. Por ejemplo, si usa Flash IDE, puede usar un JSFL script para publicar el swf. Esta jsfl podría reemplazar una variable de marcador de posición donde almacenará la fecha de publicación y la publicación del swf (no ha escrito un script JSFL en mucho tiempo, pero no debería ser demasiado difícil hacerlo funcionar).

Por lo tanto, digamos que usted tiene una clase Versión:

public class Version { 

    public var publicationDate:Date = new Date(); 

} 

Su script debe leer el archivo donde vive este clase, encuentran que la línea y lo reemplazan con la fecha actual:

Algo como esto :

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

Eso ciertamente no es una mala idea. Pensé que podría tener que recurrir a JSFL para lograr esto. Desafortunadamente, no puedo hacer eso por el momento, pero es bueno saber que se puede lograr de esa manera. – ivanreese

0

No estoy seguro si esto iba a funcionar, pero ¿podría utilizar una sentencia 'incluir' el que llama en un .as generados externamente presentar en tiempo de compilación que tiene el (entonces) fecha actual codificada en ella? Debería tener un script de algún tipo ejecutándose en su servidor para actualizar este archivo una vez al día para mantenerlo actualizado.

+0

Supongo que esto podría funcionar, pero nos sería un poco difícil configurarlo, ya que no estamos ejecutando ningún servidor. Estos SWF son publicados por desarrolladores individuales. Supongo que podría hackear algún tipo de lote o algo así, pero eso sería complicado. Gracias por la idea – ivanreese

2

También puede leer la fecha desde el código de bytes SWF con la impresionante biblioteca as3swf. Compruebe this fuera.

+0

Esto parece prometedor. Lo probaré y cambiaré la respuesta cuando verifique que funcione. Muchas gracias por esto. – ivanreese

Cuestiones relacionadas