Indicizzazione e deep linking delle applicazioni
Xamarin.Forms L'indicizzazione e il deep linking dell'applicazione forniscono un'API per la pubblicazione di metadati per l'indicizzazione delle applicazioni mentre gli utenti passano attraverso le applicazioni. Il contenuto indicizzato può quindi essere cercato nella ricerca Spotlight, in Google Search o in una ricerca Web. Quando si tocca un risultato di ricerca che contiene un collegamento diretto verrà generato un evento che può essere gestito da un'applicazione e viene generalmente usato per passare alla pagina a cui fa riferimento il collegamento diretto.
L'applicazione di esempio è una dimostrazione di un'applicazione di tipo Elenco attività, in cui i dati vengono archiviati in un database di SQLite locale, come illustrato negli screenshot seguenti:
Ogni istanza di TodoItem
creata dall'utente viene indicizzata. È quindi possibile usare la funzionalità di ricerca specifica della piattaforma per individuare dati indicizzati dall'applicazione. Quando l'utente tocca un elemento nei risultati della ricerca per l'applicazione, l'applicazione viene avviata, si passa a TodoItemPage
e viene visualizzato l'elemento TodoItem
a cui fa riferimento il collegamento diretto.
Per altre informazioni sull'uso di un database SQLite, vedere Xamarin.Forms Database locali.
Nota
Xamarin.Forms La funzionalità di indicizzazione e deep linking delle applicazioni è disponibile solo nelle piattaforme iOS e Android e richiede almeno iOS 9 e API 23.
Attrezzaggio
Le sezioni seguenti includono eventuali istruzioni di configurazione aggiuntive per l'uso di questa funzionalità nelle piattaforme iOS e Android.
iOS
Nella piattaforma iOS, assicurarsi che il progetto di piattaforma iOS imposti il file entitlements.plist come file di entitlement personalizzati per la firma del bundle.
Per usare i collegamenti universali iOS:
- Aggiungere un entitlement Domini associati all'app, con la chiave
applinks
, includendo tutti i domini che saranno supportati dall'app. - Aggiungere un file di associazione del sito dell'app Apple nel sito Web.
- Aggiungere la chiave
applinks
al file di associazione del sito dell'app Apple.
Per altre informazioni, vedere Allowing Apps and Websites to Link to Your Content (Consentire il collegamento a contenuto personalizzato da app e siti Web) su developer.apple.com.
Android
Nella piattaforma Android esistono vari prerequisiti che devono essere soddisfatti per l'uso della funzionalità di indicizzazione e deep linking delle applicazioni:
- Una versione dell'applicazione deve essere pubblicata in Google Play.
- Deve essere registrato un sito Web associato per l'applicazione nella console per sviluppatori di Google. Dopo aver associato l'applicazione a un sito Web, è possibile indicizzare gli URL che vengono usati sia per il sito Web che per l'applicazione, che possono quindi essere resi disponibili nei risultati della ricerca. Per altre informazioni, vedere Indicizzazione delle app nella Ricerca Google nel sito Web di Google.
- L'applicazione deve supportare gli Intent URL HTTP nella classe
MainActivity
, che indicano all'indicizzazione delle applicazioni i tipi di schemi di dati URL a cui può rispondere l'applicazione. Per altre informazioni, vedere Configuring the Intent Filter (Configurazione del filtro Intent).
Dopo aver soddisfatto questi prerequisiti, è necessaria la configurazione aggiuntiva seguente per usare Xamarin.Forms l'indicizzazione e il deep linking delle applicazioni nella piattaforma Android:
- Installare . Xamarin.Forms AppLinks Pacchetto NuGet nel progetto di applicazione Android.
- Nel file MainActivity.cs aggiungere una dichiarazione per usare lo spazio dei nomi
Xamarin.Forms.Platform.Android.AppLinks
. - Nel file MainActivity.cs aggiungere una dichiarazione per usare lo spazio dei nomi
Firebase
. - In un Web browser, creare un nuovo progetto tramite la console Firebase.
- Nella console Firebase aggiungere Firebase all'app Android e immettere i dati richiesti.
- Scaricare il file google-services.json risultante.
- Aggiungere il file google-services.json nella directory radice del progetto Android e impostare Azione compilazione su GoogleServicesJson.
- Nell'override
MainActivity.OnCreate
aggiungere la riga di codice seguente sottoForms.Init(this, bundle)
:
FirebaseApp.InitializeApp(this);
AndroidAppLinks.Init(this);
Quando si aggiunge google-services.json al progetto (e si imposta l'azione di compilazione GoogleServicesJson\*), il processo di compilazione estrae l'ID client e la chiave API, quindi aggiunge queste credenziali al file manifesto generato.
Nota
In questo articolo i termini collegamenti alle applicazioni e collegamenti diretti vengono spesso usati in modo intercambiabile. Tuttavia, in Android questi termini hanno significati distinti. In Android un collegamento diretto è un filtro Intent che consente agli utenti di accedere direttamente a un'attività specifica nell'app. Se si fa clic su un collegamento diretto è possibile che si apra una finestra di dialogo di disambiguazione, che consente all'utente di selezionare una delle app in grado di gestire l'URL. Un collegamento all'app Android è un collegamento diretto basato sull'URL del sito Web, che è stato verificato per l'appartenenza al sito Web. Se si fa clic su un collegamento all'app, se installata l'app si apre senza che venga aperta una finestra di dialogo di disambiguazione.
Per altre informazioni, vedere Deep Link Content with Xamarin.Forms URL Navigation nel blog di Xamarin.
Indicizzazione di una pagina
Il processo per l'indicizzazione di una pagina e la relativa esposizione per la ricerca Google e Spotlight è il seguente:
- Creare un elemento
AppLinkEntry
che contiene i metadati necessari per indicizzare la pagina, oltre a un collegamento diretto per tornare alla pagina quando l'utente seleziona il contenuto indicizzato nei risultati della ricerca. - Registrare l'istanza di
AppLinkEntry
per indicizzarla per la ricerca.
L'esempio di codice seguente illustra come creare un'istanza di 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'istanza di AppLinkEntry
contiene varie di proprietà i cui valori sono necessari per indicizzare la pagina e creare un collegamento diretto. Le proprietà Title
, Description
e Thumbnail
vengono usate per identificare il contenuto indicizzato quando viene visualizzato nei risultati della ricerca. La proprietà IsLinkActive
viene impostata su true
per indicare che il contenuto indicizzato è attualmente visualizzato. La proprietà AppLinkUri
è un Uri
che contiene le informazioni necessarie per tornare alla pagina corrente e visualizzare l'elemento TodoItem
corrente. L'esempio seguente mostra un Uri
di esempio per l'applicazione di esempio:
http://deeplinking/DeepLinking.TodoItemPage?id=2
Questo Uri
contiene tutte le informazioni necessarie per avviare l'app deeplinking
, passare a DeepLinking.TodoItemPage
e visualizzare l'elemento TodoItem
con ID
2.
Registrazione del contenuto per l'indicizzazione
Dopo aver creato un'istanza di AppLinkEntry
, è necessario registrarla per l'indicizzazione per fare in modo che compaia nei risultati della ricerca. Questa operazione viene eseguita con il metodo RegisterLink
, come illustrato nell'esempio di codice seguente:
Application.Current.AppLinks.RegisterLink (appLink);
Questo codice aggiunge l'istanza di AppLinkEntry
alla raccolta AppLinks
dell'applicazione.
Nota
Il metodo RegisterLink
può essere usato anche per aggiornare il contenuto che è stato indicizzato per una pagina.
Dopo la registrazione per l'indicizzazione, un'istanza di AppLinkEntry
può essere visualizzata nei risultati della ricerca. Lo screenshot seguente mostra il contenuto indicizzato visualizzato nei risultati della ricerca nella piattaforma iOS:
Annullamento della registrazione di contenuto indicizzato
Il metodo DeregisterLink
viene usato per rimuovere il contenuto indicizzato dai risultati della ricerca, come illustrato nell'esempio di codice seguente:
Application.Current.AppLinks.DeregisterLink (appLink);
Questo codice rimuove l'istanza di AppLinkEntry
dalla raccolta AppLinks
dell'applicazione.
Nota
In Android non è possibile rimuovere contenuto indicizzato dai risultati della ricerca.
Risposta a un collegamento diretto
Quando il contenuto indicizzato viene visualizzato nei risultati della ricerca e viene selezionato da un utente, la classe App
per l'applicazione riceverà una richiesta per gestire l'Uri
contenuto nel contenuto indicizzato. Questa richiesta può essere elaborata nell'override OnAppLinkRequestReceived
, come illustrato nell'esempio di codice seguente:
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);
}
}
Il metodo OnAppLinkRequestReceived
controlla che l'Uri
ricevuto sia destinato all'applicazione, prima di analizzare l'Uri
nella pagina di destinazione dello spostamento e il parametro da passare alla pagina. Viene creata un'istanza della pagina di destinazione e viene recuperato l'elemento TodoItem
rappresentato dal parametro della pagina. Il BindingContext
della pagina di destinazione viene quindi impostato sull'elemento TodoItem
. Ciò garantisce che, quando la TodoItemPage
viene visualizzata dal metodo PushAsync
, visualizzi l'elemento TodoItem
il cui ID
è contenuto nel collegamento diretto.
Rendere il contenuto disponibile per l'indicizzazione per la ricerca
Ogni volta che la pagina rappresentata da un collegamento diretto viene visualizzata, la proprietà AppLinkEntry.IsLinkActive
può essere impostata su true
. In iOS e Android, in questo modo l'istanza di AppLinkEntry
viene resa disponibile per l'indicizzazione per ricerca e, solo in iOS, l'istanza di AppLinkEntry
diventa anche disponibile per Handoff. Per altre informazioni su Handoff, vedere Introduction to Handoff (Introduzione a Handoff).
L'esempio di codice seguente illustra l'impostazione della proprietà AppLinkEntry.IsLinkActive
su true
nell'override Page.OnAppearing
:
protected override void OnAppearing()
{
appLink = GetAppLink(BindingContext as TodoItem);
if (appLink != null)
{
appLink.IsLinkActive = true;
}
}
In modo analogo, quando si esce dalla pagina rappresentata da un collegamento diretto, la proprietà AppLinkEntry.IsLinkActive
può essere impostata su false
. In iOS e Android, in questo modo l'istanza di AppLinkEntry
non viene più annunciata per l'indicizzazione per la ricerca e, solo in iOS, l'istanza di AppLinkEntry
non viene inoltre più annunciata per Handoff. Questa operazione può essere eseguita nell'override Page.OnDisappearing
, come illustrato nell'esempio di codice seguente:
protected override void OnDisappearing()
{
if (appLink != null)
{
appLink.IsLinkActive = false;
}
}
Trasferimento di dati a Handoff
In iOS, i dati specifici dell'applicazione possono essere archiviati durante l'indicizzazione della pagina. Questo risultato viene ottenuto aggiungendo i dati alla raccolta KeyValues
, ovvero un Dictionary<string, string>
per l'archiviazione di coppie chiave-valore usate in Handoff. Handoff è una funzionalità che consente all'utente di avviare un'attività in uno dei propri dispositivi e continuare tale attività in un'altra dei dispositivi (identificato dall'account iCloud dell'utente). Il codice seguente mostra un esempio di archiviazione di coppie chiave-valore specifiche dell'applicazione:
var pageLink = new AppLinkEntry
{
...
};
pageLink.KeyValues.Add("appName", App.AppName);
pageLink.KeyValues.Add("companyName", "Xamarin");
I valori archiviati nella raccolta KeyValues
verranno archiviati nei metadati per la pagina indicizzata e verranno ripristinati quando l'utente tocca un risultato della ricerca che contiene un collegamento diretto (o quando si usa Handoff per visualizzare il contenuto in un dispositivo connesso).
È anche possibile specificare valori per le chiavi seguenti:
contentType
- Valorestring
che specifica l'identificatore di tipo uniforme del contenuto indicizzato. La convenzione consigliata da usare per questo valore è il nome di tipo della pagina contenente il contenuto indicizzato.associatedWebPage
- Valorestring
che rappresenta la pagina Web da visitare se anche il contenuto indicizzato può essere visualizzato nel Web o se l'applicazione supporta i collegamenti diretti di Safari.shouldAddToPublicIndex
- Valorestring
true
ofalse
che determina se aggiungere o meno il contenuto indicizzato all'indice del cloud pubblico di Apple, che può quindi essere presentato agli utenti che non hanno installato l'applicazione nel proprio dispositivo iOS. La semplice impostazione del contenuto per l'indicizzazione pubblica, tuttavia, non significa che verrà aggiunto automaticamente all'indice del cloud pubblico di Apple. Per altre informazioni, vedere Public Search Indexing (Indicizzazione per la ricerca pubblica). Si noti che questa chiave deve essere impostata sufalse
quando si aggiungono dati personali alla raccoltaKeyValues
.
Nota
La raccolta KeyValues
non viene usata nella piattaforma Android.
Per altre informazioni su Handoff, vedere Introduction to Handoff (Introduzione a Handoff).
Collegamenti correlati
- iOS Search APIs (API per la ricerca iOS)
- App-Linking in Android 6.0
- AppLinkEntry
- IAppLinkEntry
- IAppLinks