Partager via


Indexation d’applications et liens ciblés

Xamarin.Forms l’indexation des applications et la liaison approfondie fournissent une API pour la publication de métadonnées pour l’indexation des applications lorsque les utilisateurs naviguent dans les applications. Le contenu indexé peut alors être recherché dans Spotlight Search, dans Google Search ou dans une recherche web. Le fait d’appuyer sur un résultat de recherche qui contient un lien ciblé déclenche un événement qui peut être géré par une application et qui est généralement utilisé pour accéder à la page référencée à partir du lien ciblé.

Cet exemple d’application montre une application de liste Todo où les données sont stockées dans une base de données SQLite locale, comme illustré dans les captures d’écran suivantes :

Application TodoList

Chaque instance TodoItem créée par l’utilisateur est indexée. La recherche propre à la plateforme peut ensuite servir à localiser les données indexées de l’application. Quand l’utilisateur appuie sur un élément de résultat de recherche de l’application, l’application démarre, la TodoItemPage est parcourue et le TodoItem référencé à partir du lien ciblé s’affiche.

Pour plus d’informations sur l’utilisation d’une base de données SQLite, consultez Xamarin.Forms Bases de données locales.

Remarque

Xamarin.Forms La fonctionnalité d’indexation et de liaison approfondie des applications est disponible uniquement sur les plateformes iOS et Android, et nécessite un minimum d’iOS 9 et d’API 23 respectivement.

Programme d’installation

Les sections suivantes fournissent des instructions d’installation supplémentaires pour utiliser cette fonctionnalité sur les plateformes iOS et Android.

iOS

Sur la plateforme iOS, vérifiez que votre projet de plateforme iOS définit le fichier Entitlements.plist comme fichier de droits personnalisé pour signer le bundle.

Pour utiliser les liens universels iOS :

  1. Ajoutez un droit Domaines associés à votre application, avec la clé applinks, qui inclut tous les domaines que votre application prendra en charge.
  2. Ajoutez un fichier Apple App Site Association à votre site web.
  3. Ajoutez la clé applinks dans le fichier Apple App Site Association.

Pour plus d’informations, consultez Allowing Apps and Websites to Link to Your Content sur developer.apple.com.

Android

Sur la plateforme Android, vous devez répondre à un nombre de prérequis pour utiliser la fonctionnalité d’indexation d’applications et de liens ciblés :

  1. Une version de votre application doit être publiée sur Google Play.
  2. Un site web d’accompagnement doit être inscrit auprès de l’application dans la console de développeur de Google. Une fois que l’application est associée à un site web, les URL fonctionnant à la fois pour le site web et l’application peuvent être indexées, puis être prises en compte dans les résultats de recherche. Pour plus d’informations, consultez App Indexing on Google Search sur le site web de Google.
  3. Votre application doit prendre en charge les intentions d’URL HTTP sur la classe MainActivity, qui indiquent à l’indexation d’applications les types de schémas de données d’URL auxquels l’application peut répondre. Pour plus d’informations, consultez Configuring the Intent Filter.

Une fois ces conditions préalables remplies, la configuration supplémentaire suivante est nécessaire pour utiliser Xamarin.Forms l’indexation des applications et la liaison approfondie sur la plateforme Android :

  1. Installez le Xamarin.Formsfichier . Package NuGet AppLinks dans le projet d’application Android.
  2. Dans le fichier MainActivity.cs, ajoutez une déclaration pour utiliser l’espace de noms Xamarin.Forms.Platform.Android.AppLinks.
  3. Dans le fichier MainActivity.cs, ajoutez une déclaration pour utiliser l’espace de noms Firebase.
  4. Dans un navigateur web, créez un projet via la console Firebase.
  5. Dans la console Firebase, ajoutez Firebase à votre application Android et entrez les données nécessaires.
  6. Téléchargez le fichier google-services.json qui en résulte.
  7. Ajoutez le fichier google-services.json dans le répertoire racine du projet Android et définissez son Action de génération sur GoogleServicesJson.
  8. Dans l’élément de remplacement MainActivity.OnCreate, ajoutez la ligne suivante de code sous Forms.Init(this, bundle) :
