1. ホーム
  2. javascript

[解決済み] デバイスがiOSであるかどうかを検出する

2022-02-19 21:37:33

質問

Modernizr の機能検出と同様に、iOS でブラウザが動作しているかどうかを検出することは可能でしょうか(これは明らかに機能検出ではなくデバイス検出ですが)?

通常、私は機能検出を支持しますが、次の質問のように、動画の処理方法のためにデバイスがiOSであるかどうかを調べる必要があります。 iPad / iPhone / 非FlashデバイスでYouTube APIが動作しない

解決するには?

iOSの検出

iOS 13 iPad は、ユーザーエージェントとプラットフォーム文字列の両方が変更されます。 iPadとMacOSの区別は可能なようです そのため、以下のすべての回答は、現在、それを考慮する必要があります。

iOS 13もカバーする最短の選択肢かもしれません。

function iOS() {
  return [
    'iPad Simulator',
    'iPhone Simulator',
    'iPod Simulator',
    'iPad',
    'iPhone',
    'iPod'
  ].includes(navigator.platform)
  // iPad on iOS 13 detection
  || (navigator.userAgent.includes("Mac") && "ontouchend" in document)
}

iOS はどちらかになります。 true または false

もっと悪い選択肢 ユーザーエージェントのスニッフィング

ユーザーエージェントのスニッフィングは、より危険であり、問題が頻繁に発生します。

iPad iOS 13では、ユーザーエージェントがMacOS 13のコンピュータのものと同一になる しかし、iPadを無視すれば、しばらくはまだ使えるかもしれません。

var iOS = !window.MSStream && /iPad|iPhone|iPod/.test(navigator.userAgent); // fails on iPad iOS 13

!window.MSStream はIE11を不正に検出しないためのものです。 ここで こちら .

どちらも navigator.userAgentnavigator.platform は、ユーザーやブラウザの拡張機能によって偽造される可能性があります。

userAgentやプラットフォームを変更するブラウザ拡張機能が存在するのは、Webサイトがあまりにも強引な検出を行うため、ユーザーのブラウザがその機能を使用できる場合でも、一部の機能を無効にしてしまうことが多いからです。

このユーザーとの衝突を緩和するために、ウェブサイトが必要とする機能をケースごとに具体的に検出することをお勧めします。そうすれば、ユーザーが必要な機能を備えたブラウザを手に入れたとき、追加のコードを変更することなく、すでに動作するようになります。

iOSのバージョンを検出する

iOSのバージョンを検出する最も一般的な方法は、以下の通りです。 ユーザーエージェントの文字列からパースする . しかし 特徴 <ストライク 検出 * ;

私たちは、以下の事実を知っています。 history API に導入されました。 iOS4 - matchMedia API iOS5 - webAudio API iOS6 - WebSpeech API iOS7 といった具合です。

以下のコードは信頼性が低く、これらの HTML5 機能のいずれかが新しい iOS バージョンで非推奨となった場合、破損します。警告が出ました!

function iOSversion() {

  if (iOS) { // <-- Use the one here above
    if (window.indexedDB) { return 'iOS 8 and up'; }
    if (window.SpeechSynthesisUtterance) { return 'iOS 7'; }
    if (window.webkitAudioContext) { return 'iOS 6'; }
    if (window.matchMedia) { return 'iOS 5'; }
    if (window.history && 'pushState' in window.history) { return 'iOS 4'; }
    return 'iOS 3 or earlier';
  }

  return 'Not an iOS device';
}