平々毎々(アーカイブ)

はてなダイアリーのアーカイブです。

ユーザーがSilverlight 3ベータ版をインストールするときの挙動

Silverlight 3 Beta install experience for usersの翻訳。とりあえず公開して、3日以内に翻訳許可をとる(NGなら消す)。順番がおかしいけど ;-) (追記)とりあえずOKぽい

      • -

もし君が僕を含む大方の開発者に似ているのなら、たぶんほとんどの警告は無視するし、何かをインストールするときには細かいことに注意せず「次へ」をクリックし続けるタイプだろう。気にするな、僕も同じだ。

Silverlight 3 Betaのリリースでは、開発者向けのリリースであること、そして「Go Live」ライセンスはこのリリースには適用されないことを表示している。つまり、Silverlight 3の一般ユーザー向けランタイムは公開も作成もしてないので実運用にはおすすめしないということだ。今回のベータ期間中にSilverlight 3用コンテンツを見るためにはWindowsMacに開発者向けランタイムをインストールしなければならない。一般ユーザー向けの更新およびインストール機能は今のところテンプレートに統合されていない。そうすると、サンプルプログラムを組織内の人たちに見せるときとか、あるいは製品などのプレビュー版を持っていて、ユーザーがそのアプリケーションを見に来る場合などにおいて、それが意味することとは何だろうか。シナリオをいくつか提示しよう――ただし下記の情報はSilverlight 3でビルドされたアプリケーションだけに関係することに注意してほしい: Silverlightがインストールされていない場合、Silverlight 3がインストールされている場合、Silverlight 1または2がインストールされている場合、そしてプラグインMIME Typeに関する注意点だ。

シナリオ: Silverlightがインストールされていない場合

もしユーザーがSilverlightの既存のバージョンを全くインストールしていなければ、規定どおりの「インストールされていない」振る舞いをするだろう。何もカスタマイズしてないとか正直ありえないけど :-) デフォルトのVisual Studioテンプレートでは単純に静止画像を出すだけだ。テンプレートの画像は「Silverlight 3 近日公開」ページにリンクしていて、そこで現在の状況が説明される。そこでユーザーが開発者ランタイムをインストールすれば、アプリケーションを表示できるようになるだろう。

注意: Silverlight 3の開発者向けランタイムをインストールしていると、一般ユーザー向けランタイムへ「更新」することができない。つまり、もし(開発者でない)一般のユーザーが開発者向けランタイムをインストールすると、Silverlight 3がリリースされたときに、正式版ランタイムを導入するためには手作業で開発者向けランタイムをアンインストールしなければならないということだ。もし君が開発者なら、おそらく何の問題もなく次期開発者向けランタイムで上書きできるだろう。これが現時点では「Go Live」がサポートされていない主要な原因だ。

ベータ版のサンプルを見てくれる人たちには、このシナリオを説明し、将来何をしなければならなくなるかを伝えるべきだ。

シナリオ: Silverlight 3の開発者向けランタイムがインストールされている場合

もしも、Silverlight 3ランタイムの、君のアプリケーションに必要なバージョンをちゃんとユーザーが持っていたなら、アプリケーションを見ることができるだろう。プラグインインスタンス化するときにminRuntimeVersionパラメータを使って、最低限要求されるランタイムのバージョンを定義する。以下のように。

 1: <object data="data:application/x-silverlight-2," type="application/x-silverlight-2">
 2:     <param name="minRuntimeVersion" value="3.0.40307.0" />
 3:     ...
 4: </object>

ユーザーが最低限必要なランタイムを持っていれば、すべてはうまくいくだろう。

シナリオ: Silverlightがインストールされている (既存のバージョンのいずれか)

いや、これが実に困った動作をする場合だ。もしユーザーが既存のSilverlight(1.0 や 2)を入れていたら、ベータ版のサンプルを見たときの挙動は、プラグインインスタンス化するときの2つのプロパティで決まる。minRuntimeVersion と autoUpgrade だ。ユーザーがSilverlight 2を入れていた場合に何が起きるかを見てみよう。

minRuntimeVersion="3.0.40307.0" かつ autoUpgrade="true" ――特に何も変更していなければ、ユーザーにはこう見える:

http://storage.timheuer.com/slautoupgradetrue.png

