我想写一个小课程,添加一个日/月框,显示从Flash发布SWF的日期。
我经常工作的公司生产许多SWF,每个版本都有很多版本,在几个月的时间内迭代。我们用来与客户沟通的版本跟踪系统是日/月日期框,它给出了SWF发布的日期。到目前为止,我们一直在手工填写发布日期。如果有任何方法,我可以使用ActionScript以编程方式执行此操作,这非常棒。
有什么见解?基本上,我所需要的只是给我发布日期的电话,甚至是关于发布SWF的情况的任何信息,我可以使用它来进行某种形式的自动版本识别,这是SWF独有的。
那么,ActionScript可以告诉SWF何时发布?
答案 0 :(得分:24)
乔治是对的。 Adobe将一个未记录的ProductInfo标记隐藏到每个编译的swf中,该标记包含编译日期。 DisplayObject.loaderInfo.bytes包含加载显示对象的完整未压缩swf。
这是获取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文件,该文件具有硬编码的(当时)当前日期?您需要在服务器上运行某种类型的脚本,以便每天更新一次该文件,以使其保持最新状态。