- 2008年10月16日 (木)
- Tweet
Flash Player 10時代のバージョン判定
満を持して登場したFlash Player 10ですが、一部のサイトでバージョン検知がうまくいかずチラホラFlashが見れない事象が発生しています。こちらの多くはバージョン判定スクリプトが対応していないことが原因のようです。そこで今時なバージョン判定方法を調べてみました。
バージョン検知スクリプトがうまくいかないケース
バージョン判定をメジャーバージョンの頭1桁でチェックしており、バージョン「10」が「1」と認識されるケースが一番多いようです。多くのFlash参考サイトでsubstrやsubstringによる一文字検知を紹介しているので、参考にしている方は要注意です。商用サイトでもこのケースで見れないこともありましたので、心当たりのある開発者は要チェックです。(今年5月からBeta版のPlayerが登場していたので、チェックされていて然るべきだと思いますが・・・)
確実な方法を調べてみる
9月のLaunching “Progression 3″ in Apple Store, Ginzaで開発者のnuimさんがProgressionのバージョン判定について精度を挙げたとおっしゃっておられましたので、その精度について調べてみる事にしました。(執筆時点ではProgression 3.0.5を利用)
Progressionのバージョン判定ロジック
プロジェクトで作成したdeployフォルダで印象的なのがcontentsフォルダ。jsだけでなく様々な有名どころのスクリプトファイルが入っています。基本的にはいくつかのライブラリとindex.html内のスクリプト、そしてフレームワーク用に作成したと思われるprogression.jsでロジックを確認することができます。
- バージョン検知swfを旧来のobject/embedタグでエンベッド
- ActionScriptで取得したバージョン変数をJavaScriptに渡す
- JavaScriptでバージョン判定
- バージョンが指定バージョン以上だったらswfobjectの作成
- swfobjectを利用してExpressInstallを適用
- swfobjectでエンベッド(設定によりますが、エンベッドが成功したらSWFForceSizeで最小サイズを固定)
バージョン数値はFlash Player内部から取得
バージョン判定用のバージョン5相当のSWFをobject/embedタグを使って一度貼付けています。これはJavaScriptによるプラグインバージョン取得ではなく、確実な検知を行うためSWF内からActionScriptを利用して$versionを取得しているようです。
既知の問題にも対応された工夫
ExternalInterface実装用にdivタグのid名に「external_」が付けられています。これは以下の問題を考慮してのことかと思います。
- ryow.net Blog – SWFObjectを使ったExternalInterfaceまとめ
- ExternalInterfaceのはまりどころを再検証 : tech.kayac.com – KAYAC engineers’ blog
エンドユーザーに親切なアラート表示
Flashエンベッド領域のdivタグの中には二段階のアラート文言がありますが、こちらはバージョン検知のレベルに応じて文言の表示を制御されています。つまりJavaScriptがONでFlash Playerのバージョンが足りない場合は、次の1が非表示になり2だけが表示されます。エンドユーザーにとても親切です。
- JavaScriptがオンになっているか
- 最新のFlash Playerがインストールされているか
感想
あらゆる既知の問題にも対処されていて、まさに理想的なバージョン検知スクリプトだと思いました。Progressionを使っていないサイトでも使いたいぐらいです。ただ実は、細かい事で2点ほど気になることがあるのですが、こちらはもう少し確認がとれたらフォーラムに投稿したいと思います。
投稿者 : 池田 泰延
BookMark
ブックマークはこちらからどうぞ。