ActionScript可以告诉SWF何时发布?

时间:2010-04-17 01:05:46

标签: actionscript-3 datetime flash

我想写一个小课程,添加一个日/月框,显示从Flash发布SWF的日期。

我经常工作的公司生产许多SWF,每个版本都有很多版本,在几个月的时间内迭代。我们用来与客户沟通的版本跟踪系统是日/月日期框,它给出了SWF发布的日期。到目前为止,我们一直在手工填写发布日期。如果有任何方法,我可以使用ActionScript以编程方式执行此操作,这非常棒。

有什么见解?基本上,我所需要的只是给我发布日期的电话,甚至是关于发布SWF的情况的任何信息,我可以使用它来进行某种形式的自动版本识别,这是SWF独有的。

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

5 个答案:

答案 0 :(得分:24)

乔治是对的。 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 :(得分:2)

您还可以使用精彩的as3swf库从SWF字节码中读取日期。 检查this

答案 2 :(得分:1)

我担心你不能在Actionscript中做到这一点。根据您构建swfs的方式,可能有几个选项。例如,如果您使用Flash IDE,则可以使用JSFL script来发布swf。这个jsfl可以​​替换一个占位符变量,你将存储发布日期,并发布swf(很长一段时间没有编写JSFL脚本,但这不应该太难以使其工作)。

所以,假设你有一个Version类:

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() +");";

答案 3 :(得分:1)

如果你正在使用FlashDevelop(非常好的轻量级,免费的AS3 IDE),你可以这样做:

public static function GetBuildDate() : String
{
    return CONFIG::timeStamp;
}

以YYYY-MM-DD格式返回日期

更多信息:http://www.flashdevelop.org/wikidocs/index.php?title=AS3_Conditional_Compilation

答案 4 :(得分:0)

不确定这是否可行,但您是否可以使用'include'语句在编译时调用外部生成的.as文件,该文件具有硬编码的(当时)当前日期?您需要在服务器上运行某种类型的脚本,以便每天更新一次该文件,以使其保持最新状态。