Indexación de la aplicación y vinculación en profundidad

Ejemplo de descarga Descarga del ejemplo

La indexación de la aplicación y la vinculación en profundidad de Xamarin.Forms proporcionan una API para la publicación de metadatos y la indexación de las aplicaciones a medida que los usuarios navegan por ellas. Posteriormente, el contenido indexado se puede buscar en una búsqueda web, de Spotlight o de Google. Al pulsar en un resultado de la búsqueda que contenga un vínculo profundo, se desencadenará un evento que normalmente se usa para navegar a la página a la que se hace referencia desde el vínculo profundo y que puede controlarse mediante una aplicación.

La aplicación de ejemplo muestra una aplicación de lista de tareas pendientes en la que los datos se almacenan en una base de datos SQLite local, tal como aparece en las siguientes capturas de pantalla:

Aplicación TodoList

Se indexan todas las instancias del elemento TodoItem que crea el usuario. A continuación, se puede usar una búsqueda específica de la plataforma para localizar los datos indexados de la aplicación. Cuando el usuario pulsa un resultado de la búsqueda de la aplicación, esta se inicia, se navega al elemento TodoItemPage y se muestra el elemento TodoItem al que se hace referencia desde el vínculo profundo.

Para obtener más información sobre el uso de una base de datos de SQLite, vea Xamarin.Forms Local Databases .

Nota:

La función de indexación de la aplicación y vinculación en profundidad de Xamarin.Forms solo está disponible en las plataformas iOS y Android y necesita como mínimo iOS 9 y API 23, respectivamente.

Programa de instalación

En las siguientes secciones se proporcionan las instrucciones de instalación adicionales para usar esta característica en las plataformas iOS y Android.

iOS

En la plataforma iOS, asegúrese de que el proyecto de plataforma de iOS establezca el archivo Entitlements.plist como de derechos personalizados para firmar el conjunto.

Para usar vínculos universales de iOS, realice lo siguiente:

  1. Agregue un derecho de dominios asociados a la aplicación con la clave applinks, incluidos todos los dominios que admitirá la aplicación.
  2. Agregue un archivo de asociación de sitios de la aplicación de Apple a su sitio web.
  3. Agregue la clave applinks al archivo de asociación de sitios de la aplicación de Apple.

Para obtener más información, vea Allowing Apps and Websites to Link to Your Content (Permitir la vinculación de contenido a aplicaciones y sitios web) en developer.apple.com.

Android

En la plataforma Android, se deben cumplir los siguientes requisitos previos para usar la funcionalidad de la indexación de la aplicación y de la vinculación en profundidad:

  1. Es necesario tener una versión de la aplicación publicada en Google Play.
  2. Es necesario haber registrado un sitio web complementario para la aplicación en la consola del desarrollador de Google. Una vez que la aplicación esté asociada a un sitio web, las direcciones URL se pueden indexar de forma que funcionen tanto para el sitio web como para la aplicación. De este modo, podrán aparecer después en los resultados de la búsqueda. Para obtener más información, vea Indexar aplicaciones en la Búsqueda de Google en el sitio web de Google.
  3. La aplicación debe admitir las intenciones de dirección URL HTTP en la clase MainActivity, que indican a la indexación de la aplicación los tipos de esquemas de datos de direcciones URL a los que esta puede dar respuesta. Para obtener más información, vea Configuración del filtro de intención.

Una vez cumplidos estos requisitos previos, para usar la indexación de la aplicación y la vinculación en profundidad de Xamarin.Forms en la plataforma Android es necesaria la siguiente configuración adicional:

  1. Instale xamarin.forms. AppLinks/" data-linktype="external">Xamarin.Forms . AppLinks NuGet paquete en el proyecto de aplicación android.
  2. En el archivo MainActivity.cs, agregue una declaración para usar el espacio de nombres .
  3. En el archivo MainActivity.cs, agregue una declaración para usar el espacio de nombres .
  4. En un explorador web, cree un nuevo proyecto con la consola Firebase.
  5. En la consola Firebase, agregue Firebase a la aplicación Android y escriba los datos necesarios.
  6. Descargue el archivo google-services.json resultante.
  7. Agregue el archivo google-services.json al directorio raíz del proyecto de Android y establezca el valor Acción de compilación en GoogleServicesJson.
  8. En la invalidación del elemento MainActivity.OnCreate, agregue la siguiente línea de código debajo de Forms.Init(this, bundle):
FirebaseApp.InitializeApp(this);
AndroidAppLinks.Init(this);

Al agregar google-services.json al proyecto (y al establecer la acción de compilación GoogleServicesJson\*), el proceso de compilación extraerá la clave de API y el id. de cliente. A continuación, las credenciales se agregarán al archivo de manifiesto generado.

Nota:

