アプリケーション インデックス作成とディープ リンクの設定Application Indexing and Deep Linking

サンプルのダウンロードサンプルのダウンロードDownload Sample Download the sample

アプリケーション インデックス作成を使用すると、何度か使用した後に忘れてしまいそうなアプリケーションを検索結果に表示することで、関連性を保つことができます。ディープ リンクの設定を使用すると、アプリケーションのデータが含まれている検索結果にアプリケーションが応答するようにできます。通常の応答では、ディープ リンクから参照されているページに移動します。この記事では、アプリケーション インデックス作成とディープ リンクの設定を使用して、Xamarin.Forms アプリケーションのコンテンツを iOS および Android のデバイス上で検索できるようにする方法について説明します。Application indexing allows applications that would otherwise be forgotten after a few uses to stay relevant by appearing in search results. Deep linking allows applications to respond to a search result that contains application data, typically by navigating to a page referenced from a deep link. This article explains how to use application indexing and deep linking to make Xamarin.Forms application content searchable on iOS and Android devices.

Xamarin.Forms と Azure でのディープ リンク設定のビデオDeep Linking with Xamarin.Forms and Azure video

Xamarin.Forms アプリケーション インデックス作成とディープ リンクの設定では、ユーザーがアプリケーション間を移動するとき、アプリケーション インデックス作成用のメタデータを発行する API が提供されます。Xamarin.Forms application indexing and deep linking provide an API for publishing metadata for application indexing as users navigate through applications. インデックスが付けられたコンテンツは、Spotlight 検索、Google 検索、または Web 検索で検索することができます。Indexed content can then be searched for in Spotlight Search, in Google Search, or in a web search. ディープ リンクが含まれている検索結果をタップすると、アプリケーションによって処理できるイベントが開始されます。これは、通常、ディープ リンクから参照されているページに移動するために使用されます。Tapping on a search result that contains a deep link will fire an event that can be handled by an application, and is typically used to navigate to the page referenced from the deep link.

サンプル アプリケーションは、次のスクリーン ショットに示すように、データがローカルの SQLite データベースに格納される Todo リスト アプリケーションの例です。The sample application demonstrates a Todo list application where the data is stored in a local SQLite database, as shown in the following screenshots:

ユーザーによって作成された各 TodoItem インスタンスにインデックスが付けられます。Each TodoItem instance created by the user is indexed. これにより、プラットフォーム固有の検索を使用して、アプリケーションからインデックス付きのデータを特定できるようになります。Platform-specific search can then be used to locate indexed data from the application. アプリケーションに関する検索結果の項目をユーザーがタップすると、そのアプリケーションが起動し、TodoItemPage に移動し、ディープ リンクから参照された TodoItem が表示されます。When the user taps on a search result item for the application, the application is launched, the TodoItemPage is navigated to, and the TodoItem referenced from the deep link is displayed.

SQLite データベースの使用の詳細については、「Xamarin.Forms ローカル データベース」を参照してください。For more information about using an SQLite database, see Xamarin.Forms Local Databases.

注意

Xamarin.Forms アプリケーション インデックス作成およびディープ リンクの設定の機能は、iOS および Android プラットフォーム上でのみ使用することができ、そのためにはそれぞれ iOS 9 以上および API 23 以上が必要です。Xamarin.Forms application indexing and deep linking functionality is only available on the iOS and Android platforms, and requires a minimum of iOS 9 and API 23 respectively.

セットアップSetup

次のセクションでは、iOS および Android プラットフォーム上でこの機能を使用する上で必要な追加のセットアップ手順を説明します。The following sections provide any additional setup instructions for using this feature on the iOS and Android platforms.

iOSiOS

IOS プラットフォーム上では、バンドルに署名するためのカスタムのエンタイトルメント ファイルとして Entitlements.plist ファイルがご利用の iOS プラットフォーム プロジェクトによって設定されていることを確認します。On the iOS platform, ensure that your iOS platform project sets the Entitlements.plist file as the custom entitlements file for signing the bundle.

iOS ユニバーサル リンクを使用するには:To use iOS Universal Links:

  1. applinks キーを使用して関連付けられているドメインのエンタイトルメントをご利用のアプリに追加します。そのアプリでサポートされるすべてのドメインが対象となります。Add an Associated Domains entitlement to your app, with the applinks key, including all the domains your app will support.
  2. ご利用の Web サイトに Apple アプリ サイトの関連ファイルを追加します。Add an Apple App Site Association file to your website.
  3. その Apple アプリ サイトの関連ファイルに applinks キーを追加します。Add the applinks key to the Apple App Site Association file.

