已弃用的 Javascript 操作系统检测技术

Posted

技术标签:

【中文标题】已弃用的 Javascript 操作系统检测技术【英文标题】:Deprecated Javascript OS detection techniques 【发布时间】:2016-11-25 04:20:45 【问题描述】:

我想知道为什么像 navigator.userAgentnavigator.appNamenavigator.appVersionnavigator 这样的 javascript 操作系统检测技术。平台正在从网络标准中删除。

https://developer.mozilla.org/en-US/docs/Web/API/Navigator

如果你访问每一个导航器道具,你可以看到

已弃用

此功能已从 Web 标准中删除。尽管某些浏览器可能仍然支持它,但它正在被删除。不要在旧项目或新项目中使用它。使用它的页面或 Web 应用程序可能随时中断。

所以我想知道

    他们为什么要删除它 他们会引入一种新的操作系统检测方法 即使这些技术已被弃用,我也可以使用它们吗?

可能有很多情况我们需要知道操作系统版本。

【问题讨论】:

虽然这是一个很好的问题,但这可能不是问这个问题的正确地方。除了没有要解决的问题之外,它也是固执己见的,因为除了负责起草 Web 标准的人之外,没有任何人可以告诉你他们的推理。它也处于变相咆哮的边缘。 @JKirchartz:我见过的唯一真实的(并且不是过时的)平台检测用例是提供可下载软件时:通过检测,您可以默认使用平台(例如,Linux)用户正在查看您的页面(同时仍让他们导航到其他平台 [例如,Windows])。 @T.J.Crowder:为此,您可以轻松地在服务器端进行操作,我猜仍然会有 userAgent。 我想我们都在同一个页面上,在这里。 我投票决定将此问题作为离题结束,因为前提是 navigatorOS 检测方面已被弃用,但规范和 MDN 均未表明与操作系统相关的主要属性 navigator.platform 实际上已被弃用。 【参考方案1】:

你可以使用:

navigator.userAgentData.platform

【讨论】:

【参考方案2】:

你可以测试一下:

function getOS() 
        let userAgent = window.navigator.userAgent.toLowerCase(),
          macosPlatforms = /(macintosh|macintel|macppc|mac68k|macos)/i,
          windowsPlatforms = /(win32|win64|windows|wince)/i,
          iosPlatforms = /(iphone|ipad|ipod)/i,
          os = null;

        if (macosPlatforms.test(userAgent)) 
          os = "macos";
         else if (iosPlatforms.test(userAgent)) 
          os = "ios";
         else if (windowsPlatforms.test(userAgent)) 
          os = "windows";
         else if (/android/.test(userAgent)) 
          os = "android";
         else if (!os && /linux/.test(userAgent)) 
          os = "linux";
        

        return os;
      

      document.getElementById('your-os').textContent = getOS();
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
        <h1 id="your-os"></h1>
  </body>
</html>

【讨论】:

【参考方案3】:

它在 MDN 上被错误地或意外地标记为已弃用。他们在看到问题后迅速更正了该页面,但由于它是一个确定的来源,因此不推荐使用它的引用仍然存在于各处。

这是修复它的对话: https://groups.google.com/forum/#!topic/mozilla.dev.mdc/tIx2iiH2u3o

【讨论】:

【参考方案4】:

我认为一般的想法是它变得没有必要了。至少从理论上讲,任何浏览器与任何其他浏览器都不应该有任何不同的功能——至少对于 javascript 来说是这样。

您通常在浏览器中嗅探的是功能,并且有很多方法可以找到大部分内容,而无需从噩梦 userAgent 中推断出任何东西。

所以它可能会被弃用,也可能不会。但最好不必嗅探浏览器。这些东西会很快变得非常复杂。即使它确实被弃用了,它也可能会存在几十年,这样仍然依赖它的一半网络不会崩溃和烧毁。

【讨论】:

以上是关于已弃用的 Javascript 操作系统检测技术的主要内容,如果未能解决你的问题,请参考以下文章

替代已弃用的 AudioManager.isWiredHeadsetOn?

Android Volley 已弃用的库

已弃用的 OpenGL 功能

颤动不安全的未经检查的操作并过度使用已弃用的 api 错误

更新 Swift 中已弃用的 Firebase 函数

run_flow() 的哪个标志将模拟现在已弃用的 run()