SWF から DoABC を削除する ActionScript

  • 6
    Like
  • 0
    Comment
More than 1 year has passed since last update.

2014-03-06追記

この記事、だいぶんほったらかしにしていましたが、Adobe AIR の近頃のバージョンでは AOT 時にリモート用の SWF を指定すると、DoABC タグを自動的にパッケージ側に取り込んでくれる機能が付きました。
こいつがかなりのビルド時間をもたらしてくれる厄介な機能でもあるんですが。。

https://blogs.adobe.com/airodynamics/2012/11/09/packaging-and-loading-multiple-swfs-in-air-apps-on-ios/

ここからが本文

Apple の意向で、Adobe AIR for iOS は AOT としてビルドしたパッケージしかリリース出来ません。
ですが、AOT ではリモートやローカルストレージから取得した DoABC タグが組み込まれた SWF ファイル(スクリプト付き SWF ファイルやリンケージ付き SWF)を実行出来ません。

なので、DoABC を削除する方法が必要となり AIR で作ってみました。

swc を取ってくる

https://github.com/claus/as3swf
http://github.com/claus/as3swf/blob/master/bin/as3swf.swc

コード

as3swf.swc を使って

import com.codeazur.as3swf.SWF

// .....

    var swfBytes:ByteArray = // SWF ファイルのバイト列
    var swf:SWF = new SWF(swfBytes)
    var abctag:TagDoABC = swf.tags.filter(function(item:ITag, index:int, array:*):Boolean {
        return item is TagDoABC;
    })[0]
    var index:int = swf.tags.indexOf(abctag)
    swf.tags.splice(index, 1)
    var published:ByteArray = new ByteArray();
    swf.publish(published);

こうして作った published をファイルとして保存すれば DoABC が綺麗になくなります。

注意

ただし、この方法で削除した DoABC が削除されることでリンケージはなかったものになってしまいます。
なので、その代わりとなるリンケージ用クラス(名前はリンケージ名と同じもの)を自分で宣言しなおしてあげなければなりませんのでご注意を!

なお、設定したリンケージ一覧は SymbolClass タグに書かれているのでプログラムから取得が可能です。

http://hkpr.info/flash/swf/index.php?%E5%88%B6%E5%BE%A1%E3%82%BF%E3%82%B0%2FSymbolClass