CMSのポテンシャルを引き出す─MODxで作る商用サイト

第19回 MODxでスマートフォン対策[その1]

この記事を読むのに必要な時間:およそ 3 分

クライアントの判別方法

閲覧者が通常のブラウザからアクセスしているのか,それともモバイル端末からなのかを判定するにはどうすれば良いのでしょうか?

これに関しては古くからさまざまな議論があり,i-modeやEZwebなどのケータイ用サイトを構築する場合には,クライアントのIPアドレスからデバイスを識別するのがひとつの方法でした。ただ,この方式では常にキャリア側が保持するIPアドレス帯に気を配る必要があり,場合によっては誤作動となってしまう可能性もあったため,IPアドレスではなくブラウザが送出するユーザエージェントを元にデバイスを判別する方法も用いられてきました。この方式では,IPアドレスの管理を行う必要性がない一方,ユーザエージェントの情報をWebサーバ側で管理する必要性がありますし,そもそもユーザエージェントの値は閲覧者側で書き換え可能であるため,PCからでもモバイル表示ができてしまうという問題もありました。

スマートフォン用コンテンツを作成する場合には,後者のユーザエージェントによる判別を行う必要があります。というのも,スマートフォンはPCやラップトップ同様,3GネットワークではないWi-Fi経由での接続が考えられるためです。ここで,

「⁠⁠メジャーな)iPhoneであればちゃんと判別されそうだけど,Androidはちゃんとモバイル端末として判定されるのかなぁ?」

といった心配が出てくるかもしれませんので,実際の判定部分を少し覗いてみることにしましょう。MODxの管理画面よりプラグインのソースをちらりと眺めてみると,どうやらクライアントの判断は

リスト2 mobiledetectionプラグインのクライアント判定部分

//Detect iPhone
} else if (($uagent_obj->DetectTierIphone() == $uagent_obj->true) && ($iphone == 1)){
delete_template_nodes($standard_node, $mobile_node);
store_user_prefs($mobile_node, $usecookie);
//Detect iPad
} else if (($uagent_obj->DetectIpad() == $uagent_obj->true) && ($ipad == 1)){
delete_template_nodes($standard_node, $mobile_node);
store_user_prefs($mobile_node, $usecookie);

のようにして行っているようです。この, DetectTierIphoneというメソッドを検索してみたところ,これは/var/www/html/assets/components/mobiledetection/mdetect.phpで定義されていることがわかりました。この中を見てみると,次のような変数宣言が見つかります。

リスト3 mdetect.php中の機種判定変数

   //Initialize some initial smartphone string variables. 
   var $engineWebKit = 'webkit'; 
   var $deviceIphone = 'iphone'; 
   var $deviceIpod = 'ipod'; 
   var $deviceIpad = 'ipad'; 
   var $deviceMacPpc = 'macintosh'; //Used for disambiguation 

   var $deviceAndroid = 'android'; 
   var $deviceGoogleTV = 'googletv'; 
   var $deviceXoom = 'xoom'; //Motorola Xoom 
   
   var $deviceNuvifone = 'nuvifone'; //Garmin Nuvifone 

   var $deviceSymbian = 'symbian'; 
   var $deviceS60 = 'series60'; 
   var $deviceS70 = 'series70'; 
   var $deviceS80 = 'series80'; 
   var $deviceS90 = 'series90'; 
   
   var $deviceWinPhone7 = 'windows phone os 7'; 
   var $deviceWinMob = 'windows ce'; 
   var $deviceWindows = 'windows'; 
   var $deviceIeMob = 'iemobile'; 
   var $devicePpc = 'ppc'; //Stands for PocketPC 
   var $enginePie = 'wm5 pie'; //An old Windows Mobile 
   
   var $deviceBB = 'blackberry';   
   var $vndRIM = 'vnd.rim'; //Detectable when BB devices emulate IE or Firefox 
   var $deviceBBStorm = 'blackberry95';  //Storm 1 and 2 
   var $deviceBBBold = 'blackberry97'; //Bold 
   var $deviceBBTour = 'blackberry96'; //Tour 
   var $deviceBBCurve = 'blackberry89'; //Curve2 
   var $deviceBBTorch = 'blackberry 98'; //Torch 
   var $deviceBBPlaybook = 'playbook'; //PlayBook tablet 
   
   var $devicePalm = 'palm'; 
   var $deviceWebOS = 'webos'; //For Palm's new WebOS devices 
   var $engineBlazer = 'blazer'; //Old Palm browser 
   var $engineXiino = 'xiino'; //Another old Palm 
   
   var $deviceKindle = 'kindle'; //Amazon Kindle, eInk one. 
   
   //Initialize variables for mobile-specific content. 
   var $vndwap = 'vnd.wap'; 
   var $wml = 'wml';   
   
-- 略 --

これを見ると,iPhoneやAndroidはもちろんのこと,WindowsPhoneやNintendo DSなど,思った以上にさまざまなデバイスがサポートされているようです。

最後に

中途半端な形での紹介になってしまいましたが,mobiledetectionプラグインの基本的な挙動が理解できたところで,次回は実際にPC表示,モバイル表示を使い分けるためのテンプレートを紹介していきたいと思います。お楽しみに。

著者プロフィール

中満英生(なかみつひでお)

大学時代に出会ったSolarisがきっかけでUNIXの世界へ。その後ホスティングプロバイダ,データセンターで実務経験を積む傍ら,雑誌記事の執筆や技術セミナーの講師を務める。サーバ設定の他,セキュリティに関する著作や技術者エッセイも執筆経験あり。