Может ли ActionScript сказать, когда был опубликован SWF? - PullRequest
10 голосов
/ 17 апреля 2010

Я хотел бы написать небольшой класс, который добавляет поле День / Месяц, показывающее дату публикации SWF из Flash.

Компания, в которой я регулярно работаю, выпускает множество SWF и множество версий каждого из них, повторяясь в течение нескольких месяцев. Система отслеживания версий, которую мы использовали для общения с нашими клиентами, представляет собой поле даты / месяца, в котором указывается дата публикации SWF. До сих пор мы заполняли дату публикации вручную. Если есть какой-то способ, которым я могу сделать это программно с ActionScript, это было бы здорово.

Есть идеи? По сути, все, что мне нужно, - это вызов, который дает мне дату публикации, или даже ... что-нибудь об обстоятельствах, при которых был опубликован SWF, который я мог бы использовать для перехода к какой-либо форме ... автоматической идентификации версии, уникальной для этого SWF.

Итак, может ли ActionScript определить, когда был опубликован SWF-файл?

Ответы [ 5 ]

24 голосов
/ 12 ноября 2010

Джордж прав. 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

2 голосов
/ 26 сентября 2010

Также вы можете прочитать дату из байт-кода SWF с помощью удивительной библиотеки as3swf. Проверьте это .

1 голос
/ 03 января 2014

Если вы используете FlashDevelop (очень легкий и бесплатный AS3 IDE), вы можете сделать это:

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

Возвращает дату в формате ГГГГ-ММ-ДД

Подробнее: http://www.flashdevelop.org/wikidocs/index.php?title=AS3_Conditional_Compilation

1 голос
/ 17 апреля 2010

Боюсь, вы не можете сделать это в Actionscript. В зависимости от того, как вы создадите swfs, может быть несколько вариантов. Например, если вы используете Flash IDE, вы можете использовать JSFL-скрипт для публикации 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() +");";
0 голосов
/ 18 апреля 2010

Не уверен, сработает ли это, но не могли бы вы использовать оператор 'include', который вызывает во внешнем файле сгенерированный .as файл во время компиляции, в котором жестко запрограммирована (тогда) текущая дата? Вам нужно будет запустить какой-нибудь скрипт на вашем сервере, чтобы обновлять этот файл один раз в день и поддерживать его в актуальном состоянии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...