Android のアプリリンク

このガイドでは、Android 6.0 での "アプリリンク" のサポートについて説明します。アプリリンクは、モバイル アプリが Web サイト上の URL に応答できるようにするための手法です。 ここでは、アプリリンクの概要、Android 6.0 アプリケーションでアプリリンクを実装する方法、モバイル アプリにドメインに対するアクセス許可を付与するように Web サイトを構成する方法について説明します。

アプリリンクの概要

モバイル アプリケーションは、サイロに存在するものではなくなりました。多くの場合、Web サイトと共に、ビジネスの重要なコンポーネントとなっています。 ビジネスでは、モバイル アプリケーションを起動してモバイル アプリに関連コンテンツを表示する、Web サイト上のリンクによって、Web プレゼンスとモバイル アプリケーションをシームレスに接続することが望まれます。 "アプリリンク" ("ディープリンク" とも呼ばれます) は、モバイル デバイスが URI に応答し、その URI に対応するモバイル アプリケーションを起動できるようにする 1 つの手法です。

Android では、"インテント システム" によってアプリリンクを処理します。ユーザーがモバイル ブラウザーでリンクをクリックすると、モバイルブラウザーによって、Android が登録済みのアプリケーションに委任するインテントがディスパッチされます。 たとえば、料理の Web サイトでリンクをクリックすると、その Web サイトに関連付けられているモバイル アプリが開き、特定のレシピがユーザーに表示されます。 そのインテントを処理するために複数のアプリケーションが登録されている場合は、インテントを処理するアプリケーションを選択するようユーザーに求める、"あいまいさ回避ダイアログ" と呼ばれるものが表示されます。次に例を示します。

Example screenshot of a disambiguation dialog

Android 6.0 では、自動リンク処理を使用してこれを改善しています。 Android では、アプリケーションを URI の既定のハンドラーとして自動的に登録できます。そのアプリが自動的に起動し、関連するアクティビティに直接移動します。 Android 6.0 で URI のクリックを処理する方法は、次の条件によって決まります。

  1. 既存のアプリが URI に既に関連付けられている – ユーザーが既存のアプリを URI に既に関連付けている場合があります。 その場合、そのアプリケーションが引き続き使用されます。
  2. URI に既存のアプリは関連付けられていないが、サポート アプリがインストールされている – このシナリオでは、ユーザーが既存のアプリを指定していないため、インストールされているサポート アプリケーションを使用して要求が処理されます。
  3. URI に既存のアプリは関連付けられていないが、複数のサポート アプリがインストールされている – URI をサポートするアプリケーションが複数あるため、あいまいさ回避ダイアログが表示され、URI を処理するアプリをユーザーが選択する必要があります。

ユーザーが URI をサポートするアプリをインストールしておらず、その後アプリがインストールされた場合は、URI に関連付けられている Web サイトとの関連付けが検証された後に、そのアプリケーションが URI の既定のハンドラーとして設定されます。

このガイドでは、Android 6.0 アプリケーションを構成する方法と、Android 6.0 でアプリリンクをサポートするためのデジタル アセット リンク ファイルを作成および公開する方法について説明します。

要件

このガイドでは、Xamarin.Android 6.1 と、Android 6.0 (API レベル 23) 以上を対象とするアプリケーションが必要です。

Xamarin コンポーネント ストアの Rivets NuGet パッケージを使用すると、以前のバージョンの Android でアプリリンクを使用できます。 Rivets パッケージは、Android 6.0 のアプリリンクと互換性がありません。Android 6.0 のアプリリンクはサポートされていません。

Android 6.0 でのアプリリンクの構成

Android 6.0 でアプリリンクを設定するには、2 つの主な手順が必要です。

  1. Web サイトの URI の 1 つ以上のインテント フィルターを追加する – インテント フィルターは、モバイル ブラウザーでの URL のクリックを処理する方法を Android に指示します。
  2. "デジタル アセット リンク JSON" ファイルを Web サイトで公開する – これは、Web サイトにアップロードされ、モバイル アプリと Web サイトのドメインの関係を検証するために Android で使用されるファイルです。 これがないと、Android は URI の既定のハンドルとしてアプリをインストールできません。その場合、ユーザーが手動で行う必要があります。

インテント フィルターの構成

URI (または使用可能な一連の URI) を Web サイトから Android アプリケーションのアクティビティにマップするインテント フィルターを構成する必要があります。 Xamarin.Android では、IntentFilterAttribute でアクティビティを装飾することによってこの関係が確立されます。 インテント フィルターでは、次の情報を宣言する必要があります。

  • Intent.ActionView – 情報を表示する要求に応答するインテント フィルターを登録します。
  • Categories – インテント フィルターでは、Web URI を適切に処理できるように、Intent.CategoryBrowsableIntent.CategoryDefault の両方を登録する必要があります。
  • DataScheme – インテント フィルターでは、http または https (あるいはその両方) を宣言する必要があります。 有効なスキームはこの 2 つだけです。
  • DataHost – URI の取得元となるドメインです。
  • DataPathPrefix – Web サイト上のリソースの省略可能なパスです。
  • AutoVerifyautoVerify 属性は、アプリケーションと Web サイトの関係を検証するよう Android に指示します。 これについては、後ほど詳しく説明します。

次の例は、IntentFilterAttribute を使用して、https://www.recipe-app.com/recipes および http://www.recipe-app.com/recipes からのリンクを処理する方法を示しています。

[IntentFilter(new [] { Intent.ActionView },
              Categories = new[] { Intent.CategoryBrowsable, Intent.CategoryDefault },
              DataScheme = "http",
              DataHost = "recipe-app.com",
              DataPathPrefix = "/recipe",
              AutoVerify=true)]
public class RecipeActivity : Activity
{
    // Code for the activity omitted
}

Android では、アプリケーションを URI の既定のハンドラーとして登録する前に、Web サイト上のデジタル アセット ファイルに対して、インテント フィルターで識別されるすべてのホストを検証します。 Android がアプリを既定のハンドラーとして設定するには、すべてのインテント フィルターが検証を通過している必要があります。

Android 6.0 のアプリリンクでは、Android はアプリケーションを URI の既定のハンドラーとして設定する前に、アプリケーションと Web サイトの関連付けを検証する必要があります。 この検証は、アプリケーションが最初にインストールされたときに実行されます。 "デジタル アセット リンク" ファイルは、関連する Web ドメインでホストされる JSON ファイルです。

Note

インテント フィルターで android:autoVerify 属性を設定する必要があります。これを行わないと、検証は実行されません。

このファイルは、ドメインの Web マスターによって https://domain/.well-known/assetlinks.json に配置されます。

デジタル アセット ファイルには、Android が関連付けを検証するために必要なメタデータが含まれています。 assetlinks.json ファイルには、次のキーと値のペアが含まれています。

  • namespace – Android アプリケーションの名前空間。
  • package_name – Android アプリケーションのパッケージ名 (アプリケーション マニフェストで宣言)。
  • sha256_cert_fingerprints – 署名済みアプリケーションの SHA256 フィンガープリント。 アプリケーションの SHA256 フィンガープリントを取得する方法の詳細については、キーストアの署名の検索に関するガイドをご覧ください。

次のスニペットは、アプリケーションが 1 つだけ記載された assetlinks.json の例を示しています。

[
   {
      "relation": [
         "delegate_permission/common.handle_all_urls"
      ],
      "target": {
         "namespace": "android_app",
         "package_name": "com.example",
         "sha256_cert_fingerprints": [
            "14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"
         ]
      }
   }
]

アプリケーションのさまざまなバージョンやビルドをサポートするために、複数の SHA256 フィンガープリントを登録できます。 次の assetlinks.json ファイルは、複数のアプリケーションの登録例を示しています。

[
   {
      "relation": [
         "delegate_permission/common.handle_all_urls"
      ],
      "target": {
         "namespace": "android_app",
         "package_name": "example.com.puppies.app",
         "sha256_cert_fingerprints": [
            "14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"
         ]
      }
   },
   {
      "relation": [
         "delegate_permission/common.handle_all_urls"
      ],
      "target": {
         "namespace": "android_app",
         "package_name": "example.com.monkeys.app",
         "sha256_cert_fingerprints": [
            "14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"
         ]
      }
   }
]

Google Digital Asset Links Web サイトには、デジタル アセット ファイルの作成とテストを支援するオンライン ツールがあります。

アプリリンクを実装したら、さまざまな部分をテストして、想定どおりに機能することを確認する必要があります。

次の例に示すように、Google の Digital Asset Links API を使用して、デジタル アセット ファイルが適切に書式設定され、ホストされていることを確認できます。

https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=
  https://<WEB SITE ADDRESS>:&relation=delegate_permission/common.handle_all_urls

インテント フィルターが適切に構成されており、アプリが URI の既定のハンドラーとして設定されていることを確認するために実行できる 2 つのテストがあります。

  1. 前述のように、デジタル アセット ファイルは適切にホストされています。 最初のテストでは、Android がモバイル アプリケーションにリダイレクトするインテントをディスパッチします。 Android アプリケーションが起動し、URL に登録されているアクティビティが表示されます。 コマンド プロンプトで次のように入力します。

    $ adb shell am start -a android.intent.action.VIEW \
        -c android.intent.category.BROWSABLE \
        -d "http://<domain1>/recipe/scalloped-potato"
    
  2. 特定のデバイスにインストールされているアプリケーションの既存のリンク処理ポリシーを表示します。 次のコマンドでは、デバイス上の各ユーザーのリンク ポリシーのリストを次の情報と共にダンプします。 コマンド プロンプトで、次のコマンドを入力します。

    $ adb shell dumpsys package domain-preferred-apps
    
    • Package – アプリケーションのパッケージ名。
    • Domain – Web リンクがアプリケーションによって処理されるドメイン (スペースで区切られています)
    • Status – アプリの現在のリンク処理の状態。 値 always は、アプリケーションで android:autoVerify=true が宣言されており、システムの検証を通過したことを意味します。 その後に、Android システムのプリファレンスのレコードを表す 16 進数が続きます。

    次に例を示します。

    $ adb shell dumpsys package domain-preferred-apps
    
    App linkages for user 0:
    Package: com.android.vending
    Domains: play.google.com market.android.com
    Status: always : 200000002
    

まとめ

このガイドでは、Android 6.0 でのアプリリンクのしくみについて説明しました。 次に、アプリリンクをサポートし、アプリリンクに応答するように Android 6.0 アプリケーションを構成する方法について説明しました。 また、Android アプリケーションでアプリリンクをテストする方法についても説明しました。