OSのバージョンやデバイスファミリーを識別するには?[Windows 10 UWPアプリ開発]:WinRT/Metro TIPS
AnalyticsInfoクラスを使用して、UWPアプリが動作しているデバイスの種類/OSバージョンなどの情報を取得する方法を解説する。
powered by Insider.NET
Windows 10のユニバーサルWindowsプラットフォーム用のアプリ(以降、UWPアプリ)を作るときに、デバイスによって動きを変えたいことがあるだろう。画面を丸ごと切り替えるのであれば、「Xaml view」(「徹底予習! Windows 10のユニバーサルアプリ開発 (4/6)」参照)が使える。しかし、どのデバイスで実行しているかをコード内で知りたいときもあるだろう。また、Windows 10のバージョン情報を知りたいこともあるだろう。本稿では、それらの方法を解説する。なお、本稿のサンプルは「Windows Store app samples:MetroTips #119」からダウンロードできる。
※本稿の内容を試すために必要な開発環境は、本稿の末尾でまとめている(なお、Visual Studio Tools for Universal Windows Appsの最新バージョンは2015年11月30日にリリースされたVisual Studio 2015 Update 1で1.2に上がっている。それらの情報も含めて記載しているので、実際にコードを試してみようという方は参考にしてほしい)。
実行しているデバイスを識別するには?
UWPアプリ開発で使用するUniversal Windows SDKには、デバイスファミリーを識別するためのAPIが用意されている*1。
具体的には、AnalyticsInfoクラス(Windows.System.Profile名前空間)のVersionInfoプロパティにあるDeviceFamilyプロパティが、デバイスファミリーを表す文字列を持っている。その値は、「Windows.Desktop」(デスクトップPC/ノート/大きいサイズのタブレット)/「Windows.Mobile」(スマートフォン/小さいサイズのタブレット)などとなっている。
*1 デバイスファミリーの概念については、MSDNドキュメント「ユニバーサル Windows プラットフォーム (UWP) アプリのガイド〜デバイス ファミリ」を参照。
実行しているWindows 10のバージョン情報を取得するには?
同じくAnalyticsInfoクラスのVersionInfoプロパティにあるDeviceFamilyVersionプロパティが、Windows 10のバージョン情報を表す文字列になっている。
ただし、これで得られる文字列は「2814750438211790」などとなっている。これを64bitの整数として扱い、先頭から16bitずつ取り出すと、見慣れた「10.0.10240.16590」といった形式のバージョン表記に変換できる。
サンプルコードと実行結果
以上のデバイスファミリーとバージョンを取得するコードは、次のGetVersionInfoメソッドのようになる(取得結果をメンバー変数に保持するようにした)。
private string DeviceFamily { get; set; }
private string OSVersion { get; set; }
private string OSVersionRaw { get; set; }
private void GetVersionInfo()
{
Windows.System.Profile.AnalyticsVersionInfo versionInfo
= Windows.System.Profile.AnalyticsInfo.VersionInfo;
// デバイスファミリーはDeviceFamilyプロパティそのままでよい
DeviceFamily = versionInfo.DeviceFamily;
// OSバージョンは、DeviceFamilyVersionプロパティを取得し……
OSVersionRaw = versionInfo.DeviceFamilyVersion;
// ulongにして、先頭から16bitずつ取り出すと、
// 見慣れたバージョン情報になる
ulong v = ulong.Parse(OSVersionRaw);
ulong v1 = (v & 0xFFFF000000000000L) >> 48;
ulong v2 = (v & 0x0000FFFF00000000L) >> 32;
ulong v3 = (v & 0x00000000FFFF0000L) >> 16;
ulong v4 = v & 0x000000000000FFFFL;
OSVersion = $"{v1}.{v2}.{v3}.{v4}";
}
Private Property DeviceFamily As String
Private Property OSVersion As String
Private Property OSVersionRaw As String
Private Sub GetVersionInfo()
Dim versionInfo As Windows.System.Profile.AnalyticsVersionInfo _
= Windows.System.Profile.AnalyticsInfo.VersionInfo
' デバイスファミリーはDeviceFamilyプロパティそのままでよい
DeviceFamily = versionInfo.DeviceFamily
' OSバージョンは、DeviceFamilyVersionプロパティを取得し……
OSVersionRaw = versionInfo.DeviceFamilyVersion
' ulongにして、先頭から16bitずつ取り出すと、
' 見慣れたバージョン情報になる
Dim v As ULong = ULong.Parse(OSVersionRaw)
Dim v1 As ULong = (v And &HFFFF000000000000L) >> 48
Dim v2 As ULong = (v And &H0000FFFF00000000L) >> 32
Dim v3 As ULong = (v And &H00000000FFFF0000L) >> 16
Dim v4 As ULong = v And &H000000000000FFFFL
OSVersion = $"{v1}.{v2}.{v3}.{v4}"
End Sub
デバイスファミリーには、「Windows.Desktop」/「Windows.Mobile」の他に、「Windows.Team」(Surface Hub用)/「Windows.IoT」/「Windows.Xbox」などがあるようだ(HoloLensについては、筆者はまだ把握していない)。
上のコードで得られた結果を画面にバインドすると、次の画像のようになる(実際のコードは別途公開のサンプルをご覧いただきたい)。
実行例その2(Windows 10 2015年11月版+WindowsアップデートKB3116908)
デスクトップ用Windows 10のWinVerコマンドで表示されるバージョン表記は、2015年11月版から「バージョン 1511 (OS ビルド 10586.17)」のように変わった(画像左上)。
前述のコードでは「10.0.10586.17」が取得できている(「1511」ではない)。
なお、コードからデバイスファミリーを識別できるということは、デバイスファミリーによってVisualStateを切り替えるAdaptiveTrigger(「徹底予習! Windows 10のユニバーサルアプリ開発 (4/6)」参照)を作成できるということでもある。そのようなコードも公開されているので、二つ紹介しておこう。
- State triggers sample: マイクロソフトのサンプルコード
- WindowsStateTriggers: 10個以上の実用的なトリガーが収められている
まとめ
AnalyticsInfoクラスで、Windows 10のバージョン情報とデバイスファミリーを取得できる。また、そのデバイスファミリーに基づくAdaptiveTriggerを利用すれば、画面の一部分をデバイスによって切り替えることも可能になる。
事前準備
デスクトップ用とモバイル(=Windows 10を搭載したスマートフォン)用のUWPアプリを開発するには、以下の開発環境が必要である。本稿では、無償のVisual Studio Community 2015(およびVisual Studio Tools for Universal Windows Appsバージョン1.1)を使っている。
- SLAT対応のPC*2
- 64bit版*3 Windows 10 Pro*4
- Visual Studio 2015(以降、VS 2015)*5
- Windows SDK for Windows 10*6、およびVisual Studio Tools for Universal Windows Apps*7
*2 SLAT対応ハードウエアは、モバイルエミュレーターの実行に必要だ。ただし未対応でも、ソースコードのビルドと実機でのデバッグは可能である。SLAT対応のチェック方法はMSDNブログの「Windows Phone SDK 8.0 ダウンロードポイント と Second Level Address Translation (SLAT) 対応PCかどうかを判定する方法」を参照。なお、SLAT対応ハードウエアであっても、VM上ではエミュレーターが動作しないことがあるのでご注意願いたい。
*3 Windows 10 Mobileエミュレーターを使用しないのであれば、32bit版でもよい。
*4 開発に使うWindows 10は「開発者モード」を有効にしておくこと(「設定アプリ」の[更新とセキュリティ]−[開発者向け]で、[開発者モード]ラジオボタンを選択)。そうしないと、VS 2015のXAMLエディターがエラーになる。また、本稿の内容が適用できるのは、Windowsのライフサイクル管理の上では「Windows 10, released in July 2015」と呼ばれるリリース、またはそれ以降。WinVerコマンドで表示されるバージョンは「10.0 (ビルド 10240)」。UWPアプリ開発におけるデバイスファミリーのバージョン指定としては「10.0.0.0」(Package.appxmanifestファイルのTargetDeviceFamily)である。なお、モバイルエミュレーターを使用しないのであれば、Home版でもよい。
*5 本稿に掲載したコードを試すだけなら、無償のExpressエディションやCommunityエディションで構わない。Visual Studio Express 2015 for Windows 10(製品版)はマイクロソフトのページから無償で入手できる(ページの左側で[Visual Studio 2015]−[Express 2015 for Windows 10]と選ぶ)。Expressエディションはターゲットプラットフォームごとに製品が分かれていて紛らわしいが、UWPアプリの開発には「for Windows 10」を使う(「for Desktop」はWPF/Windowsフォーム/Win32 APIのアプリ開発用)。また、Visual Studio Community 2015(製品版)もマイクロソフトのページから無償で入手できる。なお、英語版がインストールされた場合には、Microsoft Visual Studio 2015 Language Packの日本語版を追加インストールし、[オプション]ダイアログで言語を切り替える。
*6 使用しているVS 2015に含まれていない場合は、Windows SDK for Windows 10のページからダウンロードできる。本稿の内容が適用できるのは、作成したプロジェクトのプロパティに表示されるターゲットバージョンが「10.0; ビルド 10240」またはそれ以降。ただし、プレビュー版のSDKを使うと、Windowsストアには提出できなくなるので注意してほしい。
*7 Visual Studio Tools for Universal Windows Appsは、2015年9月16日付でバージョン1.1に上がっている。それ以前に開発環境を整えた人は、個別にアップデートする必要がある。「Update 1.1: Release Notes and Installation Instructions」(英語)を参照。なお、2015年11月30日付でリリースされたVisual Studio 2015 Update 1を使っている場合は、Visual Studio Tools for Universal Windows Appsをインストールするだけでよい(バージョン1.2が入る)。
Copyright© Digital Advantage Corp. All Rights Reserved.