En este artículo, los términos vínculos de aplicación y vínculos profundos suelen usarse indistintamente. Sin embargo, en Android estos términos tienen significados diferentes. En Android, un vínculo profundo es un filtro de intención que permite a los usuarios especificar directamente una actividad concreta en la aplicación. Al hacer clic en un vínculo profundo se puede abrir un cuadro de diálogo de desambiguación, que permite al usuario seleccionar una de las distintas aplicaciones que pueden controlar la dirección URL. Un vínculo de aplicación de Android es un vínculo profundo basado en la dirección URL de su sitio web, que se ha verificado que pertenece al sitio web. Al hacer clic en un vínculo de aplicación, se abre la aplicación si está instalada, sin que se abra un cuadro de diálogo de desambiguación.

Para obtener más información, consulte Deep Link Content with Xamarin.Forms URL Navigation en el blog de Xamarin.

Indexación de una página

El proceso de indexación de una página y de exposición en una búsqueda de Spotlight y Google es el que sigue:

  1. Cree un elemento AppLinkEntry que contenga los metadatos necesarios para indexar la página y un vínculo profundo para volver a ella cuando el usuario seleccione el contenido indexado en los resultados de la búsqueda.
  2. Registre la instancia AppLinkEntry con el fin de indexarla para la búsqueda.

En el siguiente ejemplo de código se muestra cómo crear una instancia 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;
}

La instancia AppLinkEntry contiene un número de propiedades cuyos valores son necesarios para indexar la página y crear un vínculo profundo. Las propiedades TitleTitle data-linktype="absolute-path">, Xamarin_Forms _IAppLinkEntry_Description" data-linktype="absolute-path">Description y Xamarin_Forms _IAppLinkEntry_Thumbnail" data-linktype="absolute-path">Thumbnail se usan para identificar el contenido indexado cuando aparece en los resultados de la búsqueda. _IAppLinkEntry_Title Xamarin_Forms La Xamarin_Forms _IAppLinkEntry_IsLinkActive" data-linktype="absolute-path">se establece en para indicar que el contenido indexado se está IsLinkActivetrue viendo actualmente. La propiedad Xamarin_Forms _IAppLinkEntry_AppLinkUri" data-linktype="absolute-path">es una que contiene la información necesaria para volver a la página actual y mostrar el AppLinkUriUriTodoItem actual. A continuación encontrará un elemento Uri de muestra para la aplicación de ejemplo:

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

Este elemento Uri contiene toda la información necesaria para iniciar la aplicación deeplinking, navegar a DeepLinking.TodoItemPage y mostrar TodoItem, que tiene un valor ID de 2.

Registro del contenido para la indexación

Una vez que la instancia AppLinkEntry se ha creado, esta se debe registrar para la indexación con el fin de que aparezca en los resultados de la búsqueda. Esto se logra con el método Xamarin_Forms _IAppLinks_RegisterLink_ Xamarin_Forms _IAppLinkEntry_" data-linktype="absolute-path">, como se muestra en el ejemplo de código RegisterLink siguiente:

Application.Current.AppLinks.RegisterLink (appLink);

Esto agrega la instancia a la colección de Xamarin_Forms AppLinkEntryAppLinkEntry _Application_AppLinks" data-linktype="absolute-path">AppLinks aplicación.

Nota:

El método RegisterLink también se puede utilizar para actualizar el contenido que se ha indexado para una página.

Una vez que la instancia AppLinkEntry se ha registrado para la indexación, esta puede aparecer en los resultados de la búsqueda. La siguiente captura de pantalla muestra el contenido indexado que aparece en los resultados de la búsqueda en la plataforma iOS:

Contenido indexado en los resultados de la búsqueda en iOS

Anulación del registro del contenido indexado

El Xamarin_Forms _IAppLinks_DeregisterLink_ método Xamarin_Forms _IAppLinkEntry_" data-linktype="absolute-path">se usa para quitar contenido indexado de los resultados de la DeregisterLink búsqueda, como se muestra en el ejemplo de código siguiente:

Application.Current.AppLinks.DeregisterLink (appLink);

Esto quita la instancia de la colección de Xamarin_Forms AppLinkEntryAppLinkEntry _Application_AppLinks" data-linktype="absolute-path">AppLinks aplicación.

Nota:

En Android no es posible eliminar contenido indexado de los resultados de la búsqueda.

Cuando aparece contenido indexado en los resultados de la búsqueda y un usuario lo selecciona, la clase App de la aplicación recibirá una solicitud para controlar el elemento Uri incluido en dicho contenido indexado. Esta solicitud se puede procesar en Xamarin_Forms _Application_OnAppLinkRequestReceived_System_Uri_" data-linktype="absolute-path">override, como se muestra en el OnAppLinkRequestReceived ejemplo de código siguiente:

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

