检测设备是否是iOS

我想知道是否有可能检测浏览器是否在iOS上运行,类似于如何使用Modernizr进行function检测(尽pipe这显然是设备检测而不是function检测)。

通常情况下,我会倾向于function检测,但是我需要找出设备是否是iOS,因为他们处理video的方式与此问题相同YouTube API不能与iPad / iPhone /非Flash设备一起使用

检测iOS

我不是用户代理嗅探的粉丝,但这是你将如何做到这一点:

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

另一种方式,依靠不赞成的navigator.platform

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

iOS将是truefalse

为什么不MSStream

微软在IE11的userAgent中注入了iPhone这个词,试图欺骗Gmail。 所以我们需要排除它。 更多关于这里和这里的信息 。

下面是IE11更新的userAgent (用于Windows Phone 8.1更新的Internet Explorer):

像iPhone OS 7_0_3 Mac OS X AppleWebKit / 537(KHTML,如Gecko)的Mozilla / 5.0(Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident / 7.0; Touch; rv:11.0; IEMobile / 11.0; NOKIA; Lumia 930)移动Safari / 537


轻松添加更多设备,无需使用正则expression式:

 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()将是truefalse

注意: navigator.userAgentnavigator.platform都可以由用户或浏览器扩展伪造。


检测iOS版本

检测iOS版本的最常用方法是从用户代理string中parsing出来 。 但也有特征检测推理 * ;

我们知道history API是在iOS4中引入的 – 在iOS5中的 webAudio APIiOS6中的 WebSpeech API – 在iOS7中的 WebSpeech API等等。

注意:以下代码不可靠,如果在较新的iOS版本中不推荐使用这些HTML5function中的任何一个,则会中断。 你被警告了!

 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'; } 

如果您正在使用Modernizr ,则可以为其添加自定义testing。

您决定使用哪种检测模式(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'); } 

有这个自定义的Modernizrtesting: https : //gist.github.com/855078

这将variables_iOSDevicetruefalse

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

iOS设备上的用户代理表示iPhone或iPad。 我只是根据这些关键字进行过滤。

我几年前写了这个,但我相信它仍然有效:

 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"); } 

简化,易于扩展的版本。

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

在添加Modernizrtesting时,您应该尽可能为function添加testing,而不是添加设备或操作系统。 添加十个testing全部testingiPhone是没有问题的,如果这是需要的。 有些东西不能被检测到。

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

例如,在iPhone(不是iPad)上,video不能在网页上内联播放,而是全屏显示。 所以我创build了一个testing“no-inpage-video”

然后,你可以在CSS中使用这个(如果testing失败, .no-inpagevideo会向<html>标签添加一个类.no-inpagevideo

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

这将隐藏iPhone上的video(我在这种情况下实际上正在显示一个替代图像与onclick播放video – 我只是不希望默认的video播放器和播放button来显示)。

如上所述,您可以使用用户代理来确定您是否在iOS上运行。 至于各种边缘情况 – 它已经照顾了:)我写这是移动组件 ,可以检测您是否在iOS设备上运行,以及其他平台,并考虑到各种边缘情况。

随意导入它并使用如下例所示:

 isMobile.iOS() => true/false isMobile.iPhone() => true/false isMobile.iPad() => true/false isMobile.Android() => true/false isMobile.Windows() => true/false isMobile.any() => true/false 

为了检测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; } 

var isiOSSafari = (navigator.userAgent.match(/like Mac OS X/i)) ? true: false;