ローカルでswf再生したとき、またはgetURLやnavigateToURLでページ遷移しようとしたときに、Adobe Flash Playerは潜在的に危険な操作を停止しました。というアラートがでたことあるかと思います。「Adobe Flash Playerは潜在的に危険な操作を停止しました」の回避策とグローバルセキュリティ設定の方法を紹介します。
グローバルセキュリティ設定方法
Flash Playerヘルプ:グローバルセキュリティ設定パネル
http://www.macromedia.com/support/documentation/jp/flashplayer/help/settings_manager04.html
このページにあるFlash部分の「編集」と書かれているプルダウンメニューの「追加」をクリックして、アラートを出しているswfファイル直接設定するか、フォルダー丸ごと設定するかのどちらかが選べます。すると、「これらのファイルとフォルダを常に信頼する」項目に追加されたと思います。設定はこれで終わりです。ボクはCドライブ全部にかけてます。あまり良くないかもしれませんけどね・・・汗
「Adobe Flash Playerは潜在的に危険な操作を停止しました」のアラートは何を訴えているのか 簡単に言うと、ローカルで再生されるswfファイルが、別のページへ遷移するけどいいですか?と聞いてくれてるわけですね。もしそのswfファイルが誰が作ったかわからず、悪意があるswfファイル開いた瞬間にウィルスに感染してしまう。ってことになりえるかもしれません。それを未然に防ぐために、そのswfファイルは信頼できるかどうか。前項のグローバルセキュリティ設定パネルで設定して許可をしたということです。
このアラートが出る条件は以下のときに出ると思います。
・getURLやnavigateToURLなどのページ遷移する関数が書かれているswfファイルを、そのままダブルクリックで再生する
・htmlファイルにswfを貼り付けたファイルを、ローカルからブラウザで開く
・ボタンアクションなどでページ遷移しようとした瞬間
Flash Debug Playerが出したエラーログ
SecurityError: Error #2028: ローカルファイルシステムの SWF ファイル file://C:\hoge.swf はインターネット URL http://hoge.com/ にアクセスできません。 at global/flash.net::navigateToURL() at MethodInfo-404() ActionScript 3.0 コンポーネントリファレンスガイド:ランタイムエラー一覧
http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/runtimeErrors.html#2028
getURLやnavigateToURLでページ遷移しない!ページに飛ばない!と言われたら そもそもこのアラートが出るだけでもマシかもしれません。アラート自体がでない可能性もあるので、クライアントさんとかに確認してもらってる時に「ページ飛ばないよ」と言われたら、このアラートの可能性が高いと思います。確認出しの方法はいくつかあると思いますが、zipで圧縮してメールで送る場合、ローカルで再生される可能性があるので回避したい。でも、わざわざこの設定をしてもらうのもなんか悪い気がする。。。手っ取り早いのはサーバーにアップして、httpアドレスを直接ブラウザを介して確認してもらいたいところですが、公開してはいけない繊細なコンテンツの場合だと、グローバルセキュリティ設定をしてもらうしかないですね。
Flashに画像を配置した時に、さっきまで見ていた色と違うということがありました。 全体的に赤みを帯びていたり、コントラストが強くなってたり。。。 原因を調べてみると、画像を編集していたPhotoshopにあることに気がつきました。
プルダウンメニューの「ビュー」⇒「色の校正」にチェックが入ってて、上の「校正設定」が「Windows」以外に選択されてました。 画像の見え方は、OSの色の解釈や、画面を見ているモニターの性能によって若干のブレがあるため、 この項目で確認したりするためのもので、Flashにインポートするときはjpgかgifに書き出していたため、 若干のブレがあり、色が変化しているように見えてたんだとおもいます。ショートカットがCtrl+Yですからね。 1つ進むのリドゥと間違えて押してしまったっぽいです笑
Photoshopで編集していた画像をFlashに読み込んだときに、 色が若干変化していた時は、ここのチェックをみて、 普段作業をするぶんに関しては、チェックを外していたほうがいいかもしれません。
古のFlashからあるgetURL関数がAS3でなくなっていることに戸惑われた方もいらっしゃるのではないでしょうか。AS3の仕様変更により、URLRequestクラスの変数に、ページ遷移する先のURLテキストを持たせて、navigateToURL関数の引数に渡してあげるとページ遷移します。
ActionScript 1
2
var url:URLRequest = new URLRequest("http://creator.cotapon.org/"); navigateToURL(url, "_self"); ボタンで実行する時はリスナー登録したイベントに対して書けば動作します。一回覚えてしまえば簡単ですねー。
ActionScript 1
2
3
4
5
6
7
import flash.net.URLRequest; import flash.net.navigateToURL; btn.addEventListener(MouseEvent.MOUSE_DOWN, btnMouseDown); function btnMouseDown(e:MouseEvent):void { var url:URLRequest = new URLRequest("http://creator.cotapon.org/"); navigateToURL(url, "_self"); }
ActionScriptでクロスドメインを認識させる方法は、
ActionScript 1
Security.loadPolicyFile("http://mysite.com/crossdomain.xml"); ↑たぶん、このようにスクリプトを書きます。
ActionScript 1
Security.loadPolicyFile("http://mysite.com/sitemap/crossdomain.xml"); ↑状況によってはドキュメントルート直下に「crossdomain.xml」置けないときもあると思います。
ボクは事情により後者で設定してFlashを再生させると、、
Error #2044: ハンドルされていない SecurityErrorEvent : text=Error #2048: セキュリティサンドボックス侵害 (※これはFlash Debug Playerからのアラートです) 出た!出たよ!!出てしまったよ!!!(TOT)
そこでFlashTracerでログを追跡してどんなエラーが出ているかを調べてみました。
ここでクロスドメインの構造をサクッと説明しますが、ドキュメントルート以外のクロスドメインの方法は更に下のほうに書きます。
crossdomain.xmlの設置と記述方法 Flashのクロスドメイン問題はいにしえからある問題です。 そもそもクロスドメインというのは、swfファイルを貼り付けているHTMLをからみて、外部ファイルをロードするときに、そのファイルが置いてある場所は、HTMLファイルとは違うドメインという状態のことを指します。つまり、FlashPlayerは他人のドメインを攻撃してしまわないようにしているわけです。でも、世の中には写真共有サービスがあったりRSSコンテンツがあったりAPIなんかもあります。そういった場合は、どこからでも情報を取得してもいいですよ。といった感じに許可をすることができます。 その許可をするための設定ファイルが、 crossdomain.xml にあたります。
たとえば、自分のサイト http://mysite.com というサイトに表示させるFlashコンテンツが http://hoge.com というサイトにあるRSSをロードするとします。 この場合、クロスしてますよね。 hoge.com サイトは、 mysite.com がRSSをロードしてもいいよ!と許可をする為に、 crossdomain.xml をドキュメントルートの場所においてあげます。 アドレスは
http://hoge.com/crossdomain.xml このようになります。実際に、この crossdomain.
ライブラリにおいてあるムービークリップに対して、リンゲージでActionScriptに書き出しをチェックを入れてクラス化したモノを、var 変数名:クラス名 = new クラス名();で生成して、stage.addChild(変数名);でステージに配置するのは基本だと思います。が、この一連の流れで一体どこにインスタンス名を設定するのか非常に悩んでしまいました。
単純にMovieClipを生成するだけなら、 var 変数名:MovieClip = new MovieClip(); でできちゃいます。ActionScript2以下の場合では、createEmptyMovieClipを使って空のMovieClipを生成していたと思います。
インスタンスを作成する場所.createEmptyMovieClip(インスタンス名, 深度)
第二引数にインスタンス名を設定ができ、例えばforで繰り返し生成する場合は、インスタンス名に対して「i」を連結させて連番名などにしたりしていました。さて、、ActionScript3.0ではどうするのでしょうか。。。
まず、空のMovieClipを生成した時の名前を調べました。
ActionScript3 1
2
var mc:MovieClip = new MovieClip(); trace(mc.name);//「instance1」と出力 name はActionScript2以下の場合は _name でアンダーバーがいりましたが、ActionScript3.0ではアンダーバーがいらなくなりました。newしたMovieClipの名前をtraceしてみると instance1 と出力されました。
これをforで繰り返して生成したMovieClipにアクセスする為には「instance1」「instance2」とかのまま作られたらダメですよね。。。
そこで調べました。なんと!ActionScript2以下ではインスタンス名を調べることしかできなかったnameが、ActionScript3.0からnewしたインスタンス名に設定できることが分かりました、つまり、
ActionScript3 1
2
3
var mc:MovieClip = new MovieClip(); mc.name = "myMc"; trace(mc.name);//「myMc」と出力 こう書けちゃうんです!勘の鋭い方はもう分かると思いますが、forで繰り返すときは、変数名.
FlashLite1.xで動的にコンテンツを動かす時に欠かせないのが、loadVariablesで変数をまとめたテキストデータを取得方法があります。FlashLite1.xではムービークリップごとにアクセスするのはドットシンタックスではなくスラッシュシンタックスなので、loadVariablesの第二引数に_rootという記述では変数を取得することができないので、loadVariablesの第二引数に「”/“」と記述します。
と、断言しちゃってますが、Flashのヘルプや他のブログなどをみると、第二引数に_rootとかいているパターンが多く、ブラウザやDevice Centralで第二引数に_rootで正しく動いても、ケータイ端末実機で動かない場合は下記の方法を試してみてください。
Flash Lite 1.xでのloadVariablesの記述 ActionScript 1
2
3
on (press, keyPress "<Enter>") { loadVariables("data.text","/"); //←第二引数で_rootではなく「"/"」スラッシュを書く } loadVariablesはボタンアクションでないと動作しない swfファイルがケータイ端末にロードが完了した瞬間にFlashは再生され、1フレーム目のScriptが実行されます。その瞬間に、loadVariablesが実行されると、swfファイルを読み込んだだけで端末情報が取得できたりしてしまうので、フレームアクションではloadVariablesが実行されないようになってます。これはFlashLite全体の仕様なので、loadVariablesとloadMovieで外部ファイルにアクセスする場合は必ずユーザーさんにボタンアクションをしてもらわなければなりません。パソコンコンテンツとは違い、データを取得して動的に表示させる場合はスムーズに見えるようなUIの工夫が必要になると思います。
そろそろActionScript2.0から脱皮できそうな予感がしてきました!(オソw)そこで、ActionScript2.0でできたことで、ActionScript3.0でできないこと、その違いと方法を記録していきたいと思います。
AS3でeval();が使えない evalは「テキストをインスタンス名のターゲットに変換してくれる」というのがボクのイメージです。
例えば、ステージ上に、mc0からmc9までのムービークリップがあるとします。これらに一気に命令する時は、
ActionScript1.x ~ 2.0の場合 ActionScript 1
2
3
4
5
for(var i:Number = 0; i<10; i++){ eval("mc"+i).onRelease = function(){ trace("ほげ"); } } for文の中の変数「i」を利用して、「mc0」「mc1」「mc2」「mc3」…..「mc8」「mc9」まで一気にonReleaseのボタンが設定できました。
ActionScript3.0だとevalが使えないので、下記の方法を使います。
ActionScript3.0の場合 ActionScript3 1
2
3
4
5
for(var i:int = 0; i<10; i++){ this.["mc"+i].onRelease = function(){ trace("ほげ"); } } えーっと、実は、この記述の方法はActionScript1.