-
PHP:ケータイのキャリア判別
アクセスしてきたケータイがi-mode/EZweb/SoftBankかの判定は、かつてはUserAgentだけで判別していました。しかし、vodafoneの一部機種はUserAgentに”UP.Browser”を含んでいたり、UserAgentに”vodafone”がなかったりします。今後もUserAgentがイレギュラーな新機種が発売される可能性もあり、UserAgentだけに頼るのは無理があるようです。
今回紹介する方法は、UserAgentと他の変数を使う方法です。UserAgentで判別できない場合は、SoftBank特有・EZweb特有の変数があるかどうかを調べます。もし新機種が発売されて、UserAgentで判別できなかったとしても「未対応です」と表示せずにすみます。
例えば、Smartyのテンプレートを切替えたい場合は、templates/0/hoge.tpl ~ templates/3/hoge.tpl を用意して、次のように使います。
require_once( 'bc.inc.php' ); $n = BC_get_carrier(); $smarty->display( "$n/hoge.tpl" );
各キャリアごとのディレクトリ名を数字にするのは、正直なところ私もしっくりきません。”pc”/”i”/”ez”/”sb”などにしたいところです。しかし、J-PHONE→vodafone→SoftBankと社名変更があったので、考えざるを得ません。数字が一番気にならないと思います。
以下を適当なファイル名(例えばbc.inc.php)で保存してください。(<?php と ?>で囲んでください。)
define( "BC_PC" , 0 ); define( "BC_EZWEB" , 1 ); define( "BC_VODAFONE" , 2 ); define( "BC_SOFTBANK" , 2 ); define( "BC_IMODE" , 3 ); function BC_get_carrier () { $ua = $_SERVER['HTTP_USER_AGENT']; $ca = BC_PC; if ( preg_match('/docomo/i', $ua) ) { $ca = BC_IMODE; } else if ( preg_match('/j-phone|vodafone|softbank/i', $ua) ) { $ca = BC_SOFTBANK; } else if ( preg_match('/J-EMULATOR|Vemulator/i', $ua) ) { $ca = BC_SOFTBANK; } else if ( preg_match('/kddi/i', $ua) ) { $ca = BC_EZWEB; } else if ( isset($_SERVER['HTTP_X_JPHONE_DISPLAY']) ) { $ca = BC_SOFTBANK; } else if ( isset($_SERVER['HTTP_X_EMULATOR_DISPLAY']) ) { $ca = BC_SOFTBANK; } else if ( isset($_SERVER['HTTP_X_UP_SUBNO']) ) { $ca = BC_EZWEB; } else if ( isset($_SERVER['HTTP_X_UP_DEVCAP_SCREENPIXELS']) ) { $ca = BC_EZWEB; } return $ca; }なお、もっとも確実な方法は、アクセス元のIPアドレス(REMOTE_ADDR)で判別する方法です。各キャリアごとにゲートウェイのIPアドレス範囲が公開されています。IPアドレス範囲は、ごくたま~に変更されるので、定期的に各キャリアの技術ページをチェックする必要があります。
Leave a reply



最近のコメント