El método Xamarin_Forms _Application_OnAppLinkRequestReceived_System_Uri_" data-linktype="absolute-path">comprueba que el objeto recibido está pensado para la aplicación, antes de analizar en la página a la que se va a navegar y el parámetro que se va a pasar a OnAppLinkRequestReceivedUriUri la página. Luego, se crea una instancia de la página a la que se navegará y se recupera el elemento TodoItem representado por el parámetro de la página. El Xamarin_Forms _BindableObject_BindingContext" data-linktype="absolute-path">BindingContext de la página a la que se va a navegar se establece en TodoItem . Esto garantiza que cuando el método TodoItemPage Xamarin_Forms TodoItemPage _INavigation_PushAsync_ Xamarin_Forms _Page_" data-linktype="absolute-path">muestre PushAsyncTodoItem el ID objeto cuyo contenido se encuentra en el vínculo profundo.

Disponibilidad del contenido para la indexación de la búsqueda

Cada vez que se muestra la página representada por un vínculo profundo, la propiedad Xamarin_Forms _IAppLinkEntry_IsLinkActive" data-linktype="absolute-path">AppLinkEntry.IsLinkActive se puede establecer en true . En iOS y Android, esto hace que la instancia AppLinkEntry esté disponible para la indexación de la búsqueda y, solo en iOS, también facilita la instancia AppLinkEntry para Handoff. Para obtener más información sobre Handoff, vea la introducción a Handoff.

En el ejemplo de código siguiente se muestra cómo establecer la propiedad Xamarin_Forms _IAppLinkEntry_IsLinkActive" data-linktype="absolute-path">en en la propiedad AppLinkEntry.IsLinkActivetrue Xamarin_Forms AppLinkEntry.IsLinkActive _Page_OnAppearing" data-linktype="absolute-path">Page.OnAppearing override:

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

De forma similar, cuando la página representada por un vínculo profundo se desplaza lejos de , la propiedad data-linktype="absolute-path">de Xamarin_Forms _IAppLinkEntry_IsLinkActive" se puede establecer AppLinkEntry.IsLinkActive en false . En iOS y Android, esto evita que la instancia AppLinkEntry se anuncie en la indexación de la búsqueda y, solo en iOS, también evita anunciar la instancia AppLinkEntry para Handoff. Esto se puede lograr en la invalidación Xamarin_Forms _Page_OnDisappearing" data-linktype="absolute-path">override, como se muestra en el Page.OnDisappearing ejemplo de código siguiente:

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

Envío de datos a Handoff

En iOS, los datos específicos de la aplicación se pueden almacenar al realizar la indexación de la página. Esto se consigue agregando datos a la colección Xamarin_Forms _IAppLinkEntry_KeyValues" data-linktype="absolute-path">, que es para almacenar pares clave-valor que se usan en KeyValuesDictionary<string, string> Handoff. Handoff es una forma que tiene el usuario de iniciar una actividad en uno de sus dispositivos y continuar con ella en otro (de acuerdo con la identificación de la cuenta de iCloud del usuario). El siguiente código muestra un ejemplo de almacenamiento de pares clave-valor específicos de la aplicación:

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

Los valores almacenados en la colección Xamarin_Forms _IAppLinkEntry_KeyValues" data-linktype="absolute-path">se almacenarán en los metadatos de la página indizada y se restaurarán cuando el usuario pulse en un resultado de búsqueda que contenga un vínculo profundo (o cuando se usa Handoff para ver el contenido en otro dispositivo con sesión KeyValues firmada).

Además, se pueden especificar valores para las siguientes claves:

  • contentType: string que especifica el identificador de tipo uniforme del contenido indexado. La convención que se recomienda usar para este valor es el nombre del tipo de la página que contiene el contenido indexado.
  • associatedWebPage: string que representa la página web que se va a visitar si el contenido indexado también se puede ver en la Web, o bien si la aplicación admite vínculos profundos de Safari.
  • shouldAddToPublicIndex: string de true o false que controla si se debe agregar el contenido indexado al índice de la nube pública de Apple y que, posteriormente, se puede presentar a los usuarios que no hayan instalado la aplicación en su dispositivo iOS. Sin embargo, el hecho de que el contenido se haya establecido para la indexación pública no significa que se agregue automáticamente al índice de la nube pública de Apple. Para obtener más información, vea Indexación de búsqueda pública. Tenga en cuenta que esta clave debe establecerse en al agregar datos personales a la colección false Xamarin_Forms false _IAppLinkEntry_KeyValues" data-linktype="absolute-path">. KeyValues

Nota:

La colección KeyValues no se usa en la plataforma Android.

Para obtener más información sobre Handoff, vea la introducción a Handoff.