Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
Universal Windows Apps概説

Universal Windows Apps概説

Universal Windows Apps(ユニバーサルアプリ)とは? コードを共有しよう

2014年4月10日

コードを共有できる新しいプロジェクトタイプ「ユニバーサルアプリ」の概要と、基本的な開発方法を紹介。「UIコントロールで何が共通化でき、できないか」「プラットフォーム個別の実装方法」についても説明する。

デジタルアドバンテージ 一色 政彦
  • このエントリーをはてなブックマークに追加

※2017/06/09追記: 2014年のWindows 8.1の時代に発表されたUniversal Windows Appsは、2017年6月現在のWindows 10時代ではUWPアプリユニバーサルWindowsプラットフォームアプリ)と呼ばれています。詳しくは、最新の「UWPアプリとは? ― 全(=ユニバーサル)Windowsプラットフォーム向けアプリの開発」を参照してください。

 

 「Universal Windows Apps」(以下、ユニバーサルアプリ*1)という新機能が、2014年4月2日(米国時間)に開催された開発者カンファレンス「Microsoft Build 2014」で発表された。

  • *1 iOSでiPadとiPhoneなどに全対応するアプリも「ユニバーサルアプリ」と呼ばれるので紛らわしいが、本稿ではこの用語は全て「Universal Windows Apps」の方を指すこととする。

