Indexação de aplicativo e vinculação profunda

Baixar exemplo Baixar o exemplo

Xamarin.Forms A indexação de aplicativos e a vinculação profunda fornecem uma API para publicar metadados para indexação de aplicativos à medida que os usuários navegam pelos aplicativos. O conteúdo indexado pode ser pesquisado no Spotlight Search, na Pesquisa Google ou em uma pesquisa na Web. Tocar em um resultado de pesquisa que contém um link profundo acionará um evento que poderá ser tratado por um aplicativo. Isso normalmente é usado para navegar até a página referenciada do link profundo.

Este aplicativo de exemplo demonstra um aplicativo de Lista de tarefas em que os dados são armazenados em um banco de dados local do SQLite, como mostrado nas seguintes capturas de tela:

Aplicativo TodoList

Cada instância TodoItem criada pelo usuário é indexada. Então, a pesquisa específica da plataforma pode ser usada para localizar dados indexados do aplicativo. Quando o usuário toca em um item de resultado de pesquisa para o aplicativo, o aplicativo é iniciado, o TodoItemPage é navegada e o TodoItem referenciado do link profundo é exibido.

Para obter mais informações sobre como usar um banco de dados SQLite, consulte Xamarin.Forms Bancos de dados locais.

Observação

Xamarin.Forms A indexação de aplicativos e a funcionalidade de vinculação profunda só estão disponíveis nas plataformas iOS e Android e exigem um mínimo de iOS 9 e API 23, respectivamente.

Instalação

As seções a seguir fornecem instruções de configuração adicionais para usar esse recurso nas plataformas Android e iOS.

iOS

Na plataforma iOS, certifique-se de que seu projeto da plataforma iOS defina o arquivo Entitlements.plist como o arquivo de direitos personalizados para assinar o pacote.

Para usar Links Universais do iOS:

  1. Adicione um direito de Domínios Associados ao seu aplicativo, com a chave applinks, incluindo todos os domínios que seu aplicativo dará suporte.
  2. Adicione um arquivo de Associação de Site do Aplicativo da Apple ao seu site.
  3. Adicione a chave applinks ao arquivo de Associação de Site do Aplicativo da Apple.

Para obter mais informações, consulte Permitir que aplicativos e sites se vinculem ao seu conteúdo em developer.apple.com.

Android

Na plataforma Android, há uma série de pré-requisitos que devem ser atendidos para usar a funcionalidade de indexação de aplicativo e vinculação profunda:

  1. Uma versão do seu aplicativo deve estar em tempo real no Google Play.
  2. Um site complementar deve ser registrado com o aplicativo no Console do Desenvolvedor do Google. Depois que o aplicativo é associado a um site, as URLs podem ser indexadas e funcionam para o site e o aplicativo, que pode ser atendido nos resultados da pesquisa. Para obter mais informações, consulte Indexação de apps na Pesquisa Google no site do Google.
  3. Seu aplicativo deve dar suporte a intenções de URL HTTP na classe MainActivity, que informa à indexação de aplicativo quais tipos de esquemas de dados de URL o aplicativo pode responder. Para obter mais informações, consulte Configurar o Filtro de Intenção.

Depois que esses pré-requisitos forem atendidos, a seguinte configuração adicional será necessária para usar Xamarin.Forms a indexação de aplicativos e a vinculação profunda na plataforma Android:

  1. Instale o Xamarin.Forms. AppLinks Pacote NuGet no projeto de aplicativo Android.
  2. No arquivo MainActivity.cs, adicione uma declaração para usar o namespace Xamarin.Forms.Platform.Android.AppLinks.
  3. No arquivo MainActivity.cs, adicione uma declaração para usar o namespace Firebase.
  4. Em um navegador da Web, crie um projeto por meio do Console do Firebase.
  5. No Console do Firebase, adicione o Firebase ao seu aplicativo Android e insira os dados necessários.
  6. Baixe o arquivo google-services.json resultante.
  7. Adicione o arquivo google-services.json ao diretório raiz do projeto do Android e defina sua Ação de Build como GoogleServicesJson.
  8. Na substituição de MainActivity.OnCreate, adicione a seguinte linha de código abaixo de Forms.Init(this, bundle):
