結論
<script type="text/javascript"><!--
function getPlatform() {
// IE か
var isIe = (String.prototype.hasOwnProperty('startsWith') === false);
// Winか否か
var isWinPc = navigator.platform.startsWith('Win') || isIe;
// Androidか否か
var isAndroid = navigator.userAgent.indexOf('Android') > 0;
// Macか否か
var isApple = navigator.platform.startsWith('Mac') || navigator.platform.startsWith('iPhone') || navigator.platform.startsWith('iPad');
// AppleMobileか否か
var isAppleMoblile = isApple && (typeof navigator.standalone !== 'undefind' && navigator.standalone === false);
// AppleDesctopか否か
var isAppleDesctop = isApple && !isAppleMoblile;
if (isWinPc) {
return 'win';
}
if (isAndroid) {
return 'android';
}
if (isAppleMoblile) {
return 'apple_mobile';
}
if (isAppleDesctop) {
return 'mac';
}
return false;
}
--></script>
参考: navigator
https://developer.mozilla.org/ja/docs/Web/API/Window/navigator
参考: navigator.standalone
https://developer.mozilla.org/ja/docs/Web/API/Navigator
論理コード
VAR IEである = 'String' に'startWith'がない。
VAR Windowsである = 'navigator.platform' が 'Win' で始まる
VAR Androidである = 'navigator.userAgent' に 'Android' がある。
VAR Appleの端末である =
('navigator.platform' が 'Mac' で始まる) または
('navigator.platform' が 'iPhone' で始まる) または
('navigator.platform' が 'iPad' で始まる)
VAR Appleのモバイル端末である =
('navigator.standalone' が 'undefind' ではない) かつ
('navigator.standalone' が 'false' である)
VAR Appleのデスクトップ端末である =
(Appleの端末である)かつ
(Appleのモバイル端末である の否定)
解説1VAR IEである = 'String' に'startWith'がない。
IEのみ startWith をサポートしていないので利用する。
参考:
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
解説2 VAR Windowsである = 'navigator.platform' が 'Win' で始まる
Windowの場合は簡単で、navigator.platform の返り値に Win が含まれている。
これを利用しない手はない。
解説3VAR Androidである = 'navigator.userAgent' に 'Android' がある。
今回、Androidのみ、UserAgentを利用している。理由は2つ。
1: navigator.platform の返り値が カーネルになっているため。
2: 他にスマートな方法が思いつかなかった。
の2点。
...UserAgentが廃止になったらどうすべきか。
解説4 アップル端末について判定
Appleの端末だけ段階的に判定を行います。理由は2つ。
1: navigator.platform の返り値が端末の種類やブラウザ設定によって切り替わるため
2: navigator.userAgentが端末のバージョンごとに違うため(またはデスクトップとモバイルで同じになるため)
-
ステップ1
-
navigator.platform で Mac iPhone iPad を網羅してApppleの端末であることを切り分ける
-
※ iPhone、iPadでも 返り値が Macになることがあるためこれだけでは判定できない。
-
ステップ2
-
navigator.standaloneでiOSサファリであることを確認する。
-
このプロパティはMDSによるとiOSサファリにしか実装されておらず、
-
端末がスタンドアロンで起動している場合は TRUE を返すそう。
-
画面分割は試してない。けどしらん!
-
ステップ3
-
ステップ1とステップ2を基に Mac か iOS かを判定する。
以上。