詳細については、developer.apple.com に掲載されている「Allowing Apps and Websites to Link to Your Content」(アプリおよび Web サイトから自分のコンテンツへのリンクを許可) を参照してください。For more information, see Allowing Apps and Websites to Link to Your Content on developer.apple.com.

AndroidAndroid

Android プラットフォーム上でアプリケーション インデックス作成およびディープ リンクの設定の機能を使用するためには、複数の前提条件を満たす必要があります。On the Android platform, there are a number of prerequisites that must be met to use application indexing and deep linking functionality:

  1. ご利用のアプリケーションのバージョンが Google Play で動作状態にある必要があります。A version of your application must be live on Google Play.
  2. Google の開発者コンソール内で、アプリケーションに対してコンパニオン Web サイトを登録する必要があります。A companion website must be registered against the application in Google's Developer Console. アプリケーションが Web サイトに関連付けられたら、URL にインデックスを付けて Web サイトとアプリケーションの両方で使用できます。これにより、検索結果に提供されるようになります。Once the application is associated with a website, URLs can be indexed that work for both the website and the application, which can then be served in Search results. 詳細については、Google の Web サイト上の「Google 検索での App Indexing」を参照してください。For more information, see App Indexing on Google Search on Google's website.
  3. ご利用のアプリケーションでは、MainActivity クラス上の HTTP URL インテントがサポートされている必要があります。これにより、アプリケーションが応答可能な URL データ スキームの種類がアプリケーション インデックス作成に指示されます。Your application must support HTTP URL intents on the MainActivity class, which tell application indexing what types of URL data schemes the application can respond to. 詳細については、「Configuring the Intent Filter」(インテント フィルタの構成) を参照してください。For more information, see Configuring the Intent Filter.

これらの前提条件が満たされたら、Android プラットフォーム上で Xamarin.Forms アプリケーション インデックス作成およびディープ リンクの設定を使用するために次に示すような追加のセットアップが必要です。Once these prerequisites are met, the following additional setup is required to use Xamarin.Forms application indexing and deep linking on the Android platform:

  1. Xamarin.Forms.AppLinks NuGet パッケージを Android アプリケーション プロジェクトにインストールします。Install the Xamarin.Forms.AppLinks NuGet package into the Android application project.
  2. MainActivity.cs ファイル内に、Xamarin.Forms.Platform.Android.AppLinks 名前空間を使用するための宣言を追加します。In the MainActivity.cs file, add a declaration to use the Xamarin.Forms.Platform.Android.AppLinks namespace.
  3. MainActivity.cs ファイル内に、Firebase 名前空間を使用するための宣言を追加します。In the MainActivity.cs file, add a declaration to use the Firebase namespace.
  4. Web ブラウザーで、Firebase Console を介して新しいプロジェクトを作成します。In a web browser, create a new project via the Firebase Console.
  5. Firebase Console で、ご利用の Android アプリに Firebase を追加し、必要なデータを入力します。In the Firebase Console, add Firebase to your Android app, and enter the required data.
  6. 結果として生成された google-services.json ファイルをダウンロードします。Download the resulting google-services.json file.
  7. google-services.json ファイルを、Android プロジェクトのルート ディレクトリに追加し、そのビルド アクションGoogleServicesJson に設定します。Add the google-services.json file to the root directory of the Android project, and set its Build Action to GoogleServicesJson.
  8. MainActivity.OnCreate オーバーライド内で、Forms.Init(this, bundle) の下に次のコード行を追加します。In the MainActivity.OnCreate override, add the following line of code underneath Forms.Init(this, bundle):
FirebaseApp.InitializeApp(this);
AndroidAppLinks.Init(this);

google-services.json をプロジェクトに追加 (および GoogleServicesJson* ビルド アクションを設定) すると、ビルド プロセスによって、クライアント ID と API キーが抽出され、さらにこれらの資格情報が、生成されたマニフェスト ファイルに追加されます。When google-services.json is added to the project (and the GoogleServicesJson* build action is set), the build process extracts the client ID and API key and then adds these credentials to the generated manifest file.

詳細については、Xamarin ブログでの「Deep Link Content with Xamarin.Forms URL Navigation」 (Xamarin.Forms URL ナビゲーションを使用したディープ リンク コンテンツ) を参照してください。For more information, see Deep Link Content with Xamarin.Forms URL Navigation on the Xamarin blog.

