UWP : アプリ入ってますか? カスタム URI スキームをチェックする
UWP アプリ間で連携する際、連携先のアプリがあるかどうか確認したいことがあります。
例えば、新聞アプリやニュースアプリ上で選択したテキストに対して右ボタンクリックなどのコンテキストメニューから、辞書アプリを起動し選択した文字の意味を調べる、といったアプリ間連携のシナリオです。
この場合、アプリをアクティブ化する方法として、アプリに対してカスタム URI スキームを定義する方法があります。
プレインストールされているアプリでも URI スキームが用意されているものもあります。代表的なものとしてアプリが一覧表示されているマーケットプレイスである「ストア」アプリは、以下のリンクのように URI スキームが用意されています。
https://msdn.microsoft.com/ja-jp/library/windows/apps/mt228343.aspx
単に起動するだけではなく、パラメータを渡すこともできることが分かります。つまり、辞書アプリのシナリオ例もカバーできるアクティブ化の方法です。
さて、連携アプリ側でカスタム URI スキームを用意されていると、その URI が存在し必要な情報が一致すればアプリがインストールされているとみなしてアプリを起動する、といった方法をとることが少なくありません。
アプリがインストールされていない場合はボタンやトグルスイッチを disable 状態にして、アプリを起動したのにエラーになった、というユーザの満足度を下げるアプリのふるまいを制限することができます。
そこで、カスタム URI が存在しているかどうかのチェックですが、、、Windows 8/8.1 の Windows Runtime では残念ながらありませんでした。
Windows 10 では、Launcher クラスが強化され、URI スキームに対してアプリが割り当てられているかチェックする FindUriSchemeHandlersAsync メソッドが用意されました。
以下簡単な例です。
private async void FindUriScheme()
{
var res = await Launcher.FindUriSchemeHandlersAsync("http");
var resappinfo = res[0].PackageFamilyName;
}
Classic Windows applications は対象ではありませんので、要注意です。
なお、ファイル拡張子によりアプリチェックする FindFileHandlersAsync メソッドも用意されています。このメソッドでは
Launcher.FindFileHandersAsync(".hoge")
といったように、. (ピリオド/ポチ)を付けて指定します。こちらも同様に、Classic Windows applications は対象ではありません。