PHP で Android と iOS の処理を分岐させる

はじめに

実務にて、React Native + Expo CLI のガワネイティブアプリに Firebase のプロジェクトを Android と iOS に分けて管理できるよう FirebaseAnalytics を導入してほしいという小仕事の依頼があり、Web 側の PHP で読み込む FirebaseAnalytics の CDN をユーザーエージェントで分岐させて解決した情報になります。

ソースコード

<?php $user_agent = $_SERVER['HTTP_USER_AGENT']; ?>

<?php if (preg_match('/iPhone|iPod|iPad/iu', $user_agent)): ?>
  <p>ここに iOS のコードを書く。</p>
<?php elseif (preg_match('/Android/iu', $user_agent)): ?>
  <p>ここに Android のコードを書く。</p>
<?php else: ?>
  <p>ここに PC のコードを書く。</p>
<?php endif; ?>

検証環境

解説

処理を Android と iOS で分岐させるには、まず $_SERVER の HTTP_USER_AGENT インデックスから User-Agent(ユーザーエージェント)文字列を取得します。

$user_agent = $_SERVER['HTTP_USER_AGENT'];

次に、User-Agent(ユーザーエージェント)文字列に preg_match で Android と iOS の文字列が含まれるか正規表現によるマッチングを行い、その結果によって if 構文で処理を分岐させます。

$user_agent = $_SERVER['HTTP_USER_AGENT'];

if (preg_match('/iPhone|iPod|iPad/iu', $user_agent))
  echo 'iOS';
elseif (preg_match('/Android/iu', $user_agent))
  echo 'Android';
else
  echo 'PC';

HTML を出し分ける場合は、下記のようにできます。

<?php $user_agent = $_SERVER['HTTP_USER_AGENT']; ?>

<?php if (preg_match('/iPhone|iPod|iPad/iu', $user_agent)): ?>
  <p>iOS</p>
<?php elseif (preg_match('/Android/iu', $user_agent)): ?>
  <p>Android</p>
<?php else: ?>
  <p>PC</p>
<?php endif; ?>

preg_match の正規表現構文(PCRE)については パターン構文 に情報があります。

文字列のスラッシュ( / )は デリミタ です。検索したい文字列を囲みましょう。

終了デリミタの後ろにある i と u は 修飾子 です。i(PCRE_CASELESS)は、対象文字列の大文字小文字の区別をしません。u(PCRE_UTF8)は、対象文字列を UTF-8 として処理します、日本語などの マルチバイト文字列 を扱う場合は記述しましょう。

あとは、これを共通 footer などに記述すれば終わりです。

おわりに

デリミタ をデミリタって言い間違えそうになることがある。