Detekci Windows 11 přes Javascript

0

Otázka

Snažím se zjistit, zda uživatel používá Windows 11 v zájmu dosažení správné binární soubory, když klikněte na tlačítko pro stažení. Zjistil jsem, Microsoft je návrh na to, jak to udělat zde. Navrhují pomocí navigator.userAgentData.getHighEntropyValues funkce, která vrátí slib obsahující verze platformy. Zde je kód navrhují:

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");
   }
 });

Můj problém je, že tato funkce je asynchronní a vrátí slib namísto vracení hodnoty. Nechci, aby převést všechny kód, který jsem použít k analýze uživatelských agentů pro každou platformu v asynchronní funkci.

Nejdřív jsem myslel, že čekají místo pomocí slib, jako je tento:

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

Nicméně, to znamenalo, že bych potřeboval, aby funkce, která obsahuje to asynchronní. A protože tento stejný kód musí fungovat na starších prohlížečích, které nepodporují asynchronní a ty, které to udělat, nemůžu to udělat.

Existuje způsob, jak zjistit, zda uživatel používá Windows 11 bez tohoto API? Nebo pomocí tohoto API, ale způsobem, který nevyžaduje asynchronní?

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

Nejlepší odpověď

4

Můj problém je, že tato funkce využívá es6 a vrátí slib namísto vracení hodnoty.

Jediný "ES6" (ES2015) je tam šipka funkce. Můžete použít tradiční funkci, pokud nechcete používat šipky funkce. Slib je poskytována platforma, ne jazyk.

Nechci, aby převést všechny kód, který jsem použít k analýze uživatelských agentů pro každou platformu do async funkce.

Nemusíš, můžeš si dělat, co kód jsi ukázal, znamená: Používat .then metoda. Ano, to bude asynchronní (high-entropie, informace je pouze k dispozici, asynchronně, protože to může požádat uživatele o povolení), ale to bude ještě pracovat na prohlížeče, které nepodporují async funkce (samozřejmě za předpokladu, že podpora getHighEntropyValues).

Jinak, budete muset klesnout zpět na parsování navigator.userAgent a to je notoricky nespolehlivé. Budete chtít, tak pro látky, které nepodporují getHighEntropyValues nebo uživatelé, kteří odepřít oprávnění, takže si můžete udělat svůj nejlepší odhad pro drop-down. Ujistěte se, že poskytovat drop-dolů (nebo podobné), takže uživatel může A) Správné nesprávné hádat, a B) Stáhnout pro pozdější použití na jiné platformě.

2021-11-23 15:45:54

Díky za odpověď. Máš pravdu, že šipka funkcí je es6 není problém a snadno se může použít starší funkci styl. Myslím, že problém, který se snažím řešit, je, že funkce je asynchronní (ať už tím, že zpětné volání nebo čekají) v místě, chtěl bych použít, že informace synchronně (takže nemám potřebu nahradit všechny manipulace kód na každé platformě).
DHamrick

@DHamrick omezení je, že API je asynchronní, takže je nelze použít současně.
evolutionxbox

@evolutionxbox fér! Je tam jiné API, který dosáhne stejného cíle? Zjišťuje, zda uživatel používá Windows 11?
DHamrick

@DHamrick ne, já si nemyslím, že tam je. stackoverflow.com/questions/9514179/... většina odpovědí se zdá, aby ji používat
evolutionxbox

V jiných jazycích

Tato stránka je v jiných jazycích

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