2010-04-17 39 views
9

我想写一个类,添加一个日/月框,显示SWF从Flash发布的日期。ActionScript可以告诉SWF何时发布?

我工作的公司定期生产许多SWF和许多版本,每个月都会迭代。我们用来与客户沟通的版本跟踪系统是一个日/月日期框,它给出了SWF发布的日期。到目前为止,我们一直在手工填写发布日期。如果有什么办法,我可以通过编程方式使用ActionScript来进行编程,这太棒了。

任何见解?基本上,我需要的仅仅是给出发布日期的调用,或者甚至是任何有关发布SWF的环境的任何情况,我可以将它们用于某种形式的自动化版本标识,这是此SWF所特有的。

那么,ActionScript可以告诉SWF何时发布?

回答

23

乔治是对的。 Adobe将一个包含编译日期的未公开的ProductInfo标签隐藏到每个已编译的swf中。 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是否接受了这个答案,而不是目前接受的答案,因为它显然比我好;) – 2010-11-12 04:13:54

1

恐怕你不能在Actionscript中做到这一点。根据你如何构建swfs,可能有几个选项。例如,如果您使用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 2010-04-19 20:45:32

0

不知道这是否会工作,但你可以使用“包含”声明,呼吁在外部产生。至于文件在编译时它具有(当时)当前日期是硬编码的吗?您需要在服务器上运行某种脚本,以便每天更新该文件以保持最新状态。

+0

我想这可能会起作用,但对我们来说设置起来会有点困难,因为我们没有运行任何服务器。这些SWF由各个开发人员发布。我想我可以一起进行某种批处理或某种事情,但那会很棘手。感谢这个想法。 – ivanreese 2010-04-19 20:40:38

2

此外,你可以用真棒as3swf库从SWF字节码中读取日期。 检查this了。

+0

这看起来很有前途。当我验证它是否有效时,我会尝试并更改答案。非常感谢你。 – ivanreese 2010-10-09 07:23:01

相关问题