如何在iOS 13及更高版本中检测iPad和iPad OS版本?

MaD*_*_LK 10 javascript ipad ios ios13 ipados13

我可以在iPhone上检测到iOS 13,但在iPad OS 13中navigator.platform是MacIntel。因此,无法使用以下代码识别iPad,但它在iPhone上可以完美运行。

    if (/iP(hone|od|ad)/.test(navigator.platform)) {
            var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);
            var version = [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)];
            return version;
    }
Run Code Online (Sandbox Code Playgroud)

当我们要求使用iPad上的浏览器访问移动网站时,它将navigator.platform返回iPad,并且可以完美运行。

谁能建议使用Javascript 识别在iOS 13及更高版本上运行的iPad的方法?

Ste*_*son 12

通过检查和navigator.maxTouchPoints,我可以使iPad检测正常工作navigator.platform。它并不完美(如下面的评论中所述),但这是我到目前为止遇到的最好的解决方案,所以我想分享。

const iPad = (userAgent.match(/(iPad)/) /* iOS pre 13 */ || 
  (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1) /* iPad OS 13 */);
Run Code Online (Sandbox Code Playgroud)

  • @Kris 我已经更新了它以使用“navigator.platform”,我认为它至少可以用于我的应用程序的目的。目前还没有触摸屏 Mac,所以任何触摸屏 MacIntel 平台都应该是 iPadOS 13+ 吗?我猜他们可能有第三方触摸屏显示器,但我不确定 MacOS 会如何回应?我很乐意使用另一种方法,但这是迄今为止我见过的唯一有效的方法。 (2认同)
  • 移相器解决方案https://github.com/azerion/phaser/commit/554eeca5935f6311227c9be1c1331ffcd94abdc2#diff-de672b8173a52c4541cf4d3841682351R1228 (2认同)

Guy*_*uyC 6

TL; 博士

const iPad = !!(navigator.userAgent.match(/(iPad)/)
  || (navigator.platform === "MacIntel" && typeof navigator.standalone !== "undefined"))
Run Code Online (Sandbox Code Playgroud)

我们可以使用navigator.standalone参数。它是非标准的,目前仅在 iOS Safari 上使用:

Navigator.standalone

返回一个布尔值,指示浏览器是否在独立模式下运行。仅适用于 Apple 的 iOS Safari。

当与navigator.platform === "MacIntel"iPad结合使用时,是唯一定义此属性的设备,因此会typeof navigator.standalone !== "undefined"过滤掉运行 Safari 的 Mac(触摸屏与否)。

我设置了一个 CodeSandbox 并在 Browserstack 上手动测试,似乎按预期工作:https ://bc89h.csb.app/

版本检测(仅限 iOS)

我还没有对此进行过广泛的测试,但应该给其他人一个很好的起点:

const version = navigator.userAgent.match(/Version\/(\d+)\.(\d+)\.?(\d+)?/);
const major = version && version[1] ? version[1] : "";
const minor = version && version[2] ? version[2] : "";
const patch = version && version[3] ? version[3] : "";
Run Code Online (Sandbox Code Playgroud)

以上获取版本并将其分解为主要、次要和补丁元素。这似乎适用于我对其进行了快速测试的 iOS 12 和 13。上面的 SandBox 链接显示了输出。