PHPでUser-Agent Client Hints(UA-CH)を利用したユーザーのデバイスを判別する方法
PHPでユーザーが利用しているデバイスを判別して処理を切り分ける場合は、スーパーグローバル変数を利用して情報を取得して処理をします。
これまでの方法としては、「$_SERVER[‘HTTP_USER_AGENT’]」を使ってユーザーエージェントの情報を取得し、PCであればWindowsやMac、モバイル端末であればMobileまたはAndroidやiPhone、iPadいった文字を含む情報を取得してから、対象の文字が含まれているかで判別を行なっていました。(iPadOS13以降のSafariでは、MobileやiPadの文字が含まれず、MacのPCと同じ情報が返ってきます)
$ua = $_SERVER['HTTP_USER_AGENT']
しかし、これまでのユーザーエージェントの取得方法については、サーバサイドスクリプトのJavaScriptのuserAgentもそうですが、廃止の方向で話が進んでいますので、PHPの$_SERVER[‘HTTP_USER_AGENT’]も廃止となる可能性があります。
そして今後は、User-Agent Client HintsのAPI情報を利用していく流れに変わりつつあります。
ここでは、PHPでのユーザーのデバイス判別を、これまでのHTTP_USER_AGENTとUser-Agent Client Hintsとどちらにも対応した方法でご紹介します。
User-Agent Client Hintsの利用
PHP8からは、以下のようなUser-Agent Client Hintsに関連する変数が利用できます。
返す値は以下の内容になります。
- $_SERVER[‘HTTP_SEC_CH_UA’]
- ブラウザの種類とバージョン情報を返す
例) “Chromium”;v=”122″, “Not(A:Brand”;v=”24″, “Google Chrome”;v=”122″ - $_SERVER[‘HTTP_SEC_CH_UA_MOBILE’]
- モバイルの判定に必要な値を返す
〔戻り値〕
モバイルの場合:?1
PCの場合:?0 - $_SERVER[‘HTTP_SEC_CH_UA_PLATFORM’]
- Windows、macOS、Androidなど、OSの種類を返す
実際に取得できる情報を確認してみます。
以下、確認用のサンプルコードになります。
User-Agent Client Hints(確認用)
<?php
$ua_ch = $_SERVER['HTTP_SEC_CH_UA'];
$ua_ch_mobile = $_SERVER['HTTP_SEC_CH_UA_MOBILE'];
$ua_ch_platform = $_SERVER['HTTP_SEC_CH_UA_PLATFORM'];
echo 'UA-CH: ' . $ua_ch . '<br>';
echo 'Mobile: ' . $ua_ch_mobile . '<br>';
echo 'Device: ' . $ua_ch_platform . '<br>';
?>
上記のプログラムをPCはMacとWindows、モバイルではAndroid端末で確認してみますと、以下のような情報が返ってきます。
・Mac(Google Chrome)
UA-CH: “Chromium”;v=”122″, “Not(A:Brand”;v=”24″, “Google Chrome”;v=”122″
Mobile: ?0
Device: “macOS”
・Windows(Microsoft Edge)
UA-CH: “Chromium”;v=”122″, “Not(A:Brand”;v=”24″, “Microsoft Edge”;v=”122″
Mobile: ?0
Device: “Windows”
・Android(Google Chrome)
UA-CH: “Chromium”;v=”122″, “Not(A:Brand”;v=”24″, “Google Chrome”;v=”122″
Mobile: ?1
Device: “Android”
・Android(Microsoft Edge)
UA-CH: “Chromium”;v=”122″, “Not(A:Brand”;v=”24″, “Microsoft Edge”;v=”122″
Mobile: ?1
Device: “Android”
お使いのサーバでUser-Agent Client Hints関連の変数が利用できるかは、print_r関数を使って変数の詳細を確認されるといいでしょう。
<?php print_r($_SERVER); ?>
ここでは、デバイスの判別方法のお話ですので、mobileやplatformの情報を活用していくことになります。
HTTP_USER_AGENTとHTTP_SEC_CH_UAを併用した判別
User-Agent Client HintsのAPIはまだ、すべてのWebブラウザにサポートされているわけではなく、Google ChromeやMicrosoft EdgeなどChromiumベースのWebブラウザのみとなっていますので、どちらの方法でも動作できるようにするには、これまでの方法と合わせて利用していく必要があります。
PHPのisset関数を使い、$_SERVER[‘HTTP_SEC_CH_UA’]で情報が取得できる、値があるかないかを条件とします。取得でき値があれば(trueなら)HTTP_SEC_CH_UAの処理を、取得できず値がなければ(false)これまでの HTTP_USER_AGENTで処理させます。
また、HTTP_SEC_CH_UAの処理でPCとモバイル端末を判別する場合は、$_SERVER[‘HTTP_SEC_CH_UA_MOBILE’]の情報を条件に処理を切り分けます。
返す値が「?1」であればモバイル端末であることがわかります。
MobileとPCの判別(確認用)
<?php
if (isset($_SERVER['HTTP_SEC_CH_UA'])) {
// HTTP_SEC_CH_UA
$ua_ch = $_SERVER['HTTP_SEC_CH_UA'];
$ua_ch_mobile = $_SERVER['HTTP_SEC_CH_UA_MOBILE'];
$ua_ch_platform = $_SERVER['HTTP_SEC_CH_UA_PLATFORM'];
echo 'UA-CH: ' . $ua_ch . '<br>';
echo 'Mobile: ' . $ua_ch_mobile . '<br>';
echo 'Device: ' . $ua_ch_platform . '<br>';
if ($_SERVER['HTTP_SEC_CH_UA_MOBILE']=='?1') {
echo 'Result - Mobile<br>';
} else {
echo 'Result - PC<br>';
}
} else {
// HTTP_USER_AGENT
$ua = $_SERVER['HTTP_USER_AGENT'];
echo $ua, '<br>';
}
?>
iPadのSafariでは、HTTP_USER_AGENTでもMobileやiPadといった文字が含まれず、HTTP_SEC_CH_UAでもPCとして認識されます。
HTTP_SEC_CH_UAでモバイルやPCのOSを細かく判別する場合は、以下のようにstrpos()関数を使って、platformの情報に対象の文字列が含まれているかで判別できます。
if ($_SERVER['HTTP_SEC_CH_UA_MOBILE']=='?1') {
echo 'Result - Mobile<br>';
if (strpos($ua_ch_platform, 'Android')) {
echo 'Android';
} else {
// Other
}
} else {
echo 'Result - PC<br>';
if (strpos($ua_ch_platform, 'macOS')) {
echo 'macOS';
} else if (strpos($ua_ch_platform, 'Windows')) {
echo 'Windows';
} else {
// Other
}
}
最後に
モバイルはスマートフォン端末でiPadはPCと同じとして処理する場合は、PHPでデバイスを判別してもいいでしょう。
JavaScriptであればタッチデバイスの判別もできるので、しっかりiPadとして判別して処理する必要がある場合は、JavaScriptでデバイスを判別することをおすすめします。
JavaScriptについては、以下の記事でご紹介しています。
HTTP_USER_AGENTは廃止の方向に進んでいますので、User-Agent Client Hintsも利用した方法を覚えておくと良いでしょう。