連載
.NETでモバイル・サイト開発を始めよう

第1回 ASP.NETによる携帯サイト開発は七転八倒?!

シグマコンサルティング 菅原 英治
2007/03/20
Page1 Page2 Page3 Page4

○2.3.5. エバリュエータ・デリゲート型フィルタ

 ここではデバイスの識別をカスタマイズ可能とする「エバリュエータ・デリゲート型フィルタ(evaluator delegate filter)」を解説し、その利用例を示す。

 モバイルWeb構成ファイルに標準で定義されたデバイス・フィルタは明らかに足りない。最上段に定義された“isJPhone”が、それを強く物語っている。標準では、SoftBankどころか、VodafoneでもなくJ-PHONEの定義しかないのである。

 そこで登場してくるのがエバリュエータ・デリゲート型フィルタである。これを利用すると、デバイス・フィルタの識別をカスタマイズし、自分で記述することが可能となる。例えば、SoftBank、Vodafone、J-PHONEを1つにまとめたデバイス・フィルタの作成などが行える。

【エバリュエータ・デリゲート型フィルタの作成】
 それでは、さっそくエバリュエータ・デリゲート型フィルタを作成してみよう。ここでも、いままで利用してきたモバイル・サイトを同様に利用する。まず現在のモバイル・サイトに対し、ライブラリ用のプロジェクトを追加する。

Webサイトへクラス・ライブラリの追加
このダイアログは、ソリューション・エクスプローラ上のソリューション項目を右クリックして、表示されるコンテキスト・メニューから[追加]−[新しいプロジェクト]を選択すると表示される。
  クラス・ライブラリを選択する。
  プロジェクト名を入力する。ここでは「Mlib」を入力している。
  保存場所を指定する。ここでは「D:\mobile」を指定している。
  「ソリューションに追加」を選択する。

 プロジェクトの追加が完了したら、自動生成された「Class1.cs」を削除する。そしてクラス・ライブラリに対し、必要なライブラリ参照を追加する。参照の追加が必要なライブラリは「System.Web.dll」と「System.Web.Mobile.dll」である。

 また、Webサイト(本稿では「D:\mobile\」)のプロジェクトで、追加したライブラリ・プロジェクト(Mlib)への参照も追加しておく必要がある。

 続いて、追加したライブラリ・プロジェクト(Mlib)に対し、エバリュエータ・デリゲート型フィルタを定義するためのクラスを追加する。

エバリュエータ・デリゲート型フィルタを定義するためのクラス・ファイルの追加
このダイアログは、ソリューション・エクスプローラ上のライブラリ・プロジェクト(Mlib)項目を右クリックして、表示されるコンテキスト・メニューから[追加]−[新しい項目]を選択すると表示される。
  クラスを選択する。
  ファイル名を入力する。ここでは「CapabilityEvaluators.cs」を入力している。

 エバリュエータ・デリゲート型フィルタは、以下のシグネチャを持つメソッドとして定義される。

public static bool メソッド名(MobileCapabilities capabilities, string argument)

 このメソッド内に、デバイスを識別するロジックを記述する。識別した結果、該当するデバイスであると判断できればTrueを、該当しないデバイスであると判断できればFalseを返すことになる。

 それでは、追加したクラス・ファイルに下記のコードを記述し、SoftBank、Vodafone、J-PHONEをまとめて判定するエバリュエータ・デリゲート型フィルタのメソッドを定義してみよう。

using System;
using System.Web;
using System.Web.Mobile;

namespace Mlib
{
  public class CapabilityEvaluators
  {
    private readonly static string[] SoftBankUserAgentList =
      new string[]
      {
        "J-PHONE",
        "Vodafone",
        "SoftBank",
        "J-EMULATOR",  // エミュレータ用
        "Vemulator"    // エミュレータ用
      };

    public static bool isSoftBank(MobileCapabilities capabilities, string argument)
    {
      string[] agentInfo =
        HttpContext.Current.Request.UserAgent.Split('/');

      if (agentInfo.Length == 0)
        return false;

      return Array.IndexOf(SoftBankUserAgentList, agentInfo[0]) != -1;
    }
  }
}
SoftBank、Vodafone、J-PHONEをまとめて判定するフィルタのコード(CapabilityEvaluators.cs)

 まず、SoftBank携帯のUser-Agent情報を文字列配列として定義している。

 エバリュエータ・デリゲート型フィルタとして定義されたisSoftBankメソッド内においては次の処理を行っている。現在のリクエスト情報からUser-Agentを取得し、それを“/”で分割する。分割結果の先頭要素がUser-Agent文字列配列に存在すればTrueを、存在しなければFalseを返している。isSoftBankメソッドにおいて、パラメータのcapabilitiesとargumentをまったく利用していないが、その理由については次回3.2.1で解説する。

 以上でエバリュエータ・デリゲート型フィルタの作成が完了した。

