特集:続・Windows 8開発に向けて準備しよう

「コントラクト」でMetroスタイル・アプリのサンドボックスを乗り越える!
―― アプリを連携させる新しい仕組みを理解しよう! ――

BluewaterSoft 山本 康彦
2012/05/11
Page1 Page2

 Windows 8向けのMetroスタイル・アプリは、サンドボックスの中で動作する。それによって前記事で述べたように、ユーザーのプライバシーを守り、ウイルスやスパイウェアなどのマルウェアを作れないようにしている。アプリ同士の相互作用も厳しく制限されており、プロセス間通信はもとよりローカルのデータベース・サーバ/Webサーバなどへのアクセスもできないし、ほかのアプリを起動することすらできない。

 では、サンドボックスを乗り越えてほかのアプリと連携することは全くできないのかというと、そんなことはなく、そのための仕組みとして「コントラクト」が提供されている。この記事では、あなたのアプリをコントラクトに対応させる方法について、サンプル・コードを交えて説明する。

 本稿は発売前のソフトウェアに基づいて書かれており、製品では異なることがある。
 本稿に載せたキャプチャ画像は、Windows 7(64bit版)の上でVirtualBoxを使い、Windows 8 Consumer PreviewとVisual Studio 11 betaを動かしたものである。掲載したコードもその環境で確認している。
 本稿での「ユーザー」という表記は全て、Metroスタイル・アプリを利用する「エンド・ユーザー」を意味する。また、単に「アプリ」と表記しているものは全て、「Metroスタイル・アプリ」を意味する。
 本稿のサンプル・コードは、C#でのみ記述する(Visual Basicのコードは併記していない)。各サンプル・コードで実装のポイントを説明しているので、Visual Basic開発者にとっても参考になるだろう。

Metro実行環境との間の「契約」

 コントラクトとは、アプリと、その実行環境(以下、Metro実行環境)の間の「契約」である。アプリは、契約に基づいて他アプリとの連携をMetro実行環境に依頼し、また、Metro実行環境は契約に基づいて他アプリに連携処理を依頼する。連携相手の「他アプリ」が何であるかは、連携を依頼するアプリからも依頼されたアプリからも分からない。なお、コントラクトを実現する仕組みは、「Windowsアクティベーション・プラットフォーム」と呼ばれる。

 これらの関係は、次の図のようなイメージになる。

コントラクトのイメージ
アプリは、コントラクトに基づいて、Metro実行環境に連携を依頼したりされたりする。連携しているアプリ同士は、相手のアプリが何であるかを知らない。

アクティベーションの2つのパターン

 コントラクトによって依頼される側のアプリが起動(=アクティベーション)されるには、2つの画面表示パターンがある。「メイン・ビュー・アクティベーション」と「ホステッド・ビュー・アクティベーション」である。

 メイン・ビュー・アクティベーションでは、完全に依頼された側のアプリの画面に切り替わる。

 ホステッド・ビュー・アクティベーションは、依頼した側のアプリ(=ホスト)の画面の中に依頼された側のアプリが表示されるパターンである。次の2つの画像のように、右側のペインに表示される場合と、太い横帯状に表示される場合がある。

ホステッド・ビューの例(1)
「SkyDrive」アプリから開いた共有チャームのウィンドウ(右側)に表示された「メール」アプリの画面。

ホステッド・ビューの例(2)
「Reader」アプリから開いたファイル・オープン・ピッカー(濃緑色の部分)の中に表示された「SkyDrive」アプリの画面(中央の白い部分)。

 ちなみに、2つ目の画像のようにファイル・オープン・ピッカーの中でSkyDriveアプリを使うのはユーザーの判断であり、ファイル・オープン・ピッカーを使っているReaderアプリはそのことを知らない。Readerアプリは、そのファイルがローカルにあるのか、ネットワーク(SkyDrive)にあるのかを気にすることなく、読み書きしている。SkyDriveアプリのように、コントラクトに対応したストレージ・アプリを1つ作るだけで、ファイルを読み書きする全てのアプリからそのストレージを使えるようになるのだ。

コントラクトの種類

 コントラクトには、主に次のようなものがある。