FirebaseApp.InitializeApp(this);
AndroidAppLinks.Init(this);

Une fois que google-services.json est ajouté au projet (et que l’action de génération GoogleServicesJson* est définie), le processus de génération extrait l’ID client et la clé API, puis ajoute ces informations d’identification au fichier manifeste généré.

Remarque

Dans cet article, les termes « lien d’application » et « lien ciblé » sont souvent utilisés de manière interchangeable. Toutefois, ils ont des significations distinctes sur Android : un lien ciblé est un filtre d’intention qui permet aux utilisateurs d’entrer directement une activité spécifique dans l’application. Un lien ciblé peut ouvrir une boîte de dialogue de désambiguïsation, qui permet à l’utilisateur de sélectionner l’une des nombreuses applications capables de gérer l’URL. Un lien d’application Android est un lien ciblé basé sur l’URL de votre site web, et dont l’appartenance à ce site a été vérifiée. Si vous cliquez sur un lien d’application, votre application s’ouvre si elle est installée, sans ouvrir de boîte de dialogue de désambiguïsation.

Pour plus d’informations, consultez Deep Link Content with Xamarin.Forms URL Navigation on the Xamarin blog.

Indexation d’une page

Le processus d’indexation d’une page et son exposition à la recherche Google et Spotlight est le suivant :

  1. Créez un AppLinkEntry qui contient les métadonnées nécessaires pour indexer la page, ainsi qu’un lien ciblé pour revenir à la page quand l’utilisateur sélectionne le contenu indexé dans les résultats de recherche.
  2. Enregistrez l’instance AppLinkEntry afin de l’indexer pour la recherche.

L'exemple de code suivant montre comment créer une instance AppLinkEntry :

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;
}

L’instance AppLinkEntry contient un nombre de propriétés dont les valeurs sont nécessaires pour indexer la page et créer un lien ciblé. Les propriétés Title, Description et Thumbnail sont utilisées pour identifier le contenu indexé quand celui-ci apparaît dans les résultats de recherche. La propriété IsLinkActive est définie avec la valeur true pour indiquer que le contenu indexé est actuellement affiché. La propriété AppLinkUri est un Uri qui contient les informations nécessaires pour revenir à la page active et afficher le TodoItem actuel. L’exemple suivant montre un exemple d’Uri pour l’exemple d’application :

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

Cet Uri contient toutes les informations nécessaires pour lancer l’application deeplinking, parcourir la DeepLinking.TodoItemPage et afficher le TodoItem qui a un ID sur 2.

Enregistrement du contenu pour l’indexation

Une fois qu’une instance AppLinkEntry est créée, elle doit être enregistrée pour l’indexation afin d’apparaître dans les résultats de recherche. La méthode RegisterLink effectue cette opération, comme illustré dans l’exemple de code suivant :

Application.Current.AppLinks.RegisterLink (appLink);

Elle ajoute l’instance AppLinkEntry dans la collection AppLinks de l’application.

Remarque

Vous pouvez aussi utiliser la méthode RegisterLink pour mettre à jour le contenu qui a été indexé pour une page.

Une fois qu’une instance AppLinkEntry a été enregistrée pour l’indexation, elle peut apparaître dans les résultats de recherche. La capture d’écran suivante montre le contenu indexé apparaître dans les résultats de recherche sur la plateforme iOS :

Contenu indexé dans les résultats de recherche sur iOS

Désenregistrement du contenu indexé

La méthode DeregisterLink sert à supprimer le contenu indexé des résultats de recherche, comme illustré dans l’exemple de code suivant :

Application.Current.AppLinks.DeregisterLink (appLink);

Elle supprime l’instance AppLinkEntry de la collection AppLinks de l’application.

Remarque

Sur Android, il n’est pas possible de supprimer le contenu indexé des résultats de recherche.