ページのインデックス作成Indexing a Page

ページのインデックスを作成し、それを Google および Spotlight 検索に公開するプロセスは次のとおりです。The process for indexing a page and exposing it to Google and Spotlight search is as follows:

  1. ページのインデックス作成に必要なメタデータを含む AppLinkEntry と、ユーザーが検索結果内のインデックス付けされたコンテンツを選択したときにページに戻るためのディープ リンクを作成します。Create an AppLinkEntry that contains the metadata required to index the page, along with a deep link to return to the page when the user selects the indexed content in search results.
  2. AppLinkEntry インスタンスを登録し、検索できるようにそれにインデックスを付けます。Register the AppLinkEntry instance to index it for searching.

次のコード例では、AppLinkEntry インスタンスを作成する方法について示します。The following code example demonstrates how to create an AppLinkEntry instance:

AppLinkEntry GetAppLink(TodoItem item)
{
    var pageType = GetType().ToString();
    var pageLink = new AppLinkEntry
    {
        Title = item.Name,
        Description = item.Notes,
        AppLinkUri = new Uri($"http://{App.AppName}/{pageType}?id={item.ID}", UriKind.RelativeOrAbsolute),
        IsLinkActive = true,
        Thumbnail = ImageSource.FromFile("monkey.png")
    };

    pageLink.KeyValues.Add("contentType", "TodoItemPage");
    pageLink.KeyValues.Add("appName", App.AppName);
    pageLink.KeyValues.Add("companyName", "Xamarin");

    return pageLink;
}

AppLinkEntry インスタンスには、ページのインデックス作成およびディープ リンクの作成に必要な値が格納された複数のプロパティが含まれています。The AppLinkEntry instance contains a number of properties whose values are required to index the page and create a deep link. TitleDescriptionThumbnail の各プロパティは、検索結果内にインデックス付きのコンテンツが表示された場合にそれを識別するために使用されます。The Title, Description, and Thumbnail properties are used to identify the indexed content when it appears in search results. IsLinkActive プロパティは true に設定されます。これは、インデックス付きのコンテンツが現在表示されていることを示します。The IsLinkActive property is set to true to indicate that the indexed content is currently being viewed. AppLinkUri プロパティは、現在のページに戻るため、および現在の TodoItem を表示するために必要な情報が含まれる Uri です。The AppLinkUri property is a Uri that contains the information required to return to the current page and display the current TodoItem. 次の例には、サンプル アプリケーションの Uri 例が示されています。The following example shows an example Uri for the sample application:

http://deeplinking/DeepLinking.TodoItemPage?id=2

この Uri には、deeplinking アプリを起動し、DeepLinking.TodoItemPage に移動し、ID が 2 である TodoItem を表示するために必要な情報がすべて含まれています。This Uri contains all the information required to launch the deeplinking app, navigate to the DeepLinking.TodoItemPage, and display the TodoItem that has an ID of 2.

インデックス作成のためのコンテンツの登録Registering Content for Indexing

AppLinkEntry インスタンスが作成されたら、検索結果に表示されるようにするためのインデックス作成に備えてそれを登録する必要があります。Once an AppLinkEntry instance has been created, it must be registered for indexing to appear in search results. これは、次のコード例に示すように、RegisterLink メソッドを使用して行われます。This is accomplished with the RegisterLink method, as demonstrated in the following code example:

Application.Current.AppLinks.RegisterLink (appLink);

これにより、AppLinkEntry インスタンスがアプリケーションの AppLinks コレクションに追加されます。This adds the AppLinkEntry instance to the application's AppLinks collection.

注意

RegisterLink メソッドを使用することで、インデックスが付けられたページのコンテンツを更新することもできます。The RegisterLink method can also be used to update the content that's been indexed for a page.

インデックス作成のために AppLinkEntry インスタンスが登録されると、それを検索結果に表示できるようになります。Once an AppLinkEntry instance has been registered for indexing, it can appear in search results. 次のスクリーン ショットは、iOS プラットフォームでの検索結果に表示されているインデックス付きコンテンツの例です。The following screenshot shows indexed content appearing in search results on the iOS platform:

インデックス付きコンテンツの登録を解除するDe-registering Indexed Content

DeregisterLink メソッドは、次のコード例に示すように、検索結果からインデックス付けされたコンテンツを削除するために使用されます。The DeregisterLink method is used to remove indexed content from search results, as demonstrated in the following code example:

Application.Current.AppLinks.DeregisterLink (appLink);

これにより、アプリケーションの AppLinks コレクションから AppLinkEntry インスタンスが削除されます。This removes the AppLinkEntry instance from the application's AppLinks collection.

注意

Android 上では、インデックス付けされたコンテンツを検索結果から削除することはできません。On Android it's not possible to remove indexed content from search results.

インデックス付きコンテンツが検索結果に表示され、それをユーザーが選択すると、インデックス付きコンテンツに含まれている Uri を処理するための要求がアプリケーションの App クラスによって受信されます。When indexed content appears in search results and is selected by a user, the App class for the application will receive a request to handle the Uri contained in the indexed content. この要求は、次のコード例に示すように、OnAppLinkRequestReceived オーバーライド内で処理できます。This request can be processed in the OnAppLinkRequestReceived override, as demonstrated in the following code example:

public class App : Application
{
    ...
    protected override async void OnAppLinkRequestReceived(Uri uri)
    {
        string appDomain = "http://" + App.AppName.ToLowerInvariant() + "/";
        if (!uri.ToString().ToLowerInvariant().StartsWith(appDomain, StringComparison.Ordinal))
            return;

        string pageUrl = uri.ToString().Replace(appDomain, string.Empty).Trim();
        var parts = pageUrl.Split('?');
        string page = parts[0];
        string pageParameter = parts[1].Replace("id=", string.Empty);

        var formsPage = Activator.CreateInstance(Type.GetType(page));
        var todoItemPage = formsPage as TodoItemPage;
        if (todoItemPage != null)
        {
            var todoItem = await App.Database.GetItemAsync(int.Parse(pageParameter));
            todoItemPage.BindingContext = todoItem;
            await MainPage.Navigation.PushAsync(formsPage as Page);
        }
        base.OnAppLinkRequestReceived(uri);
    }
}

受信した Uri を解析して移動先のページおよびページに渡すパラメーターを特定する前に、その Uri がアプリケーションを対象とするものかどうかが、OnAppLinkRequestReceived メソッドによって確認されます。 移動先のページのインスタンスが作成され、ページ パラメーターによって表現される TodoItem が取得されます。 次に、移動先であるページの BindingContextTodoItem に設定されます。 これにより、PushAsync メソッドによって TodoItemPage が表示されると、ディープ リンクに含まれている ID を持つ TodoItem が確実に表示されます。This ensures that when the TodoItemPage is displayed by the PushAsync method, it will be showing the TodoItem whose ID is contained in the deep link.

Search インデックス処理でコンテンツを利用できるようにするMaking Content Available for Search Indexing

ディープ リンクによって表されるページが表示されるたびに、AppLinkEntry.IsLinkActive プロパティを true に設定することができます。Each time the page represented by a deep link is displayed, the AppLinkEntry.IsLinkActive property can be set to true. iOS と Android では、これによって、Search インデックス処理で AppLinkEntry インスタンスが有効になります。また、iOS の場合のみ、ハンドオフに対しても AppLinkEntry インスタンスが有効になります。On iOS and Android this makes the AppLinkEntry instance available for search indexing, and on iOS only, it also makes the AppLinkEntry instance available for Handoff. ハンドオフの詳細については、ハンドオフの概要に関するページを参照してください。For more information about Handoff, see Introduction to Handoff.

Page.OnAppearing オーバーライド内で、AppLinkEntry.IsLinkActive プロパティを true に設定するコード例を次に示します。The following code example demonstrates setting the AppLinkEntry.IsLinkActive property to true in the Page.OnAppearing override:

protected override void OnAppearing()
{
    appLink = GetAppLink(BindingContext as TodoItem);
    if (appLink != null)
    {
        appLink.IsLinkActive = true;
    }
}

同様に、ディープ リンクによって表されるページから離れるときに、AppLinkEntry.IsLinkActive プロパティを false に設定することができます。Similarly, when the page represented by a deep link is navigated away from, the AppLinkEntry.IsLinkActive property can be set to false. iOS と Android では、これによって、Search インデックス処理に対する AppLinkEntry インスタンスの公開が停止されます。また、iOS の場合のみ、ハンドオフに対する AppLinkEntry インスタンスの公開が停止されます。On iOS and Android, this stops the AppLinkEntry instance being advertised for search indexing, and on iOS only, it also stops advertising the AppLinkEntry instance for Handoff. これは、次のコード例に示すように、Page.OnDisappearing オーバーライド内で達成できます。This can be accomplished in the Page.OnDisappearing override, as demonstrated in the following code example:

protected override void OnDisappearing()
{
    if (appLink != null)
    {
        appLink.IsLinkActive = false;
    }
}

ハンドオフにデータを提供するProviding Data to Handoff

iOS 上では、ページのインデックスを作成するとき、アプリケーション固有のデータを格納することができます。On iOS, application-specific data can be stored when indexing the page. これを実現するには、KeyValues コレクションにデータを追加します。これは、ハンドオフに使用されるキーと値のペアを格納するための Dictionary<string, string> です。This is achieved by adding data to the KeyValues collection, which is a Dictionary<string, string> for storing key-value pairs that are used in Handoff. ハンドオフは、ユーザーが自分のデバイスのいずれかでアクティビティを開始し、自分の別のデバイス (ユーザーの iCloud アカウントによって識別される) でそのアクティビティを継続するための方法です。Handoff is a way for the user to start an activity on one of their devices and continue that activity on another of their devices (as identified by the user's iCloud account). 次のコードは、アプリケーション固有のキーと値のペアを格納する例です。The following code shows an example of storing application-specific key-value pairs:

var pageLink = new AppLinkEntry
{
    ...
};
pageLink.KeyValues.Add("appName", App.AppName);
pageLink.KeyValues.Add("companyName", "Xamarin");

KeyValues コレクションに格納された値は、インデックス付きページのメタデータに格納され、ディープ リンクが含まれている検索結果をユーザーがタップしたとき (または、別のサインイン デバイス上のコンテンツを表示するためにハンドオフが使用されたとき) に復元されます。Values stored in the KeyValues collection will be stored in the metadata for the indexed page, and will be restored when the user taps on a search result that contains a deep link (or when Handoff is used to view the content on another signed-in device).

さらに、次のキーの値を指定できます。In addition, values for the following keys can be specified:

  • contentType – インデックス付きのコンテンツの uniform 型識別子を指定する stringcontentType – a string that specifies the uniform type identifier of the indexed content. この値に対して使用が推奨される規約は、インデックス付きコンテンツが含まれるページの型名です。The recommended convention to use for this value is the type name of the page containing the indexed content.
  • associatedWebPage – Web 上でインデックス付きコンテンツも表示できる場合、またはアプリケーションによって Safari のディープ リンクがサポートされている場合にアクセスする Web ページを表す stringassociatedWebPage – a string that represents the web page to visit if the indexed content can also be viewed on the web, or if the application supports Safari's deep links.
  • shouldAddToPublicIndextrue または false のいずれか string。これにより、インデックス付きコンテンツを Apple のパブリック クラウド インデックスに追加するかどうかが制御されます。それは自分の iOS デバイス上にアプリケーションをインストールしていないユーザーに提供することができます。shouldAddToPublicIndex – a string of either true or false that controls whether or not to add the indexed content to Apple's public cloud index, which can then be presented to users who haven't installed the application on their iOS device. ただし、パブリック インデックス作成に対してコンテンツが設定されているからといって、Apple のパブリック クラウド インデックスにそれが自動的に追加されることを意味するものではありません。However, just because content has been set for public indexing, it doesn't mean that it will be automatically added to Apple's public cloud index. 詳細については、パブリック Search インデックス処理に関するページを参照してください。For more information, see Public Search Indexing. 個人データを KeyValues コレクションに追加する場合は、このキーを false に設定する必要があることに注意してください。Note that this key should be set to false when adding personal data to the KeyValues collection.

注意

KeyValues コレクションは、Android プラットフォームでは使用されません。The KeyValues collection isn't used on the Android platform.

ハンドオフの詳細については、ハンドオフの概要に関するページを参照してください。For more information about Handoff, see Introduction to Handoff.

まとめSummary

この記事では、アプリケーション インデックス作成とディープ リンクの設定を使用して、Xamarin.Forms アプリケーションのコンテンツを iOS および Android のデバイス上で検索できるようにする方法について説明しました。This article explained how to use application indexing and deep linking to make Xamarin.Forms application content searchable on iOS and Android devices. アプリケーション インデックス作成を使用すると、何度か使用した後に忘れてしまいそうなアプリケーションを検索結果に表示することで、関連性を保つことができます。Application indexing allows applications to stay relevant by appearing in search results that would otherwise be forgotten about after a few uses.