代码之家  ›  专栏  ›  技术社区  ›  Grant Paul

在javascript中检测iPhone 3G或3GS(以及iPod touch 2G与iPod touch 3G)

  •  12
  • Grant Paul  · 技术社区  · 15 年前

    有人知道检测旧设备的方法吗?

    • iPod touch 1G
    • iPhone 2G
    • iPhone 3G
    • iPod触控2G

    从较新的集合:

    • iPhone 3GS
    • iPod触摸3G
    • iPad
    • iPhone 4

    我找到了检测iPhone4和iPad的方法(使用屏幕大小)。但是,有没有一种方法可以将iPhone3GS和iPod touch3G与iPod touch1G和iPhone2G区分开来?

    要求:

    • 被黑客攻击没关系!只需确保它一直有效。
    • 性能测试是/不是/足够精确:但是如果你能让它100%地工作,那就没问题了。

    (例如,对于iPhone2G和iPod touch 1G检测,使用“隐藏”方法:“iPad和iPhone3G及更高版本支持H.264基线配置文件3.1。”早期版本的iPhone支持H.264 Baseline Profile 3.0。”来自 https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/AudioandVideoTagBasics/AudioandVideoTagBasics.html )

    编辑:我无法绕过这个要求:除了这个检测,没有其他的解决方案。

    3 回复  |  直到 6 年前
        1
  •  5
  •   mvds    15 年前

    如果数字处理是一个鉴别器…用它!只需测试一个小循环(称之为bogomips),在0.5秒内你就知道你在做什么了。

    硬件和软件都有定义,负载也有很大的定义(嗯..iOS 4“多任务”?)所以我认为这是非常准确的。

    编辑 我现在只看了你关于性能测试的评论;也许你是说这个,也许你是想测量页面呈现时间。我的建议是用 只有 然后将结果存储为cookie并重定向的一段javascript。当时几乎所有的情况都是已知的。

        2
  •  4
  •   christophercotton    15 年前

    您研究过useragent字符串吗?

    例如,我的iPhone4返回:

    Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A306 Safari/6531.22.7

    这个 Mobile/8A306 是固件版本(仅用于 8a306 iphone

    我相信旧版本的手机不能运行新版本的操作系统。因此,您可能可以找到一组固件代码,这些代码只会显示在旧版本的手机上。这至少能让你发现其中的一些差异。

    这个 WURFL 有一些很好的参考和用户代理字符串,以及如何基于它检测设备和功能。它们有一个可浏览的列表,它们可能能够正确地检测到设备。我没有访问旧硬件的权限,因此我无法确认它是否一直工作。您可以使用以下工具探索您的设备显示的内容: http://www.tera-wurfl.com/explore/ 并查看返回的各种useragent字符串。

        3
  •  -2
  •   Darthmatch    14 年前

    检测旧型号的小基准。基准测试需要5-30毫秒,所以没有真正的问题。

    function runBenchmark(){
        var time,
        init = new Date(),
        iterations = 5000;
        while (iterations--) {
            Math.sqrt(iterations*Math.random());
        }
        time = new Date - init;
        return time;
    }
    
    function detectIphoneSpeed () {
        if (runBenchmark()<15) {
            return "3gs";
        } else {
            return "3g";
        }
    }
    var iphoneSpeed = detectIphoneSpeed();