ユニバーサルアプリとは?

 ユニバーサルアプリは、XAML(C#/Visual Basic/C++)やHTML/CSS(WinJS)などのUIコードとビジネスロジックを、以下のような各プラットフォーム向けの全アプリで共有しながら開発できる機能だ(全プラットフォーム共通のアプリを作るわけではなく、あくまで全プラットフォーム間の「コード共有」であることに注意してほしい)。

  • タブレットやPC向けの「Windowsストアアプリ
  • スマートフォン向けの「Windows Phoneアプリ
  • 将来的にはゲーム機向けの「Xbox Oneアプリ*2
  • Xamarin*3による「iOSアプリ」/「Androidアプリ」/「Macアプリ
  • *2 対応時期などは未発表。Xboxのアプリ審査により、かなり厳選されたアプリのみになるとのうわさもある(最終的にどうなるかは不明)。
  • *3 基本的には、Xamarin for Visual Studioで開発する(最新版で対応済み)。Mac向けのXamarin Studioは4~5週間後の次期アップデートで対応予定。Xamarinは「UIはプラットフォームごとに最適解が異なる」という考えに基づき設計されている。そのため、Xamarinのユニバーサルアプリでできるコード共有には、XAMLやWinJSのUIが含まれない(今後もXAMLなどは対応されないと考えられる)。Xamarinにおけるユニバーサルアプリは、PCL(ポータブル・クラス・ライブラリ)よりも手軽で便利なコード共有の仕組みと認識しておくとよいだろう(もちろんPCLにも引き続き対応している)。
Windows 8.1/Windows Phone 8.1を中心にマルチデバイス対応/クロスプラットフォーム強化(「Go Mobile with C# and Xamarin | Build 2014 | Channel 9」から引用)

 Windows 8.1/Windows Phone 8.1/Xbox One間のコード共有は、「Windows Runtime(WinRT)」というほぼ共通のWindowsコアを採用することによって実現している(次の図)。ちなみにこのWinRTベースのアプリは、エンドユーザーがいずれかのWindowsプラットフォームで購入すれば、どのプラットフォームでも使えるようになるとのことだ(実際に試したわけではないので詳細不明)。

ユニバーサルWindowsアプリのプログラミングモデル

Windows 8.1/Windows Phone 8.1向けユニバーサルアプリの開発

 それでは、まずは基本となるWindows 8.1/Windows Phone 8.1向けユニバーサルアプリの開発について説明しよう。なお、実際に開発を試すには、Windows 8.1 Update(Windows Update経由で更新可能)の最新環境上に、Visual Studio 2013 Update2 RC(リリース候補)版をインストールしておく必要がある。

ユニバーサルアプリの新規プロジェクト作成

 ユニバーサルアプリを作成するには、プロジェクトの新規作成時に、各言語(C#/Visual Basic/C++/JavaScript)の[ストア アプリ]-[ユニバーサル アプリ]カテゴリのテンプレートを選択する(以下の画面を参照)。

ユニバーサルアプリのプロジェクトテンプレート(上:C#、中:C++、下:JavaScript)

RC版では、Visual Basic用のプロジェクトテンプレートが提供されていない。正式版では追加されると思われる。

 ここでは、このうち[Visual C#]と[JavaScript]のプロジェクトを作成してみた。すると、生成された初期ファイルは次の画面のようになった。

初期ファイルの内容(左:C#、右:JavaScript)

UIコードだけでなく、画像リソースなども含めた各種コードを共有できることが分かる。

 上の画面を見ると、以下の3つのプロジェクトが作成されたことが分かる。

  • 「<プロジェクト名>.Windows」プロジェクト(赤枠): Windows 8.1アプリ用のコード。
  • 「<プロジェクト名>.WindowsPhone」プロジェクト(青枠): Windows Phone 8.1アプリ用のコード。
  • 「<プロジェクト名>.Shared」プロジェクト(緑枠。以下、共有プロジェクト): 上記の2つのプロジェクト間で共有するコード。

 共有プロジェクトは、PCLのようなライブラリではなく、従来からある「ファイル参照」機能をプロジェクトレベルでより使いやすくしたような機能だ。

 こう説明すると、拍子抜けしてしまうかもしれないが、ユニバーサルアプリの最大の利点は、XAMLやWinJSのUIコードをこの共有プロジェクト上で共有できる点にある。

共有プロジェクトによるUIコードの共有

 それでは実際に、先ほど作成したプロジェクトのXAML/WinJSのUIコードを共有化してみよう。ここでは、C#の方のプロジェクトで例を示す。

 UIコードの共有化は、驚くほど簡単だ。「*.Windows」もしくは「*.WindowsPhone」プロジェクト内から、共有したいファイルを「*.Shared」プロジェクト内にドラッグ&ドロップして、「*.Windows」および「*.WindowsPhone」プロジェクト内の同名ファイルを削除するだけでよい。次の画面は、「HubPage.xaml」「ItemPage.xaml」「SectionPage.xaml」ファイルをドラッグ&ドロップした例だ(XAMLファイルにひも付くコードビハインド・ファイルも同時にコピーされているのが分かる)。

Windows 8.1/Windows Phone 8.1アプリのプロジェクト間でコードを共有化
Windows 8.1/Windows Phone 8.1アプリのプロジェクト間でコードを共有化

 共有プロジェクト内のXAMLファイルを開いたときに、XAMLデザイナーの表示をWindows 8.1アプリとWindows Phone 8.1アプリで切り替えるには、次の画面に示すようにXAMLエディター上部の左端のプロジェクト切り替えを選択し直せばよい。

Windows 8.1/Windows Phone 8.1でXAMLデザイナーの表示を切り替え
Windows 8.1/Windows Phone 8.1でXAMLデザイナーの表示を切り替え

 この状態でビルドすると、Windows 8.1アプリとWindows Phone 8.1アプリが作成される。なお、共有プロジェクト自体は(参照にすぎないので)何のファイルも作成されない。Windows 8.1アプリとWindows Phone 8.1アプリのどちらを実行するかは、[標準]ツールバー上の[デバッグ実行]のリストから[スタートアップ プロジェクト]を切り替えればよい(次の画面)。

Windows 8.1/Windows Phone 8.1で[スタートアップ プロジェクト]を切り替え
Windows 8.1/Windows Phone 8.1で[スタートアップ プロジェクト]を切り替え

Windows 8.1/Windows Phone 8.1で共通のUIコントロールは?

 ここで気になるのは、Windows 8.1とWindows Phone 8.1でUIコントロールやその挙動が完全一致しているわけではないということだ。例えば「Windows.UI.Xaml.*」名前空間のクラス数を比較すると、次の表のような違いがある。

プラットフォーム種別 クラス 構造体 インターフェース
Windows 8.1 SDK 566 119 59
Windows Phone 8.1 SDK 624 131 57
比較結果 +58 +12 -2
Windows 8.1/Windows Phone 8.1のクラス数の比較

 共通かそうでないかは、下記の3種類のパターンに分類できる。

  • 1同じAPI
  • 2同じAPIだが、異なる挙動
  • 3デバイス独自のAPI

 それぞれについて説明しよう。

1同じAPI

 下記のような“プリミティブ”なUIコントロールは、同じAPIとなる。

  • レイアウト系: Panel、StackPanel、Grid、Border
  • Button系、Slider、ToggleSwitch、CheckBox、RadioButton、ProgressBar
  • TextBox、TextBlock
  • Shapes、Path

2同じAPIだが、異なる挙動

 次の画面はAppBarコントロールだが、XAMLコードは全く同じにもかかわらず、挙動はWindowsストアアプリとWindows Phoneアプリで異なる。

同じAPIだが、異なる挙動の例(Windows 8.1)
同じAPIだが、異なる挙動の例(上:Windows 8.1、下:Windows Phone 8.1)(「Developing Apps using the Common XAML UI Framework | Build 2014 | Channel 9」から引用)

 下記のような“プリミティブ”なUIコントロールは、同じAPIだが、異なる挙動となる。

  • Hub
  • AppBar、CommandBar
  • DatePicker/TimePicker、List Picker系(ComboBoxなど)
  • ListView(複数選択時など)
  • Flyout系
  • Media

3デバイス独自のAPI

 下記のUIコントロールは「Windows専用」となる。

  • SearchBox
  • SettingsFlyout

 また、下記のUIコントロールは「Windows Phone専用」となる。

  • Pivot
  • AutoSuggestBox
  • ContentDialog
  • Maps

共有プロジェクト内のプラットフォーム個別の実装について

 共有プロジェクトで、完全にコードを共通化できるのであれば問題ないが、ほんの数行だけコードが異なるために、コードを共有できないという場面もあるだろう。そういった場合、いったん共有プロジェクトにそのファイルを入れてしまい、そのファイル内で異なる数行を、#ifディレクティブを使って、それぞれ記述すればよい。これにより、その部分だけプラットフォームごとに処理を切り分けられる。

 具体的にはC#(「WINDOWS_APP」や「WINDOWS_PHONE_APP」)とC++(「WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP」)では、次のようなコードになる。

C#
#if WINDOWS_APP
  // <Windows 8.1ストアアプリ用のコード>
#endif
#if WINDOWS_PHONE_APP
  // <Windows Phone 8.1アプリ用のコード>
#endif
C++
#if WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP
  // <Windows Phone 8.1アプリ用のコード>
#else
  // <Windows 8.1ストアアプリ用のコード>
#endif
共有プロジェクト内のプラットフォーム個別の実装方法

 以上、ユニバーサルアプリの基本を開発者向けに紹介した。

 わざわざライブラリ化する必要がない場面では、PCLではなく、このユニバーサルアプリによるコード共有が広く使われるようになるだろう。特にWindowsストアアプリとWindows PhoneアプリでUIコードを共通化させたいときには、ユニバーサルアプリが便利だ(……WPFやWindowsフォームとUIコードを共有できないのは残念だが)。

 現時点で日本にはWindows Phone端末自体がないので、Windows 8.1とWindows Phone 8.1でコードを共有する意義が見い出しにくいのも確かだ。ここは日本の携帯電話キャリアに期待するしかない。もちろんXamarinでも活用できるので、Windowsプラットフォーム間よりも先にWindows 8.1/iOS/Androidプラットフォーム間のコード共有の方が積極的に活用され始めるかもしれない。

ユニバーサルアプリを解説する大規模カンファレンスのご紹介

 5月29日(木)~5月30日(金)、マイクロソフトの最新技術情報(例えば本稿で解説したような内容)を日本語で日本人向けに提供するカンファレンス「de:code」が日本マイクロソフト主催で開催される。このカンファレンスは、米国時間で4月2~4日に開催された「Build 2014」の内容をベースに、さらに日本向けのプラスアルファを含めたものになる。詳しい内容は(セッション内容は開催日までに決定していくとのこと)、リンク先を参照されたい。

サイトからのお知らせ

Twitterでつぶやこう!