デバイスがiOSかどうかを検出する


408

Modernizrで機能を検出する方法と同様に、ブラウザーがiOSで実行されているかどうかを検出できるかどうか疑問に思っています(ただし、これは明らかに機能検出ではなくデバイス検出です)。

通常、代わりに機能検出を優先しますが、この質問に従ってビデオを処理する方法が原因でデバイスがiOSであるかどうかを確認する必要があります。YouTubeAPIがiPad / iPhone /非Flashデバイスで機能しない


[iOS 5のユーザーエージェント文字列とは何ですか?] [1](重複していますか?)を参照してください。[1]:stackoverflow.com/questions/7825873/...
dejuknow

1
これはクライアント側またはサーバー側の検出ですか?
Douglas Greenshields 2012年

@DouglasGreenshieldsさん、クライアント側です
SparrwHawk

1
また、重複ではなく、方法を尋ねています。これまでにユーザーエージェントスニッフィングを使用したことがありません。
SparrwHawk 2012年

回答:


821

iOSの検出

私はユーザーエージェントスニッフィングのファンではありませんが、次のように実行します。

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

別の方法は、次のものに依存していnavigator.platformます。

var iOS = navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform);

iOStrueまたはのいずれかになりますfalse

なぜMSStreamではないのか

マイクロソフトは、何らかの形でGmailをだまそうとするために、IE11にiPhoneという単語を挿入しましたuserAgent。したがって、それを除外する必要があります。これについての詳細はこちらこちらをご覧ください

以下はIE11の更新されたものですuserAgent(Windows Phone 8.1 UpdateのInternet Explorer)。

Mozilla / 5.0(モバイル; Windows Phone 8.1; Android 4.0; ARM; Trident / 7.0; Touch; rv:11.0; IEMobile / 11.0; NOKIA; Lumia 930)like iPhone OS 7_0_3 Mac OS X AppleWebKit / 537(KHTML、like Gecko)モバイルサファリ/ 537


正規表現を使用せずに、デバイスを簡単に追加します。

function iOS() {

  var iDevices = [
    'iPad Simulator',
    'iPhone Simulator',
    'iPod Simulator',
    'iPad',
    'iPhone',
    'iPod'
  ];

  if (navigator.platform) {
    while (iDevices.length) {
      if (navigator.platform === iDevices.pop()){ return true; }
    }
  }

  return false;
}

iOS()trueまたはのいずれかになりますfalse

注:どちらnavigator.userAgentnavigator.platformユーザまたはブラウザの拡張機能によって偽造することができます。


iOSバージョンの検出

iOSバージョンを検出する最も一般的な方法は、ユーザーエージェント文字列から解析することです。しかし、特徴検出の推論*もあります

私たちは事実を知っているhistory APIで導入されたiOS4を - matchMedia APIiOS5を - webAudio APIiOS6 - WebSpeech APIiOS7というように。..

注:次のコードは信頼性が低く、これらのHTML5機能のいずれかが新しいiOSバージョンで非推奨になると機能しなくなります。警告されました!

