苹果的iPad Mini在很多方面都是iPad 2的小复制品。在JavaScript中,是窗口。navigator对象为Mini和iPad 2暴露相同的值。到目前为止,我为检测差异而进行的测试还没有成功。

为什么这很重要?

由于iPad Mini和iPad 2的屏幕像素相同,但实际尺寸(英寸/厘米)不同,它们的PPI(每英寸像素)也不同。

为了提供友好的用户界面,web应用程序和游戏会根据用户的拇指或手指位置调整某些元素的大小,因此,我们可能想要缩放某些图像或按钮以提供更好的用户体验。

到目前为止我尝试过的事情(包括一些非常明显的方法):

window.devicepixelratio CSS元素宽度,单位为cm CSS媒体查询(如分辨率和-webkit-device-pixel-ratio) SVG图形在类似的单位 在设定的时间内进行各种CSS webkit转换,并使用requestAnimFrame计算呈现的帧数(我希望检测到可测量的差异)

我没办法了。你呢?

更新 谢谢你的回复。我想对那些投票反对检测iPad mini和iPad 2的人发表评论,因为苹果有一个规则。好吧,这是我的理由,为什么我觉得知道一个人用的是iPad mini还是iPad 2真的很有意义。随你怎么解释我的推理。

The iPad mini is not only a much smaller device (9.7 inch versus 7.9 inch), but its form factor allows for a different usage. The iPad 2 is usually held with two hands when gaming unless you're Chuck Norris. The mini is smaller, but it is also much lighter and allows for gameplay where you hold it in one hand and use another to swipe or tap or whatnot. As a game designer and developer myself, I'd just like to know if it's a mini so I can choose to provide the player with a different controlscheme if I want (for instance after A/B testing with a group of players).

为什么?事实证明,大多数用户倾向于使用默认设置,所以当玩家第一次加载游戏时,不要使用虚拟拇指杆,而是在屏幕上放置一些基于点击的控制,这是我和其他游戏设计师希望能够做到的。

所以恕我说,这超出了粗手指/指导方针的讨论,这是苹果和所有其他供应商应该做的事情:允许我们唯一地识别你的设备,以不同的方式思考,而不是遵循指导方针。


当前回答

要求所有使用iPad2用户代理的用户使用内置相机提供一张照片,并使用HTML文件API检测分辨率。由于摄像头的改进,iPad Mini照片的分辨率将会更高。

你也可以创建一个不可见的画布元素,并使用canvas API将其转换为PNG/JPG格式。我没有任何方法来测试它,但由于底层的压缩算法和设备的像素密度,产生的比特可能会有所不同。

其他回答

基于Douglas关于iPad 2上的新webkitAudioContext().destination. numberofchannels的问题,我决定运行一些测试。

检查numberOfChannels在iPad mini上返回2,但在iPad 2、iOS 5和iOS 6上没有返回2。

然后我试着检查webkitAudioContext是否可用

var hasWebkitAudio = typeof(webkitAudioContext) === "object";
alert(hasWebkitAudio);​

同样,iPad Mini和iPad 2在iOS 6下返回true,而iPad 2在iOS 5下返回false。

(这个测试不适用于桌面,用于桌面检查webkitAudioContext是否是一个函数)。

下面是供您尝试的代码:http://jsfiddle.net/sqFbc/

编辑1:我最初的回答是“不要这样做”。为了积极:

The real question, I think, has nothing to do with the iPad X vs. iPad mini. I think it is about optimizing UI element dimensions and placement to the user's ergonomics. You need to determine the size of the user's finger/s in order to drive your UI element sizing and, perhaps, positioning. This, again, is and should probably be arrived at without needing to actually know what device you are running on. Let's exaggerate: Your app is running on a 40 inch diagonal screen. Don't know the make and model or the DPI. How do you size the controls?

你需要在网站/游戏中显示一个控制元素的按钮。我将由您决定在哪里或如何做这件事是有意义的。

