Indicizzazione e deep linking delle applicazioni

Download Sample Scaricare l'esempio

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:

TodoList Application

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:

  1. Aggiungere un entitlement Domini associati all'app, con la chiave applinks, includendo tutti i domini che saranno supportati dall'app.
  2. Aggiungere un file di associazione del sito dell'app Apple nel sito Web.
  3. 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:

  1. Una versione dell'applicazione deve essere pubblicata in Google Play.
  2. 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.
  3. 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:

  1. Installare . Xamarin.Forms AppLinks Pacchetto NuGet nel progetto di applicazione Android.
  2. Nel file MainActivity.cs aggiungere una dichiarazione per usare lo spazio dei nomi Xamarin.Forms.Platform.Android.AppLinks.
  3. Nel file MainActivity.cs aggiungere una dichiarazione per usare lo spazio dei nomi Firebase.
  4. In un Web browser, creare un nuovo progetto tramite la console Firebase.
  5. Nella console Firebase aggiungere Firebase all'app Android e immettere i dati richiesti.
  6. Scaricare il file google-services.json risultante.
  7. Aggiungere il file google-services.json nella directory radice del progetto Android e impostare Azione compilazione su GoogleServicesJson.
  8. Nell'override MainActivity.OnCreate aggiungere la riga di codice seguente sotto Forms.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:

  1. 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.
  2. 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:

Indexed Content in Search Results on 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.

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 - Valore string 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 - Valore string 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 - Valore stringtrue o false 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 su false quando si aggiungono dati personali alla raccolta KeyValues.

Nota

La raccolta KeyValues non viene usata nella piattaforma Android.

Per altre informazioni su Handoff, vedere Introduction to Handoff (Introduzione a Handoff).