FirebaseApp.InitializeApp(this);
AndroidAppLinks.Init(this);

Quando google-services.json é adicionado ao projeto (e a ação de build GoogleServicesJson* é definida), o processo de build extrai a chave de API e a ID do cliente e, em seguida, adiciona essas credenciais ao arquivo de manifesto gerado.

Observação

Neste artigo, os termos links de aplicativo e links profundos são frequentemente usados ​​de forma intercambiável. No entanto, no Android, estes termos têm significados separados. No Android, um link profundo é um filtro de intenção que permite aos usuários inserir diretamente uma atividade específica no aplicativo. Clicar em um link profundo pode abrir uma caixa de diálogo de desambiguidade, que permite ao usuário selecionar um dos vários aplicativos que podem manipular a URL. Um link de aplicativo do Android é um link profundo com base na URL do site, que foi verificada para pertencer ao seu site. Clicar em um link de aplicativo abre seu aplicativo se ele estiver instalado, sem abrir uma caixa de diálogo de desambiguidade.

Para obter mais informações, consulte Conteúdo de link profundo com Xamarin.Forms navegação de URL no blog do Xamarin.

Indexação de uma página

O processo de indexação e exposição de uma página na pesquisa do Google e do Spotlight é da seguinte maneira:

  1. Crie um AppLinkEntry que contenha os metadados necessários para indexar a página juntamente com um link profundo para retornar à página quando o usuário selecionar o conteúdo indexado nos resultados da pesquisa.
  2. Registre a instância AppLinkEntry para indexá-la para a pesquisa.

O exemplo de código a seguir demonstra como criar uma instância 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;
}

A instância AppLinkEntry contém uma série de propriedades cujos valores são necessários para indexar a página e criar um link profundo. As Titlepropriedades , Descriptione Thumbnail são usadas para identificar o conteúdo indexado quando ele aparece nos resultados da pesquisa. A propriedade IsLinkActive é definida como true para indicar que o conteúdo indexado está sendo exibido atualmente. A propriedade AppLinkUri é uma Uri que contém as informações necessárias para retornar à página atual e exibir o TodoItem atual. O exemplo a seguir mostra um Uri de exemplo para o aplicativo de exemplo:

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

Esse Uri contém todas as informações necessárias para iniciar o aplicativo deeplinking. Navegue até DeepLinking.TodoItemPagee exiba o TodoItem que tem um ID de 2.

Registro do conteúdo para indexação

Assim que a instância AppLinkEntry tiver sido criada, ela deverá ser registrada para a indexação aparecer nos resultados da pesquisa. Isso é feito com o método RegisterLink, conforme demonstrado no exemplo de código a seguir:

Application.Current.AppLinks.RegisterLink (appLink);

Isso adiciona a instância AppLinkEntry à coleção AppLinks do aplicativo.

Observação

O método RegisterLink também pode ser usado para atualizar o conteúdo que foi indexado para uma página.

Assim que uma instância AppLinkEntry tiver sido registrada para indexação, ela poderá aparecer nos resultados da pesquisa. A captura de tela a seguir mostra o conteúdo indexado que aparece nos resultados da pesquisa na plataforma iOS:

Conteúdo indexado nos resultados da pesquisa no iOS

Cancelar o registro do conteúdo indexado

O método DeregisterLink é usado para remover o conteúdo indexado dos resultados da pesquisa, conforme demonstrado no exemplo de código a seguir:

Application.Current.AppLinks.DeregisterLink (appLink);

Isso remove a instância AppLinkEntry da coleção AppLinks do aplicativo.

Observação