虽然用户会看到这是一个单独的按钮,但实际上它是由一个小的紧密排列的按钮组成的矩阵,这些按钮在视觉上被覆盖,看起来像一个单独的按钮图像。想象一个100 × 100像素的按钮由400个按钮组成,每个按钮5 × 5像素。你需要实验,看看这里什么是有意义的,以及你的抽样需要多小。

按钮数组可能的CSS:

.sense_row {
  width:100px;
  height:5px;
  margin:0;
  padding:0;
}

.sense_button {
  float:left;
  width:3px;
  height:3px;
  padding:0px;
  margin:0px;
  background-color:#FF0;
  border:1px solid #000;
} 

和生成的数组:

当用户触摸按钮数组时,您将有效地获得用户手指接触区域的图像。然后,您可以使用您想要的任何标准(可能是经验派生的),以达到一组可以用于根据需求缩放和定位各种UI元素的数字。

这种方法的美妙之处在于,您不再关心您可能要处理的设备名称或型号。你所关心的只是用户手指相对于设备的大小。

我可以想象,这个sense_array按钮可以作为应用程序的入口过程的一部分隐藏起来。例如,如果这是一款游戏,可能会有一个“Play”按钮或各种带有用户名称的按钮,或者选择他们将玩哪个关卡的方法等等。你懂的。sense_array按钮可以位于用户为了进入游戏而触碰的任何地方。

编辑2:只是注意到你可能不需要那么多感知按钮。一组同心圆或按钮排列成一个巨大的星号*可能就可以了。你必须尝试。

下面是我的老答案,我给你硬币的两面。

旧的回答:

正确的答案是:不要这样做。这是个坏主意。

如果你的按钮太小,以至于在mini上无法使用,你就需要让你的按钮变大。

如果说我在开发原生iOS应用的过程中学到了什么,那就是,试图超越苹果只会带来不必要的痛苦和恶化。如果他们选择不让你识别设备,那是因为,在他们的沙盒里,你不应该识别。

我想知道,你在调整纵向和横向的大小/位置吗?

让用户从离地面几千英尺的高空扔下他们的iPad。然后使用内部加速度计来测量iPad达到终端速度所需的时间。更大的iPad阻力系数更大,达到终端速度的时间应该比iPad Mini更短。

下面是一些示例代码,可以帮助您入门。

function isIPadMini( var timeToReachTerminalVelocity )
{
    return (timeToReachTerminalVelocity > IPAD_MINI_THRESHOLD);
}

当苹果不可避免地以不同的形式发布下一代iPad时,你几乎肯定需要重新审视这段代码。但我相信你会继续跟进事情,并为每一个新版本的iPad保持这个hack。

没有测试,但它可以不播放音频文件并检查平衡,而是收听麦克风,提取背景噪声,并计算其“颜色”(频率图)。如果IPad Mini的麦克风型号与IPad 2不同,那么它们的背景颜色应该有明显的不同,一些音频指纹识别技术可能会帮助你判断使用的是哪台设备。

我不认为这种方法可行,在这种特殊情况下不值得这么麻烦,但我认为指纹识别背景噪音可以用于某些应用程序,例如,当你在建筑物内时,它可以告诉你你在哪里。

我知道这是一个糟糕的解决方案,但目前区分iPad Mini和iPad 2的唯一方法是检查其构建号,并将每个构建号与相关设备映射。

让我给你一个例子:iPad mini,版本6.0,暴露“10A406”作为构建号,而iPad 2暴露“10A5376e”。

这个值可以很容易地通过用户代理(window.navigator.userAgent)上的正则表达式获得;这个号码的前缀是"Mobile/"。

不幸的是,这是唯一明确的检测iPad Mini的方法;我建议采用视口相关的方法(在支持的情况下,使用vh / vw单位)在不同屏幕尺寸上正确显示内容。