如何确定javascript代码在哪个iPhone版本上运行?

如何确定javascript代码在哪个iPhone版本上运行?,javascript,mobile,mobile-safari,Javascript,Mobile,Mobile Safari,需要区分iPhone3x和iPhone4x。有什么方法可以从JavaScript中找出版本吗?您可以使用navigator.userAgent检查操作系统版本,但这并不是真正的问题 您可以使用媒体查询来检查设备的实际屏幕分辨率,这可能是当前问题的原因 var isRetina = window.matchMedia("(-webkit-min-device-pixel-ratio: 2)").matches; 您也可以不使用JavaScript,通过使用媒体查询加载视网膜显示的不同样式表: &

需要区分iPhone3x和iPhone4x。有什么方法可以从JavaScript中找出版本吗?

您可以使用
navigator.userAgent
检查操作系统版本,但这并不是真正的问题

您可以使用媒体查询来检查设备的实际屏幕分辨率,这可能是当前问题的原因

var isRetina = window.matchMedia("(-webkit-min-device-pixel-ratio: 2)").matches;
您也可以不使用JavaScript,通过使用媒体查询加载视网膜显示的不同样式表:

<link rel="stylesheet" href="retina.css"
    media="only screen and (-webkit-min-device-pixel-ratio: 2)" />

也许您可以通过在query
navigator.appVersion.indexOf(“…”)中获取操作系统版本来检查它
iphone3G有苹果iOS 4.2.1
iphone4和4S有苹果iOS 5.0.1,但iphone3GS有同样的功能


作为变体,您可以通过使用大循环来提供cpu速度测试。例如,
for(var i=0,k=1;i我不久前遇到了类似的问题。在一个通过javascript加载了大量视频的客户端网站上工作时,我发现他们需要使用的视频格式具有奇怪的帧速率,这在iPhone 3GS上不起作用

按照atornblad的方法,我得到了完全符合我需要的解决方案:

if((navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i))) {
    if (!(window.devicePixelRatio > 1)){
        //non retina iphone / ipod
    }
};

首先,它检查用户是从iPod还是iPhone来找我。然后,它检查视网膜支持。因为只有iPhone 4+支持它,所以我设法为旧设备调用了正确的视频文件。

关于更多CPU速度测量方法的一些信息:它们可能是“不合适的”“这是一种方法,但在某些情况下,了解目标设备的计算能力可能会很有用

因此,我想在这些方法中添加以下内容:与其计算固定值并测量时间,不如计算固定时间,然后比较得出的值。 如果你的用户访问你的设备速度慢得多,可能是因为它在模拟器中运行,他将不得不等到你数到n。如果你在200毫秒后离开循环,你将只会达到一个非常低的值,用户体验不会受到影响


此外,知道一个操作需要多长时间总是很好的,它减少了不确定性。

这将是Javascript中两种方法的组合:

函数iPhoneVersion(){
var iHeight=window.screen.height;
var iWidth=window.screen.width;
如果(iWidth==414&&iHeight==896){
返回“Xmax Xr”;
}
else if(iWidth==375&&iHeight==812){
返回“X-Xs”;
}
else if(iWidth==320&&iHeight==480){
返回“4”;
}
else if(iWidth==375&&iHeight==667){
返回“6”;
}
else if(iWidth==414&&iHeight==736){
返回“6+”;
}
else if(iWidth==320&&iHeight==568){
返回“5”;
}

否则,如果(iHeight通过使用WEBGL_debug_renderer_info扩展(它是的一部分),您可以检索GPU的供应商和渲染器名称

将这与设备的屏幕尺寸相结合,您可以准确地定义它的版本。下面的代码示例显示了如何对所有iPhone版本(包括3和4)执行此操作

    // iPhone model checks.
function getiPhoneModel() {
    // Create a canvas element which can be used to retrieve 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);
            }
        }
    }

    // iPhone X
    if ((window.screen.height / window.screen.width == 812 / 375) && (window.devicePixelRatio == 3)) {
        return "iPhone X";
    // iPhone 6+/6s+/7+ and 8+
    } else if ((window.screen.height / window.screen.width == 736 / 414) && (window.devicePixelRatio == 3)) {
        switch (renderer) {
            default:
                return "iPhone 6 Plus, 6s Plus, 7 Plus or 8 Plus";
            case "Apple A8 GPU":
                return "iPhone 6 Plus";
            case "Apple A9 GPU":
                return "iPhone 6s Plus";
            case "Apple A10 GPU":
                return "iPhone 7 Plus";
            case "Apple A11 GPU":
                return "iPhone 8 Plus";
        }
    // iPhone 6+/6s+/7+ and 8+ in zoom mode
    } else if ((window.screen.height / window.screen.width == 667 / 375) && (window.devicePixelRatio == 3)) {
        switch(renderer) {
            default:
                return "iPhone 6 Plus, 6s Plus, 7 Plus or 8 Plus (display zoom)";
            case "Apple A8 GPU":
                return "iPhone 6 Plus (display zoom)";
            case "Apple A9 GPU":
                return "iPhone 6s Plus (display zoom)";
            case "Apple A10 GPU":
                return "iPhone 7 Plus (display zoom)";
            case "Apple A11 GPU":
                return "iPhone 8 Plus (display zoom)";
        }
    // iPhone 6/6s/7 and 8
    } else if ((window.screen.height / window.screen.width == 667 / 375) && (window.devicePixelRatio == 2)) {
        switch(renderer) {
            default:
                return "iPhone 6, 6s, 7 or 8";
            case "Apple A8 GPU":
                return "iPhone 6";
            case "Apple A9 GPU":
                return "iPhone 6s";
            case "Apple A10 GPU":
                return "iPhone 7";
            case "Apple A11 GPU":
                return "iPhone 8";
        }
    // iPhone 5/5C/5s/SE or 6/6s/7 and 8 in zoom mode
    } else if ((window.screen.height / window.screen.width == 1.775) && (window.devicePixelRatio == 2)) {
        switch(renderer) {
            default:
                return "iPhone 5, 5C, 5S, SE or 6, 6s, 7 and 8 (display zoom)";
            case "PowerVR SGX 543":
                return "iPhone 5 or 5c";
            case "Apple A7 GPU":
                return "iPhone 5s";
            case "Apple A8 GPU":
                return "iPhone 6 (display zoom)";
            case "Apple A9 GPU":
                return "iPhone SE or 6s (display zoom)";
            case "Apple A10 GPU":
                return "iPhone 7 (display zoom)";
            case "Apple A11 GPU":
                return "iPhone 8 (display zoom)";
        }
    // iPhone 4/4s
    } else if ((window.screen.height / window.screen.width == 1.5) && (window.devicePixelRatio == 2)) {
        switch(renderer) {
            default:
                return "iPhone 4 or 4s";
            case "PowerVR SGX 535":
                return "iPhone 4";
            case "PowerVR SGX 543":
                return "iPhone 4s";
        }
    // iPhone 1/3G/3GS
    } else if ((window.screen.height / window.screen.width == 1.5) && (window.devicePixelRatio == 1)) {
        switch(renderer) {
            default:
                return "iPhone 1, 3G or 3GS";
            case "ALP0298C05":
                return "iPhone 3GS";
            case "S5L8900":
                return "iPhone 1, 3G";
        }
    } else {
        return "Not an iPhone";
    }
}

我不希望这样做,但是存在一些不一致的地方,没有给理想主义方法留下太多空间()。不过有趣的是:在iOS4和Rhino上,
matchMedia
最好不要被调用(导致了一些意外行为,没有时间进行更深入的调试).Martijn Pieters删除了这篇文章,指出重复的答案是不可接受的。仅在此处重新发布。如果用户选择“设置>显示和亮度>视图”上的缩放,则此操作无效。@trungnnh是正确的,设置“缩放”将更改window.screen.width