これはいくつかの理由で問題がある。まず、これはカスタマイズされていない、デフォルトの挙動だ。次に、「Install」のリンクでは“現在の最新版"に飛ばされる――おそらくもうインストール済みの。ということは?ユーザーにとっては、サイトを訪れる→更新メッセージが表示される→おそらくインストールする→サイトを訪れる→更新メッセージが表示される→……の無限ループに陥ったと感じるだろう。これはベータ版サンプルを見に来た人をいらいらさせるし、あなたも混乱することになるだろう :-)

一般ユーザーのために、必ず挙動をカスタマイズしなければならない。ベータ版においては、ユーザーが混乱しないための推奨事項は以下のものだ:

  • ベータ版のサンプルを見るためにユーザーがランタイムを更新しなければならないかを検出する
  • 現在の状況と、サンプルがベータ版であることをユーザーに通知する
  • ユーザーをSilverlight 3の近日公開ページに誘導する

そのために次のことをしなければならない。アプリケーション (のobjectタグ) がdivのようなHTMLコンテナの中に置かれ、それに適切なIDが振られていることを確認しよう。プラグインインスタンス化するときには次のような3つのパラメータを追加する:

 1: <div id="silverlightControlHost">
 2:     <object data="data:application/x-silverlight-2," type="application/x-silverlight-2">
 3:         <param name="minRuntimeVersion" value="3.0.40307.0" />
 4:         <param name="autoUpgrade" value="false" />
 5:         <param name="onerror" value="pluginError" />
 6:         ... other param values as required ...
 7:     </object>
 8: </div>

minRuntimeVersion にはアプリケーションが要求するバージョンを記述する。Silverlight 3 ベータ版の場合は3.0.40307.0だ。2番目にautoUpgrade をfalseにする。これでデフォルトの挙動を防げる。3番目に、autoUpgradeをfalseにしたために、要求されたバージョンがインストールされていないというエラーが投げられるので、エラーハンドラを追加する。エラーハンドラでは次のようなことをする必要がある:

 1: function pluginError(sender, args) {
 2:     if (args.ErrorCode == 8001) {
 3:         var msg = "This sample application was built with Silverlight 3 Beta.\n";
 4:         msg += "You currently have Silverlight installed, but not the version required to view this sample.\n\n";
 5:         msg += "For more information about Silverlight 3, please visit: \n";
 6:         msg += "<a href=\"http://go.microsoft.com/fwlink/?LinkID=141205\">Silverlight 3 Coming Soon</a>.";
 7:  
 8:         var hostContainer = document.getElementById("silverlightControlHost");
 9:         hostContainer.innerHTML = msg;
10:     }
11:     else {
12:         // handle other plugin errors here
13:     }
14: }

エラー番号8001番は更新が必要であることを意味している。これで、アプリケーションがベータ版であることと、ユーザーはSilverlightの何かのバージョンをインストールしているがそれがベータ版ではないということが判別できる。コンテナ内部のコンテンツを、当アプリケーションはサンプルであることを表示するようなHTMLに置き換え、詳しい情報のために近日公開ページに誘導しよう。こうすればユーザーは無限ループに陥ることがなく、混乱もしないし、君を憎むこともない。

<object>の属性が"application/x-silverlight-3"ではない理由:

よくある誤解は、プラグインオブジェクトのdata属性とtype属性が、現在使っているプラグインのランタイムバージョンに直接関係しているというものだ。これは正しくない。Silverlight 3を持っているからといって、type="application/x-silverlight-3"に変更しなければいけないわけではないし、もしそんなことをしたら動かないよ! これらの属性はプラグインMIMEタイプを示すもので、ランタイムのバージョンではない。Silverlightアプリケーションに対しては、これまで通りapplication/x-silverlight-2を使えばいい。(実は、Silverlight 1.0に限定したケースを取り扱いたい場合はx-silverlightを使うこともできる。)

まとめ

ベータ版ソフトウェアは楽しいけど混乱の元だ。われわれ開発者については、技術的に鋭敏だし、ベータ版の意味も分かっているし、たぶん他のベータ版ソフトウェアをいつも使っているから慣れているだろう。一般ユーザーにとっては、何かいろんなものとかリンクとか記事とかを見て試したいと思っても、望みのソフトウェアが得られなくて混乱してしまうこともある。われわれは開発者としてベータ版の試用者が状況を明確に理解する手助けをできるし、告知するのが仕事だとも言える。

なので、もしSilverlight 3 ベータのサンプルを公開するのなら、ちゃんと時間をとってこれらのガイダンスに従い、更新のエラーコードを捕まえ、ユーザーに知らせるべき情報とともにエラー処理をすること。

この情報が手がかりとなりますように!