Quand le contenu indexé apparaît dans les résultats de recherche et est sélectionné par l’utilisateur, la classe App de l’application reçoit une demande pour gérer l’Uri qui se trouve dans le contenu indexé. Cette demande peut être traitée dans l’élément de remplacement OnAppLinkRequestReceived, comme illustré dans l’exemple de code suivant :

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);
    }
}

La méthode OnAppLinkRequestReceived vérifie que l’Uri est destiné à l’application, avant d’analyser l’Uri dans la page à parcourir et le paramètre à passer à la page. Une instance de la page à parcourir est créée et le TodoItem représenté par le paramètre de page est récupéré. Le BindingContext de la page à parcourir est ensuite défini sur le TodoItem. Le but est de garantir que quand la TodoItemPage est affichée par la méthode PushAsync, elle affiche le TodoItem dont l’ID est contenu dans le lien ciblé.

Mise à disposition du contenu pour l’indexation de recherche

Chaque fois que la page représentée par un lien ciblé est affichée, la propriété AppLinkEntry.IsLinkActive peut être définie sur true. Sur iOS et Android, cela rend l’instance AppLinkEntry disponible pour l’indexation de recherche. Sur iOS uniquement, elle rend aussi l’instance AppLinkEntry disponible pour Handoff. Pour plus d’informations sur Handoff, consultez Introduction à Handoff.

L'exemple de code suivant présente l’affectation de la propriété AppLinkEntry.IsLinkActive sur true dans l’élément de remplacement Page.OnAppearing :

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

De même, quand la page représentée par un lien ciblé n’est plus parcourue, la propriété AppLinkEntry.IsLinkActive peut être définie sur false. Sur iOS et Android, l’instance AppLinkEntry n’est plus publiée pour l’indexation de recherche. Sur iOS uniquement, l’instance AppLinkEntry n’est plus non plus publiée pour Handoff. Cette opération peut être effectuée dans l’élément de remplacement Page.OnDisappearing, comme illustré dans l’exemple de code suivant :

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

Ajout de données dans Handoff

Sur iOS, les données spécifiques à l’application peuvent être stockées lors de l’indexation de la page. Pour cela, vous devez ajouter les données à la collection KeyValues, qui est un Dictionary<string, string> permettant de stocker des paires clé-valeur qui sont utilisées dans Handoff. Handoff est un moyen pour l’utilisateur de démarrer une activité sur l’un de ses appareils et de continuer cette activité sur un autre de ses appareils (identifié par le compte iCloud de l’utilisateur). Le code suivant montre un exemple de stockage de paires clé-valeur spécifiques à l’application :

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

Les valeurs stockées dans la collection KeyValues sont stockées dans les métadonnées de la page indexée et sont restaurées quand l’utilisateur appuie sur un résultat de recherche qui contient un lien ciblé (ou quand Handoff est utilisé pour afficher le contenu sur un autre appareil connecté).

De plus, vous pouvez spécifier les valeurs des clés suivantes :

  • contentType : string qui spécifie l’URI du contenu indexé. La convention recommandée à utiliser pour cette valeur est le nom de type de la page contenant le contenu indexé.
  • associatedWebPage : string qui représente la page web à visiter si le contenu indexé peut également être affiché sur le web, ou si l’application prend en charge les liens ciblés de Safari.
  • shouldAddToPublicIndex : stringtrue ou false qui contrôle s’il faut ou non ajouter le contenu indexé dans l’index du cloud public d’Apple, qui peut après être présenté aux utilisateurs qui n’ont pas installé l’application sur leur appareil iOS. Toutefois, ce n’est pas parce que le contenu a été défini pour l’indexation publique que cela signifie qu’il sera ajouté automatiquement à l’index du cloud public d’Apple. Pour plus d’informations, consultez Indexation de la recherche publique. Notez que cette clé doit être définie sur false quand vous ajoutez des données personnelles à la collection KeyValues.

Remarque

La collection KeyValues n’est pas utilisée sur la plateforme Android.

Pour plus d’informations sur Handoff, consultez Introduction à Handoff.