名称 概略 送り側 受け側
App to App Picking contract
(アプリ間ファイル・ピッキング・コントラクト)
読み書きするファイルを、ほかのアプリを通じてユーザーに選択してもらう アプリが表示したファイル・オープン・ピッカー、または、ファイル・セーブ・ピッカー ホステッド・ビュー
AutoPlay
(自動再生)
ユーザーがデバイスを接続したときに、動画や音楽などを自動演奏する (Metro実行環境) メイン・ビュー
Background tasks
(バックグラウンド・タスク)
アプリが起動していないときでも、定期的にバックグラウンドで動作させる (Metro実行環境) アプリが登録したタスク
Contact picker
(連絡先ピッカー)
メール・アドレスなどの連絡先を、ほかのアプリを通じてユーザーに選択してもらう アプリが表示したコンタクト・ピッカー ホステッド・ビュー
File activation
(ファイル・アクティベーション)
ファイル拡張子に関連付けられたアプリを起動する アプリ、または、システムの検索ペイン(ファイルを検索した場合) メイン・ビュー
Protocol activation
(プロトコル・アクティベーション)
httpなどのプロトコルに関連付けられたアプリを起動する アプリ メイン・ビュー
Search contract
(検索コントラクト)
ファイルや情報などを、ほかのアプリを通じてユーザーに検索してもらう 検索ペイン(ユーザーが検索チャームで開くか、アプリから直接開く) メイン・ビュー
Settings contract
(設定コントラクト)
ユーザーがアプリの設定を行う 設定ペイン(ユーザーが設定チャームで開くか、アプリから直接開く) ホステッド・ビュー
Share contract
(共有コントラクト)
ファイルや情報などを、ほかのアプリを通じてユーザーが指定したどこかに送る 共有ペイン(ユーザーが設定チャームで開くか、アプリから直接開く) ホステッド・ビュー
主なコントラクト
  名称の日本語訳には、まだ公式な翻訳がないために、筆者が仮に訳したものがある。
「送り側」はMetro実行環境に依頼する側、「受け側」はMetro実行環境から依頼される側である(前出の図を参照)。
このほかのコントラクトに右のようなものがある。:Cached file updater、Camera settings、Game installer、Play To contract、Print task settings、Account Picture Provider、SSL/certificates

 コントラクトの多くはユーザーの関与が必要なことに気付かれただろうか。ファイルやプロトコルの関連付けはユーザーが変更できることを考えると、ほとんどのコントラクトはユーザーのコントロール下にあるといえる。ユーザーのプライバシーを守るために、ユーザーが関与しない連携はさせないようになっているのだ。

 例えば連絡先ピッカーは、ユーザーが選択したメール・アドレスを得られるが、無差別にメール・アドレスを収集することはできない。なお、バックグラウンド・タスクは例外だが、それは1つのアプリの一部分であって、ほかのアプリとの連携ではない。

 ところで、このようなアプリ間の連携ができるアプリと、そうでないアプリとでは、どちらがユーザーに使ってもらえるだろうか? Windows Storeでの競争を勝ち抜くためには、これらのコントラクトをうまく利用していることも条件になるであろう。

コントラクトの実装

送り側

 連携を依頼するのは簡単である。ピッカーや検索ペインなどは、それらのクラスが用意されているので、単に表示するコードを書けばよい(検索ペインなどはアプリから出さなくても、ユーザーが自由に表示できる)。アクティベーションも、ファイルやプロトコルを引数としてAPIを呼び出すだけである。

受け側

 連携を依頼される側は、マニフェスト・ファイルへの記述が必要になる。マニフェスト・ファイルの「宣言」に、「こういう契約を受け付けますよ」という記述が必要なのだ。そのうえで、依頼を受けたときのイベント・ハンドラを実装する。

 以下(次のページでは)、コントラクトの実装例をいくつか紹介する。

  • ファイル・アクティベーション(送り側・受け側)
  • プロトコル・アクティベーション(送り側・受け側)
  • 共有コントラクト(送り側)
  • ファイル・オープン・ピッカー(受け側)

 INDEX
  [特集] 続・Windows 8開発に向けて準備しよう
  「コントラクト」でMetroスタイル・アプリのサンドボックスを乗り越える!
  1.コントラクトとアクティベーション・パターン
    2.コントラクトの実装例


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH