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

12

有没有办法检测旧设备集合:

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

区别于新设备集合:

  • iPhone 3GS
  • iPod touch 3G
  • iPad
  • iPhone 4

我已经找到了检测 iPhone 4 和 iPad 的方法(使用屏幕大小)。但是,有没有办法将 iPhone 3GS 和 iPod touch 3G 与 iPod touch 1G 和 iPhone 2G 区分开?

要求:

  • 使用 hacky 方法可以。只需确保其始终有效。
  • 性能测试不够准确,但如果您可以使其在任何情况下都能正常工作,那就没问题了。

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

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


1
@Dave DeLong:一个例子可能是为了在老手机上禁用网站的重量级数字计算部分,因为它们无法处理负载。(但这不是本例的原因,我不能在这里透露原因 :/。) - Grant Paul
3个回答

5
如果数字处理能够区分......就用它!只需基准测试一个小循环(称之为BogoMips),在大约0.5秒内,您就可以知道自己的情况。
硬件和软件已经定义好了,负载也基本上定义好了(好吧... iOS 4的“多任务”?),所以我认为它可能非常精确。
编辑:我现在才看到您关于性能测试的评论;也许您的意思正是这个,也许您想测量页面呈现时间。我的建议是创建一个仅包含一小段JavaScript代码的页面,然后将结果存储为cookie并重定向。这样几乎所有情况都已知。

这就是我想做的,但是我创建的测试只有大约95%的准确率 :/. - Grant Paul
不知道你尝试了什么,但我会尝试针对JS无法掩盖的特定CPU功能。在x86上,似乎可以通过访问字符串(半)随机地来非常准确地预测L1缓存大小。增加字符串大小并测量100k访问时间,我看到32kb时有一个大跳跃。在3G上我看不到这样明显的区别。如果你在3GS上看到了这个区别,你就有办法把它们区分开来。另一个方法可能是将浮点运算与整数运算进行基准测试。 - mvds
另一种测量原始CPU速度而不受JS减速层影响的方法可能是设计一些具有大量回溯的复杂正则表达式。正则表达式将由某个库处理,并且可能使用优化的C代码,这正是您所需要的。 - mvds
1
我接受这个答案,因为它实际上回答了我的问题,而不像另一个答案。很抱歉你没有获得赏金,mvds。 - Grant Paul
没问题,但还是谢谢。如果您找到解决方案,请务必分享!;-) - mvds

4

你有查看过UserAgent字符串吗?

例如,我的iPhone 4 返回:

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 是固件版本(只需在Google中搜索 8a306 iphone)。

我相信旧版本的手机无法运行新版本的操作系统。因此,您可能能够找到一组仅会出现在旧版本手机上的固件代码。这将至少允许您检测到某些差异。

WURFL 具有一些好的参考资料和用户代理字符串,并介绍了如何基于其检测设备和功能。其中有一个可浏览的列表,它们可能能够正确地检测设备。我没有访问旧硬件的权限,所以我不能确认它始终有效。您可以使用以下内容探索您的设备显示为何: http://www.tera-wurfl.com/explore/ 并查看各种返回的UserAgent字符串。


2
iPhone 3G和3GS都可以运行iOS 4。该用户代理字符串仅告知固件版本,而非所需设备型号。 - Grant Paul
1
(此外,WURFL网站仅提供iPhone或iPod touch的定义:没有关于具体型号的信息。) - Grant Paul
我不相信iPod Touch第一代能运行OS 4.0。但是,它并没有给你需要的确切细节。此外,如果这真的是一个计算问题,你应该在循环的一部分中加入代码以查看进展情况。很容易看到是否已经达到了想要的程度,如果设备跟不上,那么你可以退出或进行修改。虽然不如事先知道,但也不失为一个好方法。 - christophercotton
3
我非常难过,这个没有回答问题并提供无关信息的回复获得了我一半的悬赏金。 - Grant Paul

-2

一个检测旧型号的小基准测试。该基准测试需要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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接