Indexação de aplicativo e vinculação profunda
Xamarin.Forms a indexação de aplicativos e o deep linking 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:
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 funcionalidade de indexação de aplicativos e links diretos está disponível apenas nas plataformas iOS e Android e requer 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:
- Adicione um direito de Domínios Associados ao seu aplicativo, com a chave
applinks
, incluindo todos os domínios que seu aplicativo dará suporte. - Adicione um arquivo de Associação de Site do Aplicativo da Apple ao seu site.
- 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:
- Uma versão do seu aplicativo deve estar em tempo real no Google Play.
- 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.
- 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 o deep linking na plataforma Android:
- Instale o Xamarin.Forms. AppLinks NuGet no projeto de aplicativo Android.
- No arquivo MainActivity.cs, adicione uma declaração para usar o namespace
Xamarin.Forms.Platform.Android.AppLinks
. - No arquivo MainActivity.cs, adicione uma declaração para usar o namespace
Firebase
. - Em um navegador da Web, crie um projeto por meio do Console do Firebase.
- No Console do Firebase, adicione o Firebase ao seu aplicativo Android e insira os dados necessários.
- Baixe o arquivo google-services.json resultante.
- Adicione o arquivo google-services.json ao diretório raiz do projeto do Android e defina sua Ação de Build como GoogleServicesJson.
- Na substituição de
MainActivity.OnCreate
, adicione a seguinte linha de código abaixo deForms.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:
- 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. - 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 propriedades Title
, Description
e Thumbnail
são usadas para identificar o conteúdo indexado quando ele for exibido 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.TodoItemPage
e 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:
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.
Responder a um Link Profundo
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
– umstring
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
– umstring
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
– umstring
detrue
oufalse
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 comofalse
ao adicionar dados pessoais à coleçãoKeyValues
.
Observação
A coleção KeyValues
não é usada na plataforma Android.
Para obter mais informações sobre a entrega, consulte Introdução à entrega.