首页 文章

检测设备是否为iOS

提问于
浏览
317

我想知道是否可以检测浏览器是否在iOS上运行,类似于使用Modernizr进行特征检测的方式(尽管这显然是设备检测而不是功能检测) .

通常我更喜欢功能检测,但我需要找出设备是否是iOS,因为他们根据这个问题处理视频的方式YouTube API not working with iPad / iPhone / non-Flash device

11 回答

  • 667

    有这个自定义Modernizr测试:https://gist.github.com/855078

  • 2

    这会将变量 _iOSDevice 设置为 truefalse

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

    iOS设备上的用户代理称其中包含iPhone或iPad . 我只是根据这些关键字进行过滤 .

  • 8

    简化,易于扩展的版本 .

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

    几年前我写过这篇文章,但我相信它仍然有效:

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

    检测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的_1075810中注入了单词 iPhone ,试图以某种方式欺骗Gmail . 因此我们需要排除它 . 有关此herehere的更多信息 .

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

    Mozilla / 5.0(移动; Windows Phone 8.1; Android 4.0; ARM; Trident / 7.0; Touch; rv:11.0; IEMobile / 11.0;诺基亚; Lumia 930),如iPhone OS 7_0_3 Mac OS X AppleWebKit / 537(KHTML,如Gecko) )Mobile Safari / 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() 将是 truefalse

    Note: navigator.userAgentnavigator.platform 都可以由用户或浏览器扩展程序伪造 .


    检测iOS版本

    检测iOS版本的最常用方法是parsing it from the User Agent string . 但也有 feature detection inference *;

    我们知道 history API 是在iOS4中引入的 - 在iOS5中是 matchMedia API - 在iOS6中是 webAudio API - 在iOS7中是 WebSpeech API 等等 .

    Note: 以下代码不可靠,如果在较新的iOS版本中不推荐使用这些HTML5功能,则会破坏以下代码 . 你被警告了!

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

    如果您使用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');
    }
    
  • 3

    在添加Modernizr测试时,您应该尽可能为功能添加测试,而不是设备或操作系统 . 添加十个测试所有测试iPhone没有任何问题,如果这是它需要的 . 有些东西不能被检测到 .

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

    例如,在iPhone(而不是iPad)上无法在网页上内嵌播放视频,它会全屏显示 . 所以我创建了一个测试'no-inpage-video'

    然后你可以在css中使用它(如果测试失败,Modernizr会在 <html> 标签中添加一个类 .no-inpagevideo

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

    这将隐藏iPhone上的视频(我在这种情况下实际做的是显示一个替代图像,带有onclick来播放视频 - 我只是不想要默认的视频播放器和播放按钮来显示) .

  • 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);
    
    • 这很快,因为正则表达式首先检查平台字符串的 ^s tarting位置,如果没有"iP"则停止(比搜索长UA字符串要快得多)

    • 它比UA检查更安全(假设navigator.platform不太可能伪造)

    • 检测iPhone / iPad模拟器

  • -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;
        }
    
  • 8

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

相关问题