本稿に掲載したコードを試すだけなら、無償のExpressエディションやCommunityエディションで構わない。Windows(製品版)はマイクロソフトのページから無償で入手できる。Desktop」はデスクトップで動作するアプリ用)。4(製品版)もマイクロソフトのページから無償で入手できる。Packの日本語版を追加インストールし、[オプション]ダイアログで言語を切り替える必要がある。3/4も)では、残念なことにVB用のユニバーサルプロジェクトのテンプレートは含まれていない*6。そのため、本稿で紹介するVBのコードはユニバーサルプロジェクトではなく、PCL(ポータブルクラスライブラリ)を使ったプロジェクトのものである。14」)からの提供となるようだ。プレビュー版で、すでに共有プロジェクトは利用可能になっている。14の新機能ベスト10〜もう「VBだから」とは言わせない!」参照。Windowsストアのアプリはプロトコルアクティベーションに対応しており、次のようなURIを受け付ける*7。8.1のコマンドラインではstartコマンドの引数として指定する(次の画像)。8.1の「ファイル名を指定して実行」では、このURIだけを与える。8.1のWindowsランタイムアプリでは、このURIからUriオブジェクト(System名前空間)を作り、Launcherクラス(Windows.System名前空間)のLaunchUriAsyncメソッドに引数として渡す。すると、Windowsストアのアプリが起動し、2番目/3番目の例では指定した動作が実行される。BluewaterSoft」を検索した結果が表示される(右上の検索ボックスにその文字列が見える)。プロトコルアクティベーションに与えるURI中のパラメーターはURLエンコードされていなければならないのだが、自動的にエンコードされるので通常は気にしなくてよい(この例では「@」は全角だがエンコードせずに入力している)。startコマンドの引数に与えるときには空白を含められないので、そこだけは「%20」にエンコードしておく必要があった。URIの長さは256bytesまでなので、あまり複雑な情報は渡せない。LauncherクラスのLaunchUriAsyncメソッドで起動した場合でも、起動されたアプリでの処理結果を起動元のアプリが受け取ることはできない*8。注意が必要なのは、プロトコルとアプリとの関連付けをエンドユーザーが変更できることだ(次の画像)。「ms-windows-store:」プロトコルでWindowsストアのアプリが必ず起動されるとは限らないのである*9。冒頭で「間接的に」と書いたことには、そういう意味もあるのだ。8.1のコントロールパネル)[説明]の列に「URL:」と表示されているものがプロトコルである(画像では見えていないが、このダイアログではファイル拡張子との関連付けも表示される)。ご覧の通り、筆者の環境ではかなり多くのプロトコルが登録されている。ここでプロトコルを選択し、右上の[プログラムの変更]ボタンをクリックすると、アプリの関連付けを変更するためのダイアログが出てくる。8.1のコントロールパネルで[プログラム]−[既定のプログラム]−[ファイルの種類またはプロトコルのプログラムへの関連付け]とリンクをたどって表示する。ms-windows-storeプロトコルには、まだ他にもパラメーターがある。8.1ではパラメーターの与え方が異なる。TIPS:アプリからストアを開くには?[ユニバーサルWindowsアプリ開発]」をご覧いただきたい。アプリ間連携の強化」を参照してほしい。10ではLauncherOptionsクラス(Windows.System名前空間)にTargetApplicationPackageFamilyNameプロパティが追加される。これをLauncherクラスのLaunchUriAsyncメソッドの引数に追加することで、起動されるアプリを特定できるようになるようだ。プロトコルアクティベーションを実装するには?マニフェストでプロトコルを宣言し、AppクラスでOnActivatedメソッドをオーバーライドすればよい。本稿では、次のようなURIを受け付けるようにしてみよう(以下のURIはC#版のもので、VB版ではプロトコル名を「metrotips-108vb」とする)。metrotips-108cs:Greet?msg=Hello!指定した文字列(上の2番目の例では「Hello!」)を画面に表示する部分の実装は、本稿では説明しない。別途公開のサンプルには実装してあるので、参照していただきたい。プロトコルを宣言するには?マニフェストエディターの[宣言]タブで[使用可能な宣言]として[プロトコル]を追加し、プロトコル名(今回の例では「metrotips-108cs」または「metrotips-108vb」、「:」は含まない)を入力して保存する(次の画像)。必須ではないが、[ロゴ]の画像も追加した方がよい*10。Phoneのプロジェクトそれぞれで行う。2013のマニフェストエディター)これはWindows用のプロジェクトのもの。Phone用では少々異なるが、入力すべきところは同じだ。マニフェストエディターで[宣言]タブを選び((1))、[使用可能な宣言]ドロップダウンで[プロトコル]を選び((2))、[追加]ボタンをクリックする((3))。すると右側の入力欄が表示されるので、そこの[名前]テキストボックスにプロトコル名を入力する((4))。入力するプロトコル名には「:」を含めず、全て小文字とする。[ロゴ]の画像は、OSが表示するアプリの関連付けを選ぶダイアログなどで使用される。Phoneでは同じく44×44ピクセル)が使われるようだ。Phoneでは63×63/129×129/336×336ピクセルの画像を用意する。それらの画像のファイル名にはtargetsize修飾子を含め(例:「ProtocolLogo.targetsize-16.png」)、マニフェストにはtargetsize修飾子なしで指定する(例:「ProtocolLogo.png」)。アクティブ化を処理する方法」を参照。OnActivatedメソッドをオーバーライドするには?通常起動時にはAppクラスのOnLaunchedメソッドが呼び出されるが、プロトコルアクティベーションで起動/アクティブ化されたときにはOnActivatedメソッドが呼び出される。プロトコルアクティベーションに対応するには、OnActivatedメソッドをオーバーライドして、プロトコルに対応した処理を追加する。OnActivatedメソッドのオーバーライドは、概要を示すと次のコードのようになる。プロトコルによって起動されたときは、e.KindがActivationKind.Protocolになっている。以降は、通常起動時(OnLaunchedメソッド)とほぼ同じコードを記述する。OnLaunchedメソッドでは上のようになっていた。Argumentsプロパティがない。プロトコルによって起動されたときは、args.KindがActivationKind.Protocolになっている。以降は、通常起動時(OnLaunchedメソッド)とほぼ同じコードを記述する。OnLaunchedメソッドでは上のようになっていた。Argumentsプロパティがない。2013にメソッドのオーバーライドを自動生成させた場合は引数名が「e」ではなく「args」になるが、OnLaunchedメソッドに合わせて引数名を修正する)。メソッド末尾の省略部分には、プロジェクト作成時に自動生成されたOnLaunchedメソッドの中身を丸ごとコピー&ペーストすればよい。MainPage画面を表示する部分は、このコードのように変更する(プロジェクトテンプレートによっては変更箇所のコードが少し異なっている場合もあるが、「rootFrame.Navigate」を探してほしい)。実際には、丸ごとコピー&ペーストするのではなく、共通のメソッドにくくり出すのがよいだろう。このコードだけで、プロトコルアクティベーションによってアプリが起動/アクティベートされるようになる。上のコードで、プロトコルアクティベーションによってアプリが起動/アクティベートされるようになった。画面に表示する文字列が指定されていても対応できていない。「metrotips-108cs:Greet?msg=Hello!」というUriでアクティベートされたときに「Hello!」という文字列を取り出すには、上のコードで「画面表示前にプロトコルを処理するなら、ここで行う」とコメントしてある部分に次のコードのように追加する。プロトコルによって起動されたときは、e.KindがActivationKind.Protocolになっている。uri.Queryには"?msg=Hello!"が入っている。クエリをデコードした結果(=decoder)には、Name="msg",Value="Hello!"が入っている。プロトコルによって起動されたときは、args.KindがActivationKind.Protocolになっている。アクティベートされたときのUriが入っている。uri.Queryには"?msg=Hello!"が入っている。クエリをデコードした結果(=decoder)には、Name="msg",Value="Hello!"が入っている。IfアクティベートされたUriからパラメーターを取り出すコードの例(上:C#/下:VB)このようにして取り出した文字列を、先に示したコードではMainPage画面へ遷移するときの引数として渡している。別途公開のサンプルでは、引数として渡された文字列をMainPage画面で表示するようにしている。これで、プロトコルアクティベーションによって起動されたときは、望みの動作をさせられるようになった。起動している状態でプロトコルアクティベーションを受けても何も起こらない。それに対処するには、OnLaunchedメソッドからコピー&ペーストしてきた部分の末尾に、次のようにコードを追加する。Phoneでは画面遷移履歴を消す。Phoneでは画面遷移履歴を消す。Sub実行中にプロトコルアクティベーションを受けたときに画面遷移させる例(上:C#/下:VB)アプリがすでに実行中の場合は、新しくフレームを作ったりせず、単にMainPage画面へ遷移すればよい。Phoneの場合は、ユーザビリティを考えると、画面の遷移履歴を消去した方がよい。プロトコルアクティベーションをデバッグするには?すでに起動している状態でプロトコルアクティベーションを受けた場合をデバッグするには、普通にデバッグ実行を開始した後に、Windowsではコマンドラインからstartコマンドを使ってアクティベーションすればよい。Phoneでは、アクティベーションするアプリを用意しておいてそれを使う(別途公開のサンプルには、そのプロジェクトもC#版のみだが含めてある)。起動していない状態でプロトコルアクティベーションを受けた場合をデバッグするには、まずプロジェクトのプロパティ画面で[開始動作]を[起動しないが、開始時にコードをデバッグ]に変更しておく(次の画像)。デバッグ実行を開始してから、アクティベーションを行う。2013)プロジェクトのプロパティを表示し、左端で[デバッグ]を選び(この画像では青くなっている)、右の[開始動作]の[起動しないが、開始時にコードをデバッグ]チェックボックスにチェックを入れる。Studioがデバッグ開始を待機している状態になる。他からアプリを起動すると(例えばスタート画面でタイルをタップしたり、別のアプリからプロトコルアクティベーションを実行したりすると)、デバッグが始まる。まとめプロトコルアクティベーションは、すでに多くのアプリで使われている(本文中の「プロトコルとアプリとの関連付けを設定するダイアログ」画像を参照)。10では、起動したアプリから処理結果を返してもらえるようにもなる。この機会に、プロトコルアクティベーションの活用を考えてみてはいかがだろうか。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。