JavaScriptでユーザーエージェントを判別してFirefoxだけ除外しようとしたら、PC(Windows)では「firefox」という文字列で判別することができるのに、iPhoneだと除外対象にならなかった。(これMozillaさん、わざとじゃないのか?)
iPhoneのFirefoxアプリのユーザーエージェント例
Mozilla/5.0 (iPhone; CPU iPhone OS 16_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/112.0 Mobile/15E148 Safari/605.1.15
上記はiPhoneアプリ版のFirefoxのユーザーエージェントです。調べてみるとやはり「firefox」という文字列がない。
ちなみにPC(Windows)で確認すると以下のような感じになりました。
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0
FxiOSとは?
iPhoneアプリの方に「FxiOS」という文字列があり、おそらくこれで判別するべきだと思いましたが、一応FxiOSが何なのかを知っておく必要があります。ほかのブラウザにも混ざってたら想定外に除外される可能性がありますからね。
Mozilla公式には
iOS 版の Firefox では既定の Mobile Safari の UA 文字列に FxiOS/<version> トークンを追加したものになります。
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/User-Agent/Firefox
とありますので、FxiOSはiOS版のFirefoxに独自のユーザーエージェント文字列のようです。
公式に明言されていなかったので断言はできませんが、「FxiOS」とは「Firefox for iOS」の略称ではないかと推測されます。
補足ですが、Mozilla製のFirefox Focusにも同様に「FxiOS」というユーザーエージェント文字列が記載されているようです。
iPhoneアプリ(iOS全般)のFirefoxをUAで除外するには
以上を踏まえるとiOS版Firefoxで動作して欲しくない場合は下記のユーザーエージェントによる分岐が妥当そうです。
const userAgent = navigator.userAgent.toLowerCase();
if(userAgent.indexOf('fxios') !== -1){
// 除外したときの動作
}
これでiOS系のFirefoxで動作しなくなります。iPhoneだけにしたい場合は、
const userAgent = navigator.userAgent.toLowerCase(); // 全部小文字にしているのでご注意を
if(userAgent.indexOf('fxios') !== -1 && userAgent.indexOf('iphone')){
// 除外したときの動作
}
と記述すればOKです。
追記:iPad版Firefoxはなんと、
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1 Safari/605.1.15
だそうです。でこで判別するんだろうか……(参考:https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/User-Agent/Firefox#ios)