用JavaScript检测iPad版本

时间:2011-09-13 10:38:23

标签: javascript ipad browser-feature-detection

是否可以在Web应用程序中检查iPad版本(1或2)?由于用户代理看起来相同(请参阅http://www.webtrends.com/Support/KnowledgeBase/SolutionDetail.aspx?Id=50140000000acbiAAA),因此浏览器的标准检查不起作用。

我们可以检查JavaScript中仅在版本2中可用的功能(如陀螺仪)吗?

9 个答案:

答案 0 :(得分:12)

请试试fiddle。它通过陀螺仪可用性检测iPad的版本。

正如您在Safari Developer Library中看到的那样,event.acceleration在具有陀螺仪的设备上不为空。由于iPad 1没有它,我们可以假设这个设备是iPad 1.

为了区分iPad 2和iPad 3,我们可以检查window.devicePixelRatio属性,因为iPad 3的Retina显示器的像素比率为== 2.

答案 1 :(得分:5)

抱歉,目前iPad和iPad 2没有区别。

看,两者之间没有区别:

iPad:
 Mozilla/5.0 (iPad; U; CPU OS 4_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8F190 Safari/6533.18.5

iPad2:
 Mozilla/5.0 (iPad; U; CPU OS 4_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8F191 Safari/6533.18.5

请注意, 版本 在iOS更新中不断更改

更新

看起来 之间存在差异:

iPad:
  Mobile/8F190

iPad 2:
  Mobile/8F191

iPad 3:
  Mobile/9B176 (according to Philipp)

答案 2 :(得分:4)

迟到这一点但是通过使用WEBGL_debug_renderer_info扩展名({3}}的一部分,您可以检索GPU的供应商和渲染器名称。

将此功能与设备的屏幕尺寸相结合,您可以准确定义它的版本。

// iPad model checks.
function getiPadModel(){
    // Create a canvas element which can be used to retreive information about the GPU.
    var canvas = document.createElement("canvas");
    if (canvas) {
        var context = canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
        if (context) {
            var info = context.getExtension("WEBGL_debug_renderer_info");
            if (info) {
                var renderer = context.getParameter(info.UNMASKED_RENDERER_WEBGL);
            }
        }
    }    

if(window.screen.height / window.screen.width == 1024 / 768) {
    // iPad, iPad 2, iPad Mini
    if (window.devicePixelRatio == 1) {
        switch(renderer) {
            default:
                return "iPad, iPad 2, iPad Mini";
            case "PowerVR SGX 535":
                return "iPad"
            case "PowerVR SGX 543":
                return "iPad 2 or Mini";
        }
    // iPad 3, 4, 5, Mini 2, Mini 3, Mini 4, Air, Air 2
    } else {
        switch(renderer) {
            default:
                return "iPad 3, 4, 5, Mini 2, Mini 3, Mini 4, Air, Air 2";
            case "PowerVR SGX 543":
                return "iPad 3";
            case "PowerVR SGX 554":
                return "iPad 4";
            case "Apple A7 GPU":
                return "iPad Air, Mini 2, Mini 3";
            case "Apple A8X GPU":
                return "iPad Air 2";
            case "Apple A8 GPU":
                return "iPad Mini 4";
            case "Apple A9 GPU":
                return "iPad 5, Pro 9.7";
        }
    }
// iPad Pro 10.5
} else if (window.screen.height / window.screen.width == 1112 / 834) {
    return "iPad Pro 10.5";
// iPad Pro 12.9, Pro 12.9 (2nd Gen)
} else if (window.screen.height / window.screen.width == 1366/ 1024) {
    switch(renderer) {
        default:
            return "iPad Pro 12.9, Pro 12.9 (2nd Gen)";
        case "Apple A10X GPU":
            return "iPad Pro 12.9 (2nd Gen)";
        case "Apple A9 GPU":
            return "iPad Pro 12.9";
    }
} else {
    return "Not an iPad";
}
}

也可以为iPhone型号完成,WebGL API更详细。

答案 3 :(得分:2)

在iPad 1和2步之间检测:

  1. 检查iPad的UA字符串
  2. 检查陀螺仪
  3. 在iPad 2和3步之间检测:

    1. 检查iPad的UA字符串
    2. 检查像素密度(Retina iPad 3显示= 2)
    3. 在iPad 3和4步之间检测:

      1. 检查iPad的UA字符串
      2. 检查像素密度(Retina显示= 2)
      3. 检查设备最大各向异性(iPad 3 = 2,iPad 4 = 16)
      4. 16的最大各向异性通常表示具有良好图形性能的现代设备。

        
        
        var gl;
        var iPadVersion = false;
        
        window.ondevicemotion = function(event) {
          if (!iPadVersion && navigator.platform.indexOf("iPad") != -1) {
            iPadVersion = 1;
            if (event.acceleration) iPadVersion = window.devicePixelRatio;
          }
          window.ondevicemotion = null;
        }
        
        function initWebGL(canvas) {
          gl = null;
        
          try {
            gl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
          }
          catch(e) {}
        
          if (!gl) {
            gl = null;
          }
        
          return gl;
        }
        
        function checkMaxAnisotropy() {
          var max = 0;
        
          var canvas = document.getElementById('webGLCanvasTest');
          gl = initWebGL(canvas);
        
          try {
            gl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
          }
          catch(e) {}
        
          if (gl) {
            var ext = (
              gl.getExtension('EXT_texture_filter_anisotropic') ||
              gl.getExtension('MOZ_EXT_texture_filter_anisotropic') ||
              gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic')
            );
        
            if (ext){
              max = gl.getParameter(ext.MAX_TEXTURE_MAX_ANISOTROPY_EXT);
            }
          }
          return max;
        }
        
        function isiPad( $window ) {
          var ua = $window.navigator.userAgent || $window.navigator.vendor || $window.opera;
          return (/iPad/).test(ua);
        }
        
        
        function getiPadVersion( $window ) {
          if(isiPad(window) && window.devicePixelRatio === 2) {
            if(checkMaxAnisotropy() < 4) {
              iPadVersion = 3;
            } else {
              iPadVersion = 4;
            }
          }
          return iPadVersion;
        }
        
        
        /* BONUS CODE 
           isSmartDevice() - Detect most mobile devices
           isOldDevice() - Detect older devices that have poor video card performance
        */
        
        function isSmartDevice( $window ) {
          var ua = $window.navigator.userAgent || $window.navigator.vendor || $window.opera;
          return (/iPhone|iPod|iPad|Silk|Android|BlackBerry|Opera Mini|IEMobile/).test(ua);
        }
        
        function isOldDevice() {
          if(isSmartDevice(window) && window.devicePixelRatio === 1 && checkMaxAnisotropy() < 4 || isiPad( window ) && checkMaxAnisotropy() < 4) {
            return true;
          } else {
            return false;
          }
        }
        
        
        alert('iPad Version: ' + getiPadVersion(window) );
        &#13;
        #webGLCanvasTest {
          width: 1px;
          height: 1px;
          position: fixed;
          top: -1px;
          left: -1px;
        }
        &#13;
        <!-- Device Testing Canvas, Hide This Somewhere -->
        <canvas id="webGLCanvasTest"></canvas>
        &#13;
        &#13;
        &#13;

答案 4 :(得分:1)

正如其他人已经指出的那样,这些是目前正在使用的2个用户:

iPad:
 Mozilla/5.0 (iPad; U; CPU OS 4_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8F190 Safari/6533.18.5

iPad2:
 Mozilla/5.0 (iPad; U; CPU OS 4_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8F191 Safari/6533.18.5

但如果你看得足够近,他们相同,那就有区别了:

  • iPad 有“Mobile / 8F190”
  • iPad 2 有“Mobile / 8F191”

所以,你去吧。

答案 5 :(得分:0)

用户代理检测可以获取Safari应用程序的版本,而不是iPad本身的版本,因为您的Web应用程序只能在浏览器环境中运行。

陀螺仪和所有其他API都是SDK API,因此它们仅适用于本机应用程序开发,而不适用于Web应用程序。

答案 6 :(得分:0)

看起来iPad 2可以拥有与新iPad相同的 Mobile / 9B176 代码。也许是因为iOS的更新?

这是我的完整iPad2用户代理字符串:

Mozilla / 5.0(iPad; CPU OS 5_1,如Mac OS X)AppleWebKit / 534.46(KHTML,类似Gecko)版本/ 5.1 Mobile / 9B176 Safari / 7534.48.3

我无法查看更新的iPad 3.有人可以告诉我是否有任何区别?

(顺便说一句,如果您只是想知道用户是否拥有低分辨率或高分辨率iPad,您可以使用此技巧:https://stackoverflow.com/a/10142357/974563

答案 7 :(得分:0)

PLS不依赖于用户代理字符串解释。

这根本不可靠:我可以在iPad2上看到Mobile / 8J2,在iPad1上看到Mobile / 9A405。因此,不同的iOS版本(以及Safari)会在同一个iPad版本上提醒不同的UA。

我们应该只进行加速度特征检测;客户端或服务器端(WURFL acceleration等...)。

答案 8 :(得分:-1)

怎么样:

// For use within normal web clients 
var isiPad = navigator.userAgent.match(/iPad/i) != null;

// For use within iPad developer UIWebView
// Thanks to Andrew Hedges!
var ua = navigator.userAgent;
var isiPad = /iPad/i.test(ua) || /iPhone OS 3_1_2/i.test(ua) || /iPhone OS 3_2_2/i.test(ua);

另外,请查看:

http://davidwalsh.name/detect-ipad