No Android, não é possível remover o conteúdo indexado dos resultados da pesquisa.

Quando o conteúdo indexado for exibido nos resultados da pesquisa e for selecionado por um usuário, a classe App para o aplicativo receberá uma solicitação para lidar com o Uri contido no conteúdo indexado. Essa solicitação pode ser processada na substituição de OnAppLinkRequestReceived, conforme demonstrado no exemplo de código a seguir:

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

O método OnAppLinkRequestReceived verifica se o Uri recebido destina-se ao aplicativo antes da análise de Uri em uma página que será navegada e do parâmetro que será passado para a página. Uma instância da página que será navegada é criada e o TodoItem representado pelo parâmetro da página é recuperado. O BindingContext da página que será navegada é definido como TodoItem. Isso garante que, quando o TodoItemPage for exibido pelo método PushAsync, ele estará mostrando o TodoItem cujo ID está contido no link profundo.

Disponibilizar o conteúdo disponível para indexação de pesquisa

Sempre que a página representada por um link profundo for exibida, a propriedade AppLinkEntry.IsLinkActive poderá ser definida como true. No iOS e no Android, isso torna a instância AppLinkEntry disponível para a indexação de pesquisa. No iOS, isso também torna a instância AppLinkEntry disponível para entrega. Para obter mais informações sobre a entrega, consulte Introdução à entrega.

O exemplo de código a seguir demonstra a configuração da propriedade AppLinkEntry.IsLinkActive como true na substituição de Page.OnAppearing:

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

Da mesma forma, quando a página representada por um link profundo for retirada da navegação, a propriedade AppLinkEntry.IsLinkActive poderá ser definida como false. No iOS e no Android, isso interrompe a instância AppLinkEntry que está sendo anunciada para indexação de pesquisa. No iOS, isso também interrompe o anúncio da instância AppLinkEntry para entrega. Isso pode ser feito na substituição de Page.OnDisappearing, conforme demonstrado no exemplo de código a seguir:

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

Fornecer dados para entrega

No iOS, os dados específicos do aplicativo podem ser armazenados durante a indexação de página. Isso é feito pela adição de dados para à coleção KeyValues, que é um Dictionary<string, string> para armazenar pares chave-valor que são usados na entrega. A entrega é uma maneira para o usuário iniciar uma atividade em um dos seus dispositivos e continuar essa atividade em outro de seus dispositivos (conforme identificado pela conta do iCloud do usuário). O código a seguir mostra um exemplo de armazenamento de pares chave-valor específicos do aplicativo:

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

Os valores armazenados na coleção KeyValues serão armazenados nos metadados para a página indexada e serão restaurados quando o usuário tocar em um resultado de pesquisa que contém um link profundo (ou quando a entrega for usada para exibir o conteúdo em outro dispositivo conectado).

Além disso, os valores para as seguintes chaves podem ser especificados:

  • contentType – um string que especifica o identificador de tipo uniforme do conteúdo indexado. A convenção recomendada para uso para esse valor é o nome do tipo da página com o conteúdo indexado.
  • associatedWebPage – um string que representa a página da Web a ser visitada se o conteúdo indexado também puder ser exibido na Web ou se o aplicativo der suporte a links profundos do Safari.
  • shouldAddToPublicIndex – um string de true ou false que controla a necessidade de adição de conteúdo indexado ao índice de nuvem pública da Apple, que, em seguida, pode ser apresentado aos usuários que ainda não instalaram o aplicativo em seu dispositivo iOS. No entanto, o conteúdo ter sido definido para indexação pública não significa que ele será automaticamente adicionado ao índice de nuvem pública da Apple. Para obter mais informações, consulte Indexação de pesquisa pública. Observe que essa chave deve ser definida como false ao adicionar dados pessoais à coleção KeyValues.

Observação

A coleção KeyValues não é usada na plataforma Android.

Para obter mais informações sobre a entrega, consulte Introdução à entrega.