function iOSversion() {

  if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {
    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';
}

2
ピエールに感謝-このコードはもっと単純に見えますが、個別のiDevicesをすべて入力する必要があるのではなく、「iOS」を指定できるかどうか疑問に思います... if((navigator.userAgent.match(/ iPhone / i))| |(navigator.userAgent.match(/ iPod / i))||(navigator.userAgent.match(/ iPad / i))){//何かをする}
SparrwHawk

9
2番目のスニペットで行っているのは、機能検出ではなく、機能推定です。機能検出は、実際に使用する予定の機能をテストすることですが、実行しているのは、特定のバージョンのOSで導入され、OSのバージョンをそれらから推測することを偶然にテストすることです。iOSの将来のバージョンではこれらの機能が削除される可能性があるため、これは脆弱です。
Tim Down、

23
これはあなたの小切手を書くためのより良い方法である:var iOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
LandonSchropp

5
単なるメモ-navigator.platform配列は、プラットフォーム文字列に「iPad Simulator」というフレーズ全体が含まれているため、iPad Simulatorでは機能しません。
Kevin Newman

9
たとえば、iOS 13からiPadのユーザーエージェントが「Mac OS」に変更されました。たとえばMozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15、この回答を更新する必要があります
zvi

38

iOS 13以降では、iPadは古い方法ではiOSデバイスとして検出されないため、次のようにiOSデバイスを検出する必要があります(新しい「デスクトップ」オプション、デフォルトで有効になっているため):

let isIOS = /iPad|iPhone|iPod/.test(navigator.platform)
|| (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)

iOS <13、またはデスクトップモードが無効になっているiPhoneまたはiPadの最初の条件。デフォルト設定のiPadOS 13の2番目の条件。

実際のソリューションというよりはハックですが、私にとっては確実に機能します

PS前述のとおり、IEの診断を追加する必要があります

let isIOS = (/iPad|iPhone|iPod/.test(navigator.platform) ||
(navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&
!window.MSStream

navigator.userAgentこのチェックにを使用しないのはなぜ/iPad|iPhone|iPod/.test(navigator.platform)ですか?navigator.platformiPhone iOS <= 12の場合は常に「MacIntel」を返すようです
Charis Theo

@CharisTheo iPadがiOSのuserAgentにないため> = 13
Kzrbill

しかし、あなたはすでに2回目のチェックでiPad iOS> = 13をチェックしていますか、それとも何か不足していますか?
Charis Theo

navigator.maxTouchPointsはiOSではサポートされていないため、このチェックでは何も行われません。
PaulC

@PaulC、あなたはmaxTouchPointsがiOS 12以下では未定義であることは正しいですが、maxTouchPointsはiOS 13でサポートされているため、kikiworaは正しい方向に進んでいます。私の回答を参照してください。
Bob Arlof

14

変数_iOSDevicetrueまたはfalseに設定します

_iOSDevice = !!navigator.platform.match(/iPhone|iPod|iPad/);

3
何を!! 行う?
パトリック

4
@astronoughtの二重否定を使用してブール値にキャストします
Vitim.us

2
@astronought bang bang、you're boolean:D
Qback

1
使用/iPhone|iPod|iPad/.test(navigator.platform)すると回避できます!!
lionello

10

Modernizrを使用している場合は、カスタムテストを追加できます。

どの検出モード(userAgent、navigator.vendor、navigator.platform)を使用するかは関係ありません。後で簡単に使用できるようにいつでもラップできます。

//Add Modernizr test
Modernizr.addTest('isios', function() {
    return navigator.userAgent.match(/(iPad|iPhone|iPod)/g);
});

//usage
if (Modernizr.isios) {
    //this adds ios class to body
    Modernizr.prefixed('ios');
} else {
    //this adds notios class to body
    Modernizr.prefixed('notios');
}

2
注意してください、Modernizrは追加されたテストの名前を自動的に小文字にします。(あなたの例では、Modernizr.isiOSは決してtrueを返しません)。私の見解では、libの
不適切

3
ただ、小さな予告:あなたは簡素化することができますreturn x ? true : falsereturn Boolean(x)またはちょうどreturn !!x
tibalt


6

シンプルで拡張が容易なバージョン。

var iOS = ['iPad', 'iPhone', 'iPod'].indexOf(navigator.platform) >= 0;

1
これをiOSシミュレーターでも機能させたい場合は、以下を使用できますnavigator.platform.replace(' Simulator', '')
Koraktor、2015

しかし、それは機能しません。原因['str'].indexOf('string') == -1
tibalt

navigator.platformは、シミュレーターが実行されていない限り、正確に「iPad」、「iPhone」、または「iPod」になります。
Kory Nunn、2015年

4

iOS 13を実行しているiPadがにnavigator.platform設定されていることはおそらく答える価値MacIntelがあります。つまり、iPadOSデバイスを検出する別の方法を見つける必要があります。


3

私は数年前にこれを書きましたが、それでもまだうまくいくと思います:

if(navigator.vendor != null && navigator.vendor.match(/Apple Computer, Inc./) && navigator.userAgent.match(/iPhone/i) || (navigator.userAgent.match(/iPod/i))) 

    {

        alert("Ipod or Iphone");

    }

else if (navigator.vendor != null && navigator.vendor.match(/Apple Computer, Inc./) && navigator.userAgent.match(/iPad/i))  

    {

        alert("Ipad");

    }

else if (navigator.vendor != null && navigator.vendor.match(/Apple Computer, Inc./) && navigator.userAgent.indexOf('Safari') != -1)

    {

        alert("Safari");

    }

else if (navigator.vendor == null || navigator.vendor != null)

    {

        alert("Not Apple Based Browser");

    }

2

iOSデバイスのユーザーエージェントは、iPhoneまたはiPadを指します。これらのキーワードに基づいてフィルタリングするだけです。


4
考慮すべきiPod Touchもあります。
Douglas Greenshields 2012年

@DouglasGreenshields正解です。それについては忘れてしまいましたが、ユーザーエージェントでもIDが送信されると思います。
Bryan Naegele、2012年

iPad Safariのユーザーエージェントには、iPadOS 13の「iPad」が含まれなくなります。–
Jonny

2

Modernizrテストを追加するときは、可能な限り、デバイスやオペレーティングシステムではなく、機能のテストを追加する必要があります。それが必要な場合は、iPhoneのすべてのテストに10個のテストを追加しても問題はありません。機能によっては検出できないものもあります。

    Modernizr.addTest('inpagevideo', function ()
    {
        return navigator.userAgent.match(/(iPhone|iPod)/g) ? false : true;
    });

たとえば、iPhoneでは(iPadではなく)ビデオをWebページにインラインで再生することはできません。フルスクリーンで開きます。だから私はテスト「ノーインページビデオ」を作成しました

これをcssで使用できます(テストが失敗した場合、Modernizrはタグにクラス.no-inpagevideoを追加し<html>ます)

.no-inpagevideo video.product-video 
{
     display: none;
}

これにより、iPhoneのビデオが非表示になります(この場合、実際にオンクリックで代替画像を表示してビデオを再生しています。デフォルトのビデオプレーヤーと再生ボタンを表示したくないだけです)。


iOS10では、テストとしてplaysinline使用できるようになり'playsInline' in document.createElement('video');ました github.com/Modernizr/Modernizr/issues/2077
Simon_Weaver

2

うわー、ここには長くてトリッキーなコードがたくさんあります。シンプルにしてください!

これは私見が速く、節約でき、うまく機能しています:

 iOS = /^iP/.test(navigator.platform);

 // or, more future-proof (in theory, probably not in practice):

 iOS = /^iP(hone|[ao]d)/.test(navigator.platform);

 // or, if you prefer readability:

 iOS = /^(iPhone|iPad|iPod)/.test(navigator.platform);
  • regexp はプラットフォーム文字列の^ sターティング位置を最初にチェックし、"iP"がない場合は停止するため、高速です(とにかく最後まで長いUA文字列を検索するよりも高速です)。
  • UAチェックよりも安全です(navigator.platformが偽造される可能性が低いと想定)
  • iPhone / iPadシミュレータを検出


更新:これはデスクトップモードの iPadには適用されません(したがって、デフォルトのiPadOS 13)。
私のユースケースではそれで問題ありません。もしあなたがそうでなければ、ジャスティンとキキウォラの答えを見てください。


iOS = /^(iPhone|iPad|iPod)/.test(navigator.platform);これではなくiOS = /^(iPhone|iPad|iPod)/.test(navigator.userAgent || navigator.vendor || navigator.platform); 、私の場合、navigator.platformが機能しなかった場合の代替手段として実行し ましたが、後でうまくいくようにしています
Coderboi

navigator.platformうまくいきませんでしたか?あなたは本当にiOSを使っていますか?jeka.info/test/navigator.htmlで確認してくださいuserAgent一部のベンダーは、何らかの理由でAppleデバイスを模倣するためにそれを偽装しているため、誤検知を与えます。vendorちょうど戻っいずれかGoogle Inc.Apple Computer, Inc.または(Firefoxで)何もありません。
JJ

1

より機能的なアプローチを使用して、最初の回答を少し更新します。

    const isIOS = [
      'iPad Simulator',
      'iPhone Simulator',
      'iPod Simulator',
      'iPad',
      'iPhone',
      'iPod',
    ].indexOf(navigator.platform) !== -1;

Brave / Chrome開発ツールのモバイルシミュレータでは機能しません。取得MacIntel
sdfsdf

1

あなたも使うことができます includes

  const isApple = ['iPhone', 'iPad', 'iPod'].includes(navigator.platform)

1

ここでの以前の回答は、iOS 13を含むiOSのすべてのバージョンのすべての主要ブラウザーで機能しません。すべてのiOSバージョンのSafari、Chrome、Firefoxで機能するソリューションを次に示します。

var isIOS = (function () {
    var iosQuirkPresent = function () {
        var audio = new Audio();

        audio.volume = 0.5;
        return audio.volume === 1;   // volume cannot be changed from "1" on iOS 12 and below
    };

    var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);
    var isAppleDevice = navigator.userAgent.includes('Macintosh');
    var isTouchScreen = navigator.maxTouchPoints >= 1;   // true for iOS 13 (and hopefully beyond)

    return isIOS || (isAppleDevice && (isTouchScreen || iosQuirkPresent()));
})();

このコードスニペットは、簡潔さやパフォーマンスではなく、読みやすさを優先して記述されていることに注意してください。

説明:

  • ユーザーエージェントに「iPod | iPhone | iPad」のいずれかが含まれている場合、デバイスは明らかにiOSです。それ以外の場合は続行します...

  • 「Macintosh」を含まないその他のユーザーエージェントはAppleデバイスではないため、iOSにすることはできません。それ以外の場合は、Appleデバイスであるため、続行してください...

  • 以上のmaxTouchPoints値の場合1、Appleデバイスにはタッチスクリーンがあり、タッチスクリーンを備えたMacがないため、iOSである必要があります(言及についてはkudosからkikiworaへmaxTouchPoints)。これmaxTouchPointsundefinediOS 12以下用であるため、そのシナリオには別のソリューションが必要です...

  • iOS 12以前には、Mac OSには存在しない癖があります。奇妙なのはvolumeAudio要素のプロパティを以外の値に正常に設定できないことです1。これは、AppleがAudioiOSデバイスの要素の音量変更を許可していないためです。MacOSの場合は許可されています。その癖は、iOSデバイスとMac OSデバイスを区別するための最後のフォールバック方法として使用できます。


-1

私の場合、iPadではユーザーエージェントがMac OSと同じだったため、ユーザーエージェントは十分ではなかったため、厄介なトリックを実行する必要がありました。

var mql = window.matchMedia("(orientation: landscape)");

/**
 * If we are in landscape but the height is bigger than width
 */
if(mql.matches && window.screen.height > window.screen.width) {
    // IOS
} else {
    // Mac OS
}

モバイルを検出せずにiOSを検出するという質問を読んでください
Cyber​​supernova

-2

iOSのバージョンを検出するには、次のようなJavaScriptコードを使用してユーザーエージェントを分解する必要があります。

 var res = navigator.userAgent.match(/; CPU.*OS (\d_\d)/);
    if(res) {
        var strVer = res[res.length-1];
        strVer = strVer.replace("_", ".");
        version = strVer * 1;
    }

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.