1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

UserAgentとClientHintからOSのバージョンを判定する

Posted at

UserAgentとClientHintとは

UserAgentはWebブラウザやその他のクライアントがWebサーバーに送信する文字列で、使用しているブラウザの種類、バージョン、ホストのオペレーティングシステムなどの情報を伝えます。これにより、Webサーバーはユーザーの環境に適したコンテンツを提供することができます。

一方、Client Hintは新しい機能で、HTTPクライアントヒント を拡張し、JavaScriptを使用してブラウザとプラットフォームの情報を取得するための新しい機能です。

この記事ではUserAgent、UserAgentClientHintに関する詳しい説明は省き、OSの名称、OSのバージョンをどのように取得するかを解説します。

また、ClientHint から取得できる情報は他にも存在しますが、詳細は公式ドキュメントを参照してください

ClientHint からOSのバージョンを取得する方法

ClientHintを取得するには、JavaScriptを使用して、下記のコードを実行する事で取得できます

await navigator.userAgentData.getHighEntropyValues(['platformVersion'])

Windows10, Chrome で実行すると下記のようなオブジェクトが取得できます

{
    "brands": [
        {
            "brand": "Not.A/Brand",
            "version": "8"
        },
        {
            "brand": "Chromium",
            "version": "114"
        },
        {
            "brand": "Google Chrome",
            "version": "114"
        }
    ],
    "mobile": false,
    "platform": "Windows",
    "platformVersion": "10.0.0"
}

レスポンスにある通り、platform がOSの名前、platformVersion がOSのバージョンになります。

UserAgent ClientHint を使用する上でのハマりどころ

ClientHintが提供されているブラウザでは、基本的にそのまま値を使用すればよいのですが、OSなどによって場合ごとにUserAgentを使用するのか、ClientHintを使用するのかが変わってくるため、ハマりどころを紹介します。

Windows

Edge, Chrome ともにClientHintによってOSの名前、バージョンを取得できます。

ただし、バージョンについてはWindows 10, Windows 11 などが渡ってくるわけではなく、0~13の数字が渡されます。

0 の場合はWin7 or Win8 or Win8.1
0~10 の場合は Win10
13以上 の場合はWin11 となります

JavaScript の方でplatformVersion に渡ってくる値を見てどのOSバージョンかを判断する必要があります。
下記は公式ドキュメントに記載されているサンプルコードです

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

Safari

Safari ではClientHintの提供がないため、UserAgentからOSの名前、バージョンを取得する必要があります。

iOS/iPadOS

iOS, iPadOS ではUserAgentからバージョンを取得すべきです。
この2つのOSは以下で動くChromeはSafari 基準で動作するため、ClientHintを取得する事が出来ません。

その為、UserAgentのブラウザバージョンを取得します。
iOS, iPadOS のSafari バージョンはOSバージョンと同じものになっているため、使いまわしが可能です。

こちらの記事で対応表を作成いただいてました!お世話になっております。非常に助かりました

Mac OS

mac OS の場合、Chrome ではClientHintを使用してOS名、バージョンを取得できます。
こちらはSafariのバージョン=OS のバージョンではないですが、Safari のバージョンからOSバージョンを推察する事が可能です。

(バージョンの対応表は、公式では出していない為、Wikipedia から参考用として引用します)
https://ja.wikipedia.org/wiki/Safari

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?