- 2008-07-03 (木)
- action script
要するに、AS3 製のブログパーツを配布する場合のクロスドメイン問題・処理です。その swf ファイルを main.swf とし、その swf に、child1.swf ~ child10.swf をロードするような構成の場合どうしたらいいかを実験しながら探り探り書いていきます。
このエントリは検証しながらの書きかけエントリです。しかも予想してた挙動と全然違うので、おそらく僕が何か間違えてます。公開するのも迷惑な話でしょうが、メモ的用途で追記していく予定で、あわよくば同じ現象・間違いの指摘を戴ければなとか思って公開させていただきます。
まずはネットで調べます。関連リンクをdel.icio.us にブクマしておきますのでそちらへ。
目的
ユーザ(外部ドメインから swf を呼び出す html の持ち主)のブログにきちんとブログパーツを表示させようとする場合を考えます。
上の関連リンクをもとに出した確認項目リスト
- 親 swf 内の子 swf の読み込み URL は絶対パス指定しておく。
- 他ブロガーのブログが、ブログパーツ設置ドメインから swf を読み込む<際は、swf 設置ドメインのサーバルートに crossdomain.xml が置いてある必要がある。crossdomain.xml をサーバルートに置く場合は swf 側にcrossdomain用コードを書く必要はない。
- crossdomain.xml をサーバルート以外に置きたい場合は、置いてから swf 内に Security.loadPolicyFile('http://www.hoge.com/hoge/crossdomain.xml'); と書く。ドキュメントクラスの as ファイルに書く場合は、flash.system.Security をimport 記述し、import 文と同じ階層に書く。(←こないだはここ以外(例:クラス宣言内とかコンストラクタ内)に書いたらエラー出たのに、今やると出ない。なぜ?)
- と、ここで朗報。Loader を使って子 swf をロードする場合は、実は上の方法以外にも import flash.system.LoaderContext; して var loaderContext:LoaderContext = new LoaderContext(true) で LoaderContext インスタンス作っておいて、loader.load(urlRequest, loaderContext); と第2引数で渡してやると、外部ドメインの crossdomain.xml を自動的に読み込んでくれる。(ドキュメントルートのなのか、任意の場所の xml を読んでくれるのかが確認できていない。)「全てが、」様がまとめられています。
- で、今回は親 swf から子 swf をロードしようとしている。外部ドメインの swf に swf を読み込む場合はSWF ファイルへのアクセスを許可が必要になるので、さらに ApplicationDomain や System.allowDomain() 等を記述することになる。参考:にとよんさんのエントリの下の方、リファレンスのセキュリティ項目の下の方に記載されてる。
以上、AS3だと上記1,3,4,5に気をつければOKっぽいなと考えました。ありがとうございます。
ところが、
・
・
・
あれ?crossdomain.xml置かなくても別ドメインから親子の両 swf ロードできてる。表示されないはずじゃなかったの?
ということで上記リスト項目1をする前に外部ドメインから読み込み&表示できてしまってる。意味がわからん。上記1,3,4をオンオフいろいろ切り換えたりして、キャッシュ云々かと思って別 PC で確認したりしても、全部表示されてしまってる。player は 9.0.124.0 (最新版)
追記1:
はてブでコメントいただきました。
親swf読み込み→表示だけならOK(ダメなのはデータアクセス)、親swfの子swf読み込み→同じサンドボックスだからOK、ってことじゃね?
たしかに「親swf読み込み→表示だけならOK」←これは今までブログパーツを作った時にも crossdomain.xml とかやってないけどユーザに貼ってもらえてたのでOK。よって、親 swf は crossdomain を意識しなくてもくユーザブログで表示される。
で、親子 swf についてはコメントいただいた通り、たとえユーザブログからでも、swf 親子は同じドメイン内にあるので Sandbox の対象にならず、問題なく表示される。
何も気にしなくてよかったのかな?今のところそういう感触。
追記2(7/7):
今日改めてやってみたら、やはり同じ結果。
外部から貼り付け用 js を読んだ時(つまりブロガーの立場)、親ムービーからロードする子ムービーは絶対パスで指定しておく(上記チェックリスト1)ことは必要。それだけでこの構造のブログパーツはちゃんと動く。
追記3(7/8)
ローカル開発時の挙動など:
・子swfのURLをWeb上のURLで絶対パス指定、ローカルの親swfをテストパブリッシュ時→ネット上の子swfをきちんとロードする。
・ただ、ネット上の子swfが存在するディレクトリに.htaccessでパスワードをかけておくと「URL 'http://www.hoge.com/hoge/hoge.swf' を開く処理のエラー
Error #2044: ハンドルされていない IOErrorEvent : text=Error #2035: URL が見つかりません。」となり、子swfは表示されない。まぁこれは当然と言えば当然で、この状態で親swfをアップロードすれば(パスワード聞いてくるので入力後)見れるようになる。
- Newer: amanaリニューアル:スクロールバーのアイデアとサイトの使い勝手
- Older: YOOWALK
Comment:0
Trackback:0
- TrackBack URL for this entry
- http://www.trick7.com/blog/mt-tb.cgi/756
- Listed below are links to weblogs that reference
- 別ドメインのSWFに外部SWFをロードする時(AS3コンテンツ) from trick7.com blog




