Detectar Windows 11 a través de Javascript

0

Pregunta

Estoy tratando de detectar si el usuario está utilizando Windows 11 con el fin de servir los archivos binarios correctos cuando se haga clic en un botón de descarga. He encontrado Microsoft sugerencia de cómo hacerlo aquí. Ellos sugieren que el uso de la navigator.userAgentData.getHighEntropyValues función 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 or later");
      }
      else if (majorPlatformVersion > 0) {
        console.log("Windows 10");
      }
      else {
        console.log("Before Windows 10");
      }
   }
   else {
     console.log("Not running on Windows");
   }
 });

Mi problema es que esta función es asincrónico y devuelve una promesa en lugar de devolver el valor. Yo no quiero tener que convertir todo el código que utilizo para analizar los agentes de usuario para cada plataforma en asincronica función.

Al principio, pensé que iba a usar esperan en lugar de utilizar la promesa como esta:

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

Sin embargo, esto significaba que iba a necesitar para hacer la función que contiene de forma asincrónica. Y desde este mismo código se necesita para trabajar en los navegadores antiguos que no soportan asíncrona y los que lo hacen, yo no puedo hacer eso.

Hay una forma de detectar si el usuario está utilizando Windows 11 sin esta API? O el uso de esta API, pero de una manera que no requiere de async?

ecmascript-6 javascript windows-11
2021-11-23 15:35:58
1

Mejor respuesta

4

Mi problema es que esta función utiliza es6 y devuelve una promesa en lugar de devolver el valor.

El único "ES6" (ES2015) no es la función de flecha. Puede utilizar una función tradicional si usted no desea utilizar una función de flecha. La promesa es proporcionado por la plataforma, no el idioma.

Yo no quiero tener que convertir todo el código que utilizo para analizar los agentes de usuario para cada plataforma en un async la función.

Usted no tiene, usted puede hacer lo que el código que has mostrado no: el Uso de la .then método. Sí, va a ser asincrónica (el alto-la entropía de la información está sólo disponible de forma asincrónica, porque es posible que tenga que pedir permiso al usuario), pero que funcionará en los navegadores que no admitan async funciones (siempre, naturalmente, que el apoyo de getHighEntropyValues).

De lo contrario, usted tendrá que caer de nuevo en el análisis de navigator.userAgent y eso es muy poco confiable. Usted querrá que de todos modos, para los agentes que no apoyo getHighEntropyValues o los usuarios que negar el permiso, por lo que usted puede hacer su mejor conjetura en el desplegable. Asegúrese de proporcionar una lista desplegable (o similar) por lo que el usuario puede a) Corregir una estimación incorrecta, y B) Descargar para su posterior uso en otra plataforma.

2021-11-23 15:45:54

Gracias por la respuesta. Tienes razón que la función de flecha ser es6 no es un problema y puede fácilmente usar un legado de estilo de función. Supongo que el problema que yo estoy tratando de solucionar es que la función es asíncrono (ya sea por devolución de llamada o esperan) en un lugar que me gustaría utilizar esa información de forma sincrónica (por lo que no es necesario reemplazar todo el código de control en todas las plataformas).
DHamrick

@DHamrick la limitación es que la API es asincrónico, por lo que no puede ser utilizado de forma sincrónica.
evolutionxbox

@evolutionxbox justo lo suficiente! Hay otra API que lleva a cabo el mismo objetivo? Averiguar si el usuario está utilizando Windows 11?
DHamrick

@DHamrick no, yo no creo que la hay. stackoverflow.com/questions/9514179/... la mayoría de las respuestas, parece que lo utilizan
evolutionxbox

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................