特集
» 2015年04月28日 05時00分 公開

特集:次期Visual Studioの全貌を探る:徹底予習! Windows 10のユニバーサルアプリ開発 (2/6)

[山本康彦,BluewaterSoft/Microsoft MVP for Windows Platform Development]

4. 新しいユニバーサルアプリ〜Windowsランタイムの再構成

 Windows 10では、デバイスに依存しない普遍的なアプリ(=ユニバーサルアプリ)を作成できる。「Windows 10用のユニバーサルアプリ」(universal apps for Windows 10)や「Windows 10のユニバーサルアプリ」(Windows 10 universal apps)などと呼ばれる。略して「Windows 10ユニバーサルアプリ」、バージョン番号を落として「Windowsユニバーサルアプリ」ともいう(バージョン番号を落とすと、Windows 8.x/Windows Phone 8.1向けのユニバーサルWindowsアプリと区別が付きにくくなるので注意)。

 Windows 8.1/Windows Phone 8.1用のユニバーサルWindowsアプリを作ってきた開発者は、それらとWindows 10のユニバーサルアプリとの違いが気になるだろう。それをひと言でいえば、「Windowsランタイムが再構成された」となる。

 次の画像は、Windows 10のユニバーサルアプリが紹介されるときによく登場する図である。PC/モバイル/XboxからIoTまで複数のデバイスが一つのアプリプラットフォーム上に載っており、一つのアプリが複数のデバイスで動作するというものだ。

Windows 10のユニバーサルアプリを紹介するスライド(PowerPoint Online) Windows 10のユニバーサルアプリを紹介するスライド(PowerPoint Online)
WinHEC 2015のセッション「Developing for the Windows 10 Device Platform」のスライド資料6枚目より。

 だがこの図だけでは従来のWindows 8.1/Windows Phone 8.1用ユニバーサルWindowsアプリとの違いは分からないだろう。Windows 8.1/Windows Phone 8.1用ユニバーサルWindowsアプリの仕組みを、XboxやIoTにまで拡張したのだろうか? そうではないのだ。

 まず「おさらい」として、Windows 8.1/Windows Phone 8.1用ユニバーサルWindowsアプリ開発の仕組みを見ておこう(次の図)。注目すべき点は、Windows 8.1とWindows Phone 8.1で、Windowsランタイムが別々になっているところだ。

Windows 8.1/Windows Phone 8.1用ユニバーサルWindowsアプリ開発のイメージ Windows 8.1/Windows Phone 8.1用ユニバーサルWindowsアプリ開発のイメージ
Windowsランタイムは(その実体はどうであれ)Visual Studio上ではWindows 8.1用とWindows Phone 8.1用に分かれている。それら二つのAPI群の中に、共通するAPIが存在する(Windows 8.1とWindows Phone 8.1では9割が共通だといわれている)。
単純にアプリを開発するならば、Windows 8.1用のAPIを使ってWindows 8.1用のアプリを作成し、また、Windows Phone 8.1用のAPIを使ってWindows Phone 8.1用のアプリを作成することになる。しかし、共通のAPIを使うコードは一つにまとめたい。そこで利用されるのが「共有プロジェクト」というVisual Studioの新しいプロジェクト形式だ。共通のAPIを使うコードは共有プロジェクトに置いて、ビルドするときにそれぞれのプロジェクトとマージするのである(図の点線内)。
Windows 8.1とWindows Phone 8.1では、このようにアプリとしては別のものなのだが、ストア上で両者を結び付けて管理する仕組みを構築することで、エンドユーザーから見ればユニバーサルなアプリとしていたのである。

 Windows 8.1/Windows Phone 8.1用ユニバーサルWindowsアプリでは、利用するAPIは別々のもので、その中に共通するAPIがあった。作成されたアプリも、Windows 8.1用とWindows Phone 8.1用とで分かれており、ストア上で結び付けて管理することによってエンドユーザーにはユニバーサルなアプリとして見せていたのである。Visual Studioに「共有プロジェクト」という新しいプロジェクト形式が用意されたが、それはAPIの共通部分だけを使ったコードを一つにまとめるために利用するものだ*8

*8 共有プロジェクトを使ったWindows 8.1/Windows Phone 8.1用ユニバーサルWindowsアプリの開発については、「特集:Windowsストアアプリ開発最新情報(Build 2014より):ユニバーサルWindowsアプリ開発の勧め」参照。


 Windows 10では、Windowsランタイムが再構成された。イメージ的には次の図に示すように、共通のAPIを切り出して全てのデバイスに載せ、それ以外の部分は「Extension SDK」という形でデバイスごとに提供する形になったのである。

Windows 10用のユニバーサルアプリ開発のイメージ Windows 10用のユニバーサルアプリ開発のイメージ
これまでとはAPIの切り分け方が異なる。共通のAPI(「common APIs for Windows 10」や「universal app platform(UAP)for Windows 10」などと呼ばれている)をひとまとめにし、それは全てのデバイスで提供する(実際には、デバイスによってAPIの挙動が異なっていたりはするだろう)。デバイスに固有のAPIは「Extension SDK」として、デバイスごとに個別に提供する。
Visual StudioでWindows 10用のプロジェクトを作成すると、既定では共通のAPIだけを参照する。デバイス固有のAPIを利用したい場合には、それぞれのExtension SDKに対して参照設定を追加する。実行時にデバイス固有のAPIが利用可能かどうかチェックできるので(後述)、APIを呼び出す前に利用できることを確認するコードを書く必要がある(実行するデバイスに必要なExtension SDKが載っているかどうかにかかわらず、ビルドはできる)。
作成されたアプリは一つのバイナリになり、この図ではPCとスマートフォンしか描いていないが、XboxやIoTなど全てのWindows 10デバイスで動作可能だ。

 Windows 10用のユニバーサルアプリは、ただ一つのバイナリが複数のデバイスで動作するという、まさしくユニバーサルなアプリなのである。Extension SDKに含まれるAPIはデバイス依存であるが、デバイスに関係なくコンパイルできる。必要なExtension SDKが提供されていないデバイスで実行時にそのようなAPIを呼び出すと例外が発生するので、Extension SDKのAPIを呼び出す前に利用可能かどうかを確認するコードを書く(後述)。

 Extension SDKのイメージは、MWC 2015*3のセッションでは次の図のように説明されている。

Windows 10のユニバーサルアプリを紹介するスライド Windows 10のユニバーサルアプリを紹介するスライド
これは、「A Developer's Guide to Windows 10 Preview」*4の中の4番目のコンテンツ「Extension SDKs」から取ったものである(7分50秒付近)。MWC 2015の技術セッションでも同じ図が使われていた。
4種類のデバイスに描かれている緑色の円が共通のAPI部分である。その周囲の扇形の部分がExtension SDKで、デバイスによって異なるAPIが提供されることを示している。

 なお、特定のデバイスだけに配布できないと困ることもあるが(例えばPOSレジ用のアプリがPCに配信されても困るだろう)、そのような手段があるのかはまだ公表されていない*9

*9 MSDN「ユニバーサル ドライバーの概要」に、「[ターゲット プラットフォーム] が [ユニバーサル] に設定されていることを確認します。 その他のオプションとして、デスクトップ版 Windows 10 Technical Preview のみで実行するドライバーをビルドする [デスクトップ]、Windows 10 Technical Preview for phones のみで実行するドライバーをビルドする [モバイル] があります」とあり、同様の仕組みがアプリにもあると推測される。筆者は、マニフェストの<TargetPlatform>要素にあるName属性が該当するのではないかと考えている。さらに、ストアではより細かい指定ができるようになるかもしれない(現在のWindowsストアでも、最小メモリやタッチパネル必須といった指定ができる)。


 また、Windowsランタイムの再構成に伴いMSDNのAPIリファレンスページでの要件表示が変更されているので、それも紹介しておこう(次の画像)。これまではOSとそのバージョンが書かれていたのだが、Windows 10用のAPIでは「Device family」(対応デバイスの区分)と「API contract」(APIの区分とバージョン)に変わっている。また、共通のAPIであっても、実装に差異のある場合もあることが分かる。

MSDNのAPIリファレンスにおける新しい要件表記の例
MSDNのAPIリファレンスにおける新しい要件表記の例
MSDNのAPIリファレンスにおける新しい要件表記の例 MSDNのAPIリファレンスにおける新しい要件表記の例
上:共通のAPIの例。「Device family」が「Universal」となっている。従来から存在するAPIの場合は、この画像のように従来からの要件も併記されている(OSの種類とバージョン)。
中:Extension SDKのAPIの場合は、「Device family」の欄に対応デバイスが書かれる。複数のデバイスでサポートされているときは、このように併記される。また、「API contract」の欄を見ると、Extension SDKの単位(=デバイスごと)よりも細かい粒度でバージョン管理されるようだ。
下:共通のAPIであっても、デバイスによって実装が異なることもある。この例では、列挙値「1」がXbox専用となっている。

 次ページではVisual Studio 2015にWindows 10 開発者ツールのプレビュー版をインストールした環境で実際にWindows 10用のユニバーサルアプリを作ってみる。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。