2010-04-17 80 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

相關問題