【エバリュエータ・デリゲート型フィルタの利用】
 では、作成したエバリュエータ・デリゲート型フィルタを利用してみよう。エバリュエータ・デリゲート型フィルタを利用する際にも2.3.4と同じようにWeb.configへ定義を追加する必要がある。下記の定義をWeb.configに追加する。

<filter name="isSoftBank" type="Mlib.CapabilityEvaluators,Mlib" method="isSoftBank"/>

 この定義の意味するところは以下である。

型が「Mlib.CapabilityEvaluators」クラスの「isSoftBank」メソッドを、「isSoftBank」というフィルタ名で定義する。

 続いて、下記のようにモバイルWebフォームを修正し、isSoftBankフィルタを利用する。

……省略……
  <DeviceSpecific>
    <Choice Filter="isSoftBank" Text="SoftBank" />  <!--追加 -->
    <Choice Filter="isCHTML10" Text="CHTML10" />
    <Choice Filter="isDoCoMo" Text="DoCoMo" />
    <Choice Text="OTHER"/>
  </DeviceSpecific>
……省略……
“isSoftBank”フィルタを追加したコード(m001.aspx)

 それでは実行結果を確認する。今回は新たに、SoftBankのシミュレータである「ウェブコンテンツヴューア」を利用して行う。下記サイトから、ダウンロードしインストールを行う。

 ウェブコンテンツヴューアのインストールが完了したら起動してみよう。iモードHTMLシミュレータIIとのインターフェイスの違いに戸惑うかもしれないので、任意のURLを開く方法を下図に示す。

ウェブコンテンツヴューアで任意のURLを開く手順
iモードHTMLシミュレータIIとのインターフェイスの違いがあるので、URLの入力方法も異なる。
  シミュレータ画面中央の「F」キーをクリックする。
  コンテキスト・メニューが表示されるので、[開く]を選択する。
  [エミュレータで開く]ウィンドウのURL入力欄に、URLを入力して「OK」をクリックする。

 これまでiモードHTMLシミュレータIIで行ってきたように、ウェブコンテンツヴューアで先ほど修正したモバイルWebフォームを確認する。その結果、画面に“SoftBank”と表示されることが確認できるだろう。

ウェブコンテンツヴューアでの実行結果

○2.3.6. デバイス・フィルタのまとめ
 それでは、デバイス・フィルタでできることや利用方法について以下にまとめておこう。

【デバイス・フィルタでできること】

  • ブラウザ情報を利用してデバイスを識別することができる
  • 識別したデバイス別に、任意のモバイル・コントロールのプロパティの値を設定することができる
  • デバイスの識別方法は、エバリュエータ・デリゲート型フィルタを利用し、カスタマイズできる

【デバイス・フィルタの利用方法】

  • デバイス・フィルタは、Web.configファイルの<deviceFilters>タグ内<Filter>タグとして定義する
  • 画面側で利用する際には、モバイル・コントロールのタグ内に<DeviceSpecific>タグと<Choice>タグを記述し指定する。

 デバイス・フィルタについては、(執筆時点では)ドコモ、au、SoftBankの3つに対応しておきたい(auへの対応は次回説明する)。

 今回はデバイス・フィルタについて解説し、その利用方法を示した。実はASP.NET 2.0には柔軟なカスタマイズ機能があることが分かり、驚かれた方も多いのではないだろうか。次回では、デバイス別の対応を行う方法として、デバイス・フィルタとカスタム・コントロールの組み合わせ方(絵文字コントロールの作成)や、デバイス・アダプタの活用方法について紹介する。End of Article


 INDEX
  [連載].NETでモバイル・サイト開発を始めよう
  第1回 ASP.NETによる携帯サイト開発は七転八倒?!
    1.ASP.NETによるモバイルWeb開発の現状
    2.デバイス・フィルタのデバイス識別機能
    3.デバイス・フィルタの利用方法
  4.エバリュエータ・デリゲート型フィルタ
 
インデックス・ページヘ  「.NETでモバイル・サイト開発を始めよう」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間