2008年10月15日に Flash Player 10 が正式に公開され、一般ユーザーにもバージョン 10 環境が広く普及し始めました。
しかし、それに伴って一部の Flash コンテンツが閲覧できないというトラブルが報告されています。
一部には Flash Player 側の仕様変更(セキュリティ対策、など)の影響やバグによるものもあるかと思いますが、原因の大半はコンテンツ制作者側が用意したバージョン判別用コードによるものです。
今回はそういったトラブルに対応するために、想定される原因とその解決方法をリストアップしてみました。
バージョン関係のトラブルでお困りのコンテンツ制作者の方は、ぜひご一読ください。
もっとも代表的な原因として「メジャーバージョンを“特定の場所にある一字”で判別してしまっている」というケースが考えられます。
以前までの Flash Player はバージョン情報が 1 桁のみでしたので、この種の判別コードで問題が発生することはありませんでした。しかし、今回のアップデートによりバージョンが "10" になったことで、Flash Player の歴史上初めて 2 桁のバージョン情報が登場したことになります。そのため、バージョン情報を表すストリングからメジャーバージョンを“特定の場所にある一字”として抜き出していた場合、Flash Player 10 のバージョンを "1" または "0" として誤認してしまうことになります。
まずは ActionScript で判別している場合に想定される問題のコードです。
// AS1 の場合 trace( getVersion().substr( 4, 1 ) ); // "1" と出力されます // AS2 の場合 trace( System.capabilities.version.substr( 4, 1 ) ); // "1" と出力されます // AS3 の場合 import flash.system.Capabilities; trace( Capabilities.version.substr( 4, 1 ) ); // "1" と出力されます
※上記コードは広く使用されていますが、プレイヤーのバージョンに関わらず UNIX 版の Flash Player で正しく動作しませんので、今回の件に関わらず修正が必要です。
この場合には、以下のように修正することで問題を解決できます。
判別処理中にバージョンの大小を比較する際には、事前に parseInt() メソッドなどを利用して数値化することを忘れないようにしてください。
// AS1 の場合 trace( getVersion().split( " " )[1].split( "," )[0] ); // "10" と出力されます // AS2 の場合 trace( System.capabilities.version.split( " " )[1].split( "," )[0] ); // "10" と出力されます // AS3 の場合 import flash.system.Capabilities; trace( Capabilities.version.split( " " )[1].split( "," )[0] ); // "10" と出力されます
次に JavaScript で判別している場合に想定される問題のコードです。
var plugin = ( navigator.mimeTypes && navigator.mimeTypes["application/x-shockwave-flash"] ? navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin : 0 ); alert( parseInt(plugin.description.substring(plugin.description.indexOf(".")-1)) ); // "0" と出力されます
上記コードは過去に公式の判別方法として紹介されていたため、古いコンテンツでは現在もこのコードを使用している可能性があります。
この場合には、以下のように修正することで問題が解決できます。
var plugin = ( navigator.mimeTypes && navigator.mimeTypes["application/x-shockwave-flash"] ? navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin : 0 ); alert( parseInt(plugin.description.match(/\d+\.\d+/)) ); // "10" と出力されます
参考:http://67.org/uk/2008/04/flashplayerjavascript.html
一般的にバージョン判別は Flash が正しく再生できるかどうかを判断するための手段なので、Flash の再生を前提とする ActionScript よりも JavaScript を使用する方が望ましいとされています。
その中でも、もっとも多くの開発者が使用しているパターンが「SWFObject」で実装する方法です。
「SWFObject」を使用すると、バージョン判別から Internet Explorer のアクティブコンテンツ問題(すでに決着済みですが)への対策、Express Install 機能への対応まで、SWF ファイルを HTML に埋め込む際に必要となるあらゆる機能をカバーできます。
しかし、「SWFObject」を使用するパターンでも一部の環境で正しく動作しない場合も報告されています。
この現象は直接 Flash Player 10 が引き起こしている問題ではありませんが、バージョン判別に深く絡んでくる問題ですので注意が必要です。
詳しくは「メディアテクノロジーラボ ブログ」の「IE7でswfobjectが動作しない件」で報告されていますが、症状をカンタンにまとめると
という現象になります。
この現象は同じような環境であっても問題が発生しなかったりというレアケースのため対策が難しいのですが、以下のような対策が考えられます。
上記の症状が発生した環境でも、AC_RunActiveContent.js を使用している場合には問題がないというケースが報告されています。
「SWFObject」を使用しない場合には、「SWFObject」に依存している「SWFAddress」や「SWFForceSize」などの外部ライブラリが使用できなくなりますが、確実性という意味では一番オススメできるケースとなります。
このケースは開発者としてベターな解決方法とは言えないかもしれませんが、SWFObject Wiki FAQの「2. Why don't I see Flash content in Internet Explorer on Windows while I do have the required minimal Flash Player version installed ?」欄にもあるように、そもそもインストーラーが壊れているケースも想定できるので、解決策として知っておくべきことかもしれません。 この場合の解決方法として SWFObject Wiki FAQ が提示している方法は以下になります。
手前味噌ではありますが、筆者の開発している Progression 3 のバージョン判別では、以下のように実装しています。
これは Progression の特徴として「SWFAddress」を前提とした機能があり、「SWFObject」を切り離せないという事情があるため、上記の症状に不安のある「SWFObject」では判別を行わず、別途再生させた SWF ファイルから確実なバージョン情報を取得して、その情報の判断結果が問題ないようであれば無条件に「SWFObject」にて埋め込むようにしているためです。
一部気になる点はありますが、もっとも安定して判別できるのは、やはり「SWFObject」を使用した方法ではないかと思います。
事実、最新の Dreamweaver CS4 で書き出される HTML への SWF ファイルの埋め込み方法には SWFObject 2.0 が正式採用されています。
もちろん、今後もブラウザや Flash Player のバージョンアップは想定されますし、Google Chrome のような新しいブラウザの登場も十分考えられますので、永続的にこの方法がベストプラクティスであるとは言い切れません。
しかし「SWFObject」はオープンソース・コミュニティに支えられ、今後もそのような変化に柔軟に対応していくものと思われます。