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 :
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 :
- Ajoutez un droit Domaines associés à votre application, avec la clé
applinks
, qui inclut tous les domaines que votre application prendra en charge. - Ajoutez un fichier Apple App Site Association à votre site web.
- 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 :
- Une version de votre application doit être publiée sur Google Play.
- 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.
- 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 :
- Installez le Xamarin.Formsfichier . Package NuGet AppLinks dans le projet d’application Android.
- Dans le fichier MainActivity.cs, ajoutez une déclaration pour utiliser l’espace de noms
Xamarin.Forms.Platform.Android.AppLinks
. - Dans le fichier MainActivity.cs, ajoutez une déclaration pour utiliser l’espace de noms
Firebase
. - Dans un navigateur web, créez un projet via la console Firebase.
- Dans la console Firebase, ajoutez Firebase à votre application Android et entrez les données nécessaires.
- Téléchargez le fichier google-services.json qui en résulte.
- 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.
- Dans l’élément de remplacement
MainActivity.OnCreate
, ajoutez la ligne suivante de code sousForms.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 :
- 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. - 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 :
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.
Réponse à un lien ciblé
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
:string
true
oufalse
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 surfalse
quand vous ajoutez des données personnelles à la collectionKeyValues
.
Remarque
La collection KeyValues
n’est pas utilisée sur la plateforme Android.
Pour plus d’informations sur Handoff, consultez Introduction à Handoff.