アプリの URI ハンドラーを使用してアプリを Web サイトで有効にする

Web サイト用アプリはアプリを Web サイトに関連付け、他のユーザーが Web サイトへのリンクを開くと、ブラウザーを開く代わりにアプリが起動されます。 アプリがインストールされていない場合は、通常どおりブラウザーで Web サイトが開きます。 検証済みのコンテンツ所有者のみがリンクに登録できるため、ユーザーはこのエクスペリエンスを信頼できます。 ユーザーは、登録された Web とアプリのリンクすべてを、[設定] > [アプリ] > [Web サイト用のアプリ] で確認できます。

Web からアプリへのリンクを有効にするには、次の操作を行う必要があります。

  • マニフェスト ファイルでアプリが処理する URI を特定する
  • アプリと Web サイトの間の関連付けを定義する JSON ファイル。 アプリ マニフェスト宣言と同じホスト ルートにあるアプリ パッケージ ファミリ名を使用します。
  • アプリでアクティブ化を処理します。

Note

Windows 10 Creators 更新プログラム以降、Microsoft Edge 従来版でクリックされたサポートされているリンクは、対応するアプリを起動します。 他のブラウザー (Microsoft Edge Chromium、Internet Explorer など) でクリックされたサポートされているリンクは、閲覧エクスペリエンスを維持します。

アプリでは、処理する Web サイトの URI を識別する必要があります。 これを行うには、 Windows.appUriHandler 拡張機能の登録をアプリのマニフェスト ファイル Package.appxmanifest に追加します。

たとえば、Web サイトのアドレスが "msn.com" の場合は、アプリのマニフェストに次のエントリを作成します。

<Applications>
  <Application ... >
      ...
      <Extensions>
         <uap3:Extension Category="windows.appUriHandler">
          <uap3:AppUriHandler>
            <uap3:Host Name="msn.com" />
          </uap3:AppUriHandler>
        </uap3:Extension>
      </Extensions>
  </Application>
</Applications>

上記の宣言は、指定されたホストからのリンクを処理するためにアプリを登録します。 Web サイトに複数のアドレス (m.example.com、www.example.com、example.com など) がある場合は、アドレスごとに<uap3:AppUriHandler>内に個別の<uap3:Host Name=... />エントリを追加します。

アプリと Web サイトを JSON ファイルに関連付ける

アプリのみが Web サイトのコンテンツを開くことができるようにするには、アプリのパッケージ ファミリ名を、Web サーバー ルートまたはドメイン上の既知のディレクトリにある JSON ファイルに含めます。 これは、リストされているアプリがサイト上のコンテンツを開くために、Web サイトが同意していることを示します。 パッケージ ファミリ名は、アプリ マニフェスト デザイナーの [パッケージ] セクションで確認できます。

重要

JSON ファイルには、.jsonファイルサフィックスを付けてはなりません。

windows-app-web-link という名前の JSON ファイル (.json ファイル拡張子を除く) を作成しアプリのパッケージ ファミリ名を指定します。 次に例を示します。

[{
  "packageFamilyName" : "Your app's package family name, e.g MyApp_9jmtgj1pbbz6e",
  "paths" : [ "*" ],
  "excludePaths" : [ "/news/*", "/blog/*" ]
 }]

Windows によって Web サイトへの https 接続が確立され、Web サーバー上で対応する JSON ファイルが検索されます。

ワイルドカード

上記の JSON ファイルの例は、ワイルドカードの使用を示しています。 ワイルドカードを使用すると、コード行数が少ないさまざまなリンクをサポートできます。 Web からアプリへのリンクでは、JSON ファイルで次の 2 種類のワイルドカードがサポートされています。

ワイルドカード 説明
* 部分文字列を表します。
? 1 文字を表します。

たとえば、上記の例のように "excludePaths" : [ "/news/*", "/blog/*" ] と指定すると、アプリでは、Web サイトのアドレス (たとえば msn.com) で始まるすべてのパスがサポートされますが、/news//blog/ の下にあるパスはサポートされません。 つまり、msn.com/weather.html はサポートされますが、msn.com/news/topnews.html はサポートされません。

複数のアプリ

Web サイトにリンクする 2 つのアプリがある場合は、 windows-app-web-link JSON ファイルに両方のアプリケーション パッケージ ファミリ名を一覧表示します。 両方のアプリをサポートできます。 両方がインストールされている場合、ユーザーには既定のリンクを選択できます。 既定のリンクを後で変更する場合は、[設定] > [Web サイト用のアプリ] で変更できます。 また、開発者はいつでも JSON ファイルを変更し、更新後 8 日以内に同じ日に変更を確認することもできます。

[{
  "packageFamilyName": "Your apps's package family name, e.g MyApp_9jmtgj1pbbz6e",
  "paths": [ "*" ],
  "excludePaths" : [ "/news/*", "/blog/*" ]
 },
 {
  "packageFamilyName": "Your second app's package family name, for example, MyApp2_8jmtgj2pbbz6e",
  "paths": [ "/example/*", "/links/*" ]
 }]

ユーザーに最適なエクスペリエンスを提供するには、除外パスを使用して、オンライン専用コンテンツが JSON ファイルでサポートされているパスから確実に除外されるようにします。

除外パスが最初にチェックされ、一致する場合は、指定されたアプリではなく、対応するページがブラウザーで開かれます。 上記の例では、‘/news/*’ と指定すると、そのパスの下にあるすべてのページが対象となりますが、‘/news*’ ('news' の後にスラッシュを付けない) と指定すると、‘news*’ で始まるパス (‘newslocal/’、‘newsinternational/’ など) の下にあるすべてのパスが対象となります。

アプリの Visual Studio ソリューションと OnActivated()でApp.xaml.csに移動、リンクされたコンテンツの処理を追加します。 次の例では、アプリで開かれるページは URI パスによって異なります。

protected override void OnActivated(IActivatedEventArgs e)
{
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame == null)
    {
        ...
    }

    // Check ActivationKind, Parse URI, and Navigate user to content
    Type deepLinkPageType = typeof(MainPage);
    if (e.Kind == ActivationKind.Protocol)
    {
        var protocolArgs = (ProtocolActivatedEventArgs)e;        
        switch (protocolArgs.Uri.AbsolutePath)
        {
            case "/":
                break;
            case "/index.html":
                break;
            case "/sports.html":
                deepLinkPageType = typeof(SportsPage);
                break;
            case "/technology.html":
                deepLinkPageType = typeof(TechnologyPage);
                break;
            case "/business.html":
                deepLinkPageType = typeof(BusinessPage);
                break;
            case "/science.html":
                deepLinkPageType = typeof(SciencePage);
                break;
        }
    }

    if (rootFrame.Content == null)
    {
        // Default navigation
        rootFrame.Navigate(deepLinkPageType, e);
    }

    // Ensure the current window is active
    Window.Current.Activate();
}

重要 上の例に示すように、最終的な if (rootFrame.Content == null) ロジックを必ず rootFrame.Navigate(deepLinkPageType, e); に置き換えてください。

テストアウト: ローカル検証ツール

アプリと Web サイトの構成をテストするには、次のツールで使用可能なアプリ ホスト登録検証ツールを実行します。

%windir%\system32\AppHostRegistrationVerifier.exe

次のパラメーターを使用してこのツールを実行して、アプリと Web サイトの構成をテストします。

AppHostRegistrationVerifier.exe hostname packagefamilyname filepath

  • ホスト名: Web サイト (例: microsoft.com)
  • パッケージ ファミリ名 (PFN): アプリの PFN
  • ファイル パス: ローカル検証のための JSON ファイル (C:\SomeFolder\windows-app-web-link など)

ツールが何も返さない場合は、アップロード時にそのファイルに対して検証が機能します。 エラー コードがある場合は機能しません。

次のレジストリ キーを有効にして、ローカル検証の一部としてサイドロードされたアプリのパスマッチングを強制できます。

HKCU\Software\Classes\LocalSettings\Software\Microsoft\Windows\CurrentVersion\ AppModel\SystemAppData\YourApp\AppUriHandlers

キー名: ForceValidation 値: 1

テストする: Web 検証

リンクをクリックしたときにアプリがアクティブになっていることを確認するには、アプリケーションを閉じます。 次に、Web サイトでサポートされているパスの 1 つのアドレスをコピーします。 たとえば、Web サイトのアドレスが “msn.com” であり、サポートされるパスの 1 つが “path1” である場合、http://msn.com/path1 を使用します。

アプリが閉じていることを確認します。 Windows キー + R キーを押して Run ダイアログ ボックスを開き、ウィンドウにリンクを貼り付けます。 Web ブラウザーの代わりにアプリが起動します。

さらに、 LaunchUriAsync API を使用して別のアプリからアプリを起動することで、アプリをテストできます。 この API を使用して、電話でもテストできます。

プロトコルのアクティブ化ロジックに従う場合は、 OnActivated イベント ハンドラーにブレークポイントを設定します。

AppUriHandlers のヒント:

  • アプリで処理できるリンクのみを指定してください。
  • サポートするすべてのホストを一覧表示します。 www.example.com と example.com は異なるホストであることに注意してください。
  • ユーザーは、[設定] で Web サイトを処理するアプリを選択できます。
  • JSON ファイルを https サーバーにアップロードする必要があります。
  • サポートするパスを変更する必要がある場合は、アプリを再発行せずに JSON ファイルを再発行できます。 ユーザーには、1 日から 8 日で変更が表示されます。
  • AppUriHandlers を使用してサイドロードされたすべてのアプリには、インストール時にホストの検証済みリンクがあります。 機能をテストするために JSON ファイルをアップロードする必要はありません。
  • この機能は、アプリが LaunchUriAsync によって起動された UWP アプリである場合、または ShellExecuteEx によって起動された Windows デスクトップ アプリである場合は、必ず動作します。 URL が登録済みのアプリ URI ハンドラーに対応する場合は、ブラウザーではなくアプリが起動されます。

関連項目

Web からアプリへのサンプル プロジェクトwindows.protocol registrationHandle URI ActivationAssociation Launch サンプル LaunchUriAsync() API の使用方法を示します。