Modernizrで機能を検出する方法と同様に、ブラウザーがiOSで実行されているかどうかを検出できるかどうか疑問に思っています(ただし、これは明らかに機能検出ではなくデバイス検出です)。
通常、代わりに機能検出を優先しますが、この質問に従ってビデオを処理する方法が原因でデバイスがiOSであるかどうかを確認する必要があります。YouTubeAPIがiPad / iPhone /非Flashデバイスで機能しない
Modernizrで機能を検出する方法と同様に、ブラウザーがiOSで実行されているかどうかを検出できるかどうか疑問に思っています(ただし、これは明らかに機能検出ではなくデバイス検出です)。
通常、代わりに機能検出を優先しますが、この質問に従ってビデオを処理する方法が原因でデバイスがiOSであるかどうかを確認する必要があります。YouTubeAPIがiPad / iPhone /非Flashデバイスで機能しない
回答:
私はユーザーエージェントスニッフィングのファンではありませんが、次のように実行します。
var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
別の方法は、次のものに依存していnavigator.platform
ます。
var iOS = navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform);
iOS
true
またはのいずれかになりますfalse
マイクロソフトは、何らかの形で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.userAgent
とnavigator.platform
ユーザまたはブラウザの拡張機能によって偽造することができます。
iOSバージョンを検出する最も一般的な方法は、ユーザーエージェント文字列から解析することです。しかし、特徴検出の推論*もあります。
私たちは事実を知っているhistory API
で導入されたiOS4を - matchMedia API
にiOS5を - webAudio API
でiOS6 - WebSpeech API
でiOS7というように。..
注:次のコードは信頼性が低く、これらの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';
}
var iOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15
、この回答を更新する必要があります
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.platform
iPhone iOS <= 12の場合は常に「MacIntel」を返すようです
navigator.maxTouchPoints
はiOSではサポートされていないため、このチェックでは何も行われません。
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');
}
return x ? true : false
にreturn Boolean(x)
またはちょうどreturn !!x
このカスタムModernizrテストがあります:https : //gist.github.com/855078
シンプルで拡張が容易なバージョン。
var iOS = ['iPad', 'iPhone', 'iPod'].indexOf(navigator.platform) >= 0;
navigator.platform.replace(' Simulator', '')
。
['str'].indexOf('string') == -1
iOS 13を実行しているiPadがにnavigator.platform
設定されていることはおそらく答える価値MacIntel
があります。つまり、iPadOSデバイスを検出する別の方法を見つける必要があります。
私は数年前にこれを書きましたが、それでもまだうまくいくと思います:
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");
}
iOSデバイスのユーザーエージェントは、iPhoneまたはiPadを指します。これらのキーワードに基づいてフィルタリングするだけです。
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のビデオが非表示になります(この場合、実際にオンクリックで代替画像を表示してビデオを再生しています。デフォルトのビデオプレーヤーと再生ボタンを表示したくないだけです)。
playsinline
使用できるようになり'playsInline' in document.createElement('video');
ました github.com/Modernizr/Modernizr/issues/2077
うわー、ここには長くてトリッキーなコードがたくさんあります。シンプルにしてください!
これは私見が速く、節約でき、うまく機能しています:
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);
iOS = /^(iPhone|iPad|iPod)/.test(navigator.platform);
これではなくiOS = /^(iPhone|iPad|iPod)/.test(navigator.userAgent || navigator.vendor || navigator.platform);
、私の場合、navigator.platformが機能しなかった場合の代替手段として実行し ましたが、後でうまくいくようにしています
navigator.platform
うまくいきませんでしたか?あなたは本当にiOSを使っていますか?jeka.info/test/navigator.htmlで確認してください。userAgent
一部のベンダーは、何らかの理由でAppleデバイスを模倣するためにそれを偽装しているため、誤検知を与えます。vendor
ちょうど戻っいずれかGoogle Inc.
、Apple Computer, Inc.
または(Firefoxで)何もありません。
ここでの以前の回答は、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
)。これmaxTouchPoints
はundefined
iOS 12以下用であるため、そのシナリオには別のソリューションが必要です...
iOS 12以前には、Mac OSには存在しない癖があります。奇妙なのはvolume
、Audio
要素のプロパティを以外の値に正常に設定できないことです1
。これは、AppleがAudio
iOSデバイスの要素の音量変更を許可していないためです。MacOSの場合は許可されています。その癖は、iOSデバイスとMac OSデバイスを区別するための最後のフォールバック方法として使用できます。
私の場合、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
}
var isiOSSafari = (navigator.userAgent.match(/like Mac OS X/i)) ? true: false;