es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Detectar Windows 11 a través de Javascript.

Estoy intentando detectar si el usuario está usando Windows 11 para servir los binarios correctos cuando hace clic en un botón de descarga. He encontrado la sugerencia de Microsoft sobre cómo hacer esto aquí. Sugieren usar la función navigator.userAgentData.getHighEntropyValues, que devuelve una promesa que contiene la versión de la plataforma. Aquí está el código que sugieren:

navigator.userAgentData.getHighEntropyValues(["platformVersion"])
 .then(ua => {
   if (navigator.userAgentData.platform === "Windows") {
     const majorPlatformVersion = parseInt(ua.platformVersion.split('.')[0]);
     if (majorPlatformVersion >= 13) {
       console.log("Windows 11 o posterior");
      }
      else if (majorPlatformVersion > 0) {
        console.log("Windows 10");
      }
      else {
        console.log("Antes de Windows 10");
      }
   }
   else {
     console.log("No se está ejecutando en Windows");
   }
 });

Mi problema es que esta función es asíncrona y devuelve una promesa en lugar de devolver el valor. No quiero tener que convertir todo el código que uso para analizar los agentes de usuario para cada plataforma en una función asíncrona.

Al principio, pensé que usaría await en lugar de usar la promesa como esto:

let ua = await navigator.userAgentData.getHighEntropyValues(["platformVersion"])

Sin embargo, esto significaría que tendría que hacer que la función que lo contiene sea asíncrona. Y como este mismo código necesita funcionar en navegadores antiguos que no admiten async y en los que sí lo hacen, no puedo hacer eso.

¿Hay alguna forma de detectar si el usuario está usando Windows 11 sin esta API? ¿O utilizar esta API pero de una manera que no requiera un proceso asíncrono?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en JavaScript y ECMAScript-6, recomiendo utilizar un método de fallback para detectar si el usuario está utilizando Windows 11 en caso de que la función navigator.userAgentData.getHighEntropyValues no se pueda utilizar sin utilizar funciones asíncronas. Una opción es comprobar la cadena del agente de usuario para la cadena “Windows NT 10.0”, que es única en Windows 10 y versiones superiores, incluyendo Windows 11. Aquí hay un ejemplo de código que se puede utilizar:

    const isWindows11 = () => {
      const ua = window.navigator.userAgent;
      const windows11String = "Windows NT 10.0";
    
      return ua.includes(windows11String);
    }
    
    if (isWindows11()) {
      // servir binarios de Windows 11
    } else {
      // servir otros binarios
    }
    

    Este fragmento de código comprueba si la cadena del agente de usuario contiene la cadena “Windows NT 10.0”, lo que indica que el usuario está utilizando Windows 10 o superior, incluyendo Windows 11. Si lo hace, el código sirve binarios de Windows 11, y de lo contrario, sirve otros binarios.

    Utilizar este método elimina la necesidad de funciones asíncronas, y funciona en navegadores antiguos que no admiten la API navigator.userAgentData. Sin embargo, tenga en cuenta que confiar en cadenas del agente de usuario para la detección del navegador tiene limitaciones, ya que las cadenas del agente de usuario pueden ser modificadas o falsificadas. Por lo tanto, siempre es una buena idea tener controles adicionales en su lugar y probar a fondo.

Comments are closed.