この記事のURL

http://www.dango-itimi.com/blog/archives/2009/001001.html


FLASH tips 「プロファイラ内容変更」+「フレームへのスクリプト記述」 jsfl サンプル

Flash Lite でのキャリア毎の swf 書き出し作業の問題点

Flash Lite では、どのキャリアの携帯端末で swf が実行されたのか 動的に判別することができません。swf 実行時、各キャリア専用の認証用 URL にアクセスしたいといった場合等、あらかじめキャリアごとに専用の swf を書き出しておく必要があります。(サーバ側で swf 内の変数を動的に書き換える方法もありますが、その環境がないものとして話を進めます。)

例えば以下のようなスクリプトを、ルートのフレーム 1 に記述します。

//1 : docomo
//2 : au
//3 : softbank
CARRIER = 1;

//1 : 本番サーバ
//2 : 検証サーバ
SERVER = 1;

//認証 URL 一覧
URL1_1 = "http://~"; //docomo 本番サーバ用
URL1_2 = "http://~"; //docomo 検証サーバ用
URL2_1 = "http://~"; //au 本番サーバ用
URL2_2 = "http://~"; //au 検証サーバ用
URL3_1 = "http://~"; //softbank 本番サーバ用
URL3_2 = "http://~"; //softbank 検証サーバ用

//実際に認証で用いる URL
url = eval("URL" add CARRIER add "_" add SERVER);

変数 CARRIER, SERVER の各値を手動で書き換えた後 パブリッシュを行い、書き出された swf を docomo.swf, au.swf, softbank.swf …、といった具合に名前を変更します。

ここで、ファイルにどこか修正が入る場合、再び上記 swf 書き出し作業を繰り返す必要がでてきます。この作業の繰り返しは、ミスが発生しやすく、時間も浪費し、精神衛生上よろしくありません。


サンプルファイル ダウンロード

上記問題を解決するために、「プロファイラ内容変更」と「フレームへのスクリプト記述」を行う jsfl のサンプルを作成しました。

 → サンプルファイル一式 ダウンロード[trunk.zip]

今回作成した jsfl ファイルは Flash CS4 以降対応となっています。

サンプルファイルディレクトリ構造は以下のようになっています。

trunk
 ├ fla 
 │ ├ PublishChanger.fla
 │ └ test
 └ jsfl
   ├ publish.jsfl
   ├ Main.jsfl
   ├ ProfileXMLReplacer.jsfl
   └ CarrierActionScript.jsfl


サンプル実行手順

jsfl ファイルから fla ファイルのパブリッシュを行うには、fla ファイルへの絶対パスの指定が必要です。まず publish.jsfl ファイルに fla ファイルへの絶対パスの記述を行います。

publish.jsfl をテキストエディタで開き、一行目に trunk ディレクトリはどこかの指定を行ってください。ダウンロード直後は例として以下の記述が行われています。

var PROJECT_DIRECTORY = 
	"file:///f:/MyDocument/eclipse/workspace/PublishChangerJsfl/trunk/";

例えば以下の環境の場合
 OS : windows XP
 ユーザ名 : Owner
 trunk 配置ディレクトリ : デスクトップ
以下のように変更を行います。

var PROJECT_DIRECTORY = 
	"file:///C:/Documents and Settings/Owner/デスクトップ/trunk/";

上記設定後 publish.jsfl をダブルクリックで実行することで fla ディレクトリ内の PublishChanger.fla ファイルがパブリッシュされ、各種 swf ファイルが fla ディレクトリ内に書き出されます。書き出し先ディレクトリを指定することも可能で、test ディレクトリにも swf が書き出されるようにしています。

書き出される swf ファイルは以下の形式にするようにしています。

(キャリア名 + サーバ種別).swf

各種 swf をパブリッシュする直前には、フレーム 1 に以下のスクリプトを組み込むようにしています。

testTxt = 'キャリア名' add 'サーバ種別';

各 swf ファイルに上記スクリプトが正常に埋め込まれているかを確認するために、PublishChanger.fla 内には testTxt というテキストフィールドを配置しています。各 swf を開いてご確認ください。

今回のサンプルでは上記書き出しと設定を行なうだけのサンプルなので、プロジェクトに合わせて jsfl の処理内容を書き換えてください。swf 名書き出しに関する処理は Main.jsfl 内の for 文以下、フレームへのスクリプト埋め込みに関する処理は CarrierActionScript.jsfl 内に記述されています。各 jsfl ファイル内のスクリプトはさほど長いものではないので、細かい説明は省略します。


参考 プロファイル設定を行う jsfl 処理説明

Flash から swf 等の各種ファイルを書き出す設定プロファイル(xmlファイル)内の、以下の要素を設定する事で swf 出力ファイル名を任意に変更する事が可能となります。

<PublishFormatProperties enabled="true">
	<defaultNames>0</defaultNames>
	<flashDefaultName>0</flashDefaultName>
	<flashFileName>任意のswf名</flashFileName>
</PublishFormatProperties>

ProfileXMLReplacer.jsfl は プロファイル内の指定要素の値を 変更・設定 する処理を行います。Main.jsfl は ProfileXMLReplacer.jsfl を用いて defaultNames, flashDefaultName, flashFileName 要素の値を変更するようにしています。


問題点

私は、Flash Lite の swf は容量を削減するため Flash 8 で書き出す事があります。しかし、Flash 8 では今回作成したサンプルの jsfl 内に記述したスクリプトが使用できないものがあり、せっかく作ったのに使用できないなんて事が。


その他 参考

Adobe Flash CS4 Professional の拡張機能(jsfl API ドキュメント)
http://help.adobe.com/ja_JP/Flash/10.0_ExtendingFlash/index.html

[追記 2009年11月2日]
サンプル内の
this.doc.getTimeline().layers[0].frames[0].actionScript
という記述は root ではなく現在開いているシンボルやシーンのタイムラインを編集することになってしまうようなので、注意!

開いたflaファイルから取得したドキュメントオブジェクト変数(doc)に対し、以下の記述を追加することでルートタイムラインを参照するようになる模様。

this.doc.currentTimeline = 0;

[ FLASH ] [ tips ] 投稿者 siratama : 2009年10月29日 14:12

トラックバック

http://www.dango-itimi.com/blog/mt-tb.cgi/961

コメント

仕事場で使っているのがFLASH8の私は、ローカルサバ用、docomo本サバ用、docomoテストサバ用、docomo体験版用、au本サバ用……と延々と…
音楽ファイルが入ってくると、どうしても手作業でしょうけど、CS4がウラヤマシイ!

投稿者 @I : 2009年11月23日 21:10

あれから上記内容をいろいろと改造して用いているのですが、かなり有用できています。
どのスクリプトを swf 内に埋め込むのかの判定ができるので、それにともない容量も削減され、Flash 8 で書き出す必要がなくなることもわかりました。
これのためだけにも Flash CS4 を導入する価値はあるかもしれません。

投稿者 siratama : 2009年11月24日 00:56

なるほど。
確かに判別用のスクリプトを書く必要もなくなりますし、テスト用trace云々のプログラムも一緒に処理してしまえば軽量化もデキル…
すばらしいですね。
これはありがたい情報を頂きました!

投稿者 @I : 2009年11月24日 23:40

以下コメントを書き込むだけでは、管理人には通知が行われません。通知を行いたい場合、管理人の書き込みに「返信」を押してコメントをしていただくか、あるいは Google+, Twitter へご連絡ください。




[EDIT]