Attiva obiettivo condivisione web nell'attività web attendibile

Destinazione condivisione web consente alle PWA di ricevere contenuti condivisi da altre applicazioni installate sul dispositivo. Questa funzionalità può essere utilizzata, ad esempio, da applicazioni come gli editor di immagini per ricevere un'immagine da un'app della fotocamera o da un social network per ricevere un'immagine o un video da condividere.

A partire da Chrome 86, la destinazione di condivisione web è ora disponibile anche per le applicazioni che utilizzano la Attività web attendibile. Sebbene la PWA debba funzionare immediatamente, sono necessarie alcune modifiche all'applicazione Android.

Questo articolo presuppone che lo sviluppatore abbia familiarità con le Attività web attendibili. I lettori che non hanno dimestichezza con la tecnologia possono iniziare consultando la Guida all'integrazione.

Nello stesso modo, una spiegazione completa dell'implementazione del target di condivisione web in una PWA non rientra nell'ambito e gli sviluppatori possono trovare ulteriori informazioni in questo articolo.

L'applicazione demo all'indirizzo https://scrapbook-pwa.web.app/ verrà utilizzata come PWA per questo articolo. Il codice sorgente è disponibile su GitHub e l'applicazione per Android si basa sulla demo di Attività web attendibile di base.

Aggiungere la destinazione di condivisione web all'app per Android

Per modificare un'applicazione basata su attività web attendibile esistente per implementare la destinazione della condivisione web, è necessario apportare modifiche a tre diversi file:

build.gradle

La libreria android-browser-helper è stata aggiornata con il supporto di Destinazione condivisione web. Come primo passaggio, aggiorna l'applicazione in modo da utilizzare una versione maggiore o uguale a 2.0.1.

dependencies {
    ...
    implementation 'com.google.androidbrowserhelper:androidbrowserhelper:2.2.0'
}

res/strings.xml

L'applicazione deve comunicare all'Attività web attendibile i dettagli della condivisione che supporta, ad esempio gli URL da aprire, il metodo da utilizzare e i tipi MIME supportati.

Questo viene eseguito tramite un file JSON reso disponibile all'Attività web attendibile con una risorsa stringa. I campi sono gli stessi del campo share_target disponibile nel file manifest web e possono essere aggiunti a una stringa all'interno di strings.xml, quasi così com'è, con due note importanti:

  1. Il valore dell'attributo action deve essere l'URL completo, inclusa l'origine.
  2. Le virgolette doppie devono essere precedute dal carattere di escape, quindi ogni " diventa \".

Ecco come appare la sezione share_target di https://scrapbook-pwa.web.app/manifest.json:

{
  ...
  "share_target": {
    "action": "/_share-target",
    "enctype": "multipart/form-data",
    "method": "POST",
    "params": {
      "files": [{
        "name": "media",
        "accept": [
          "audio/*",
          "image/*",
          "video/*"
        ]
      }]
    }
  },
  ...
}

Il nuovo elemento stringa sarà simile al seguente:

<string name="share_target">
{
    \"action\": \"https://twa-web-scrapbook.web.app/_share-target\",
    \"method\": \"POST\",
    \"enctype\": \"multipart/form-data\",
    \"params\": {
      \"files\": [{
          \"name\": \"media\",
          \"accept\": [\"image/*\", \"audio/*\", \"video/*\"]
      }]
    }
}
</string>

AndroidManifest.xml

Sono necessarie alcune modifiche in Android Manifest. Innanzitutto dobbiamo assicurarci che DelegationService sia dichiarato, esportato e abilitato.

Gli sviluppatori che hanno creato la propria applicazione in base alla demo di base avranno già incluso il servizio e il markup dovrebbe trovarsi all'interno del tag dell'applicazione e avere il seguente aspetto:

<service
    android:name="com.google.androidbrowserhelper.trusted.DelegationService"
    android:enabled="true"
    android:exported="true">

    <intent-filter>
        <action android:name="android.support.customtabs.trusted.TRUSTED_WEB_ACTIVITY_SERVICE"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</service>

Infine, devi aggiungere due nuovi elementi al tag attività LauncherActivity: - Un tag meta-data che fa riferimento al file JSON definito nel file extensions.xml. - Un intent-filter che dichiara i tipi MIME che l'applicazione è in grado di gestire per altre app sul dispositivo.

<meta-data
    android:name="android.support.customtabs.trusted.METADATA_SHARE_TARGET"
    android:resource="@string/share_target"/>

<intent-filter>
    <action android:name="android.intent.action.SEND" />
    <action android:name="android.intent.action.SEND_MULTIPLE" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="audio/*" />
    <data android:mimeType="image/*" />
    <data android:mimeType="video/*" />
</intent-filter>

Come si può vedere nel markup riportato sopra, è necessario aggiungere un elemento data per ogni mime-type dichiarato nel JSON share_target.

Conclusione

L'integrazione di Target della condivisione web consente alle PWA all'interno di un'attività web attendibile di essere integrate più profondamente con altre applicazioni installate su un dispositivo Android.

Come descritto nei passaggi precedenti, il markup aggiuntivo necessario per aggiungere il supporto per l'API in un'app per Android esistente che utilizza Attività web attendibile è stato semplificato da android-browser-helper.

Consulta l'articolo Target di condivisione web per scoprire di più sull'utilizzo dell'API su una PWA e l'API Condivisione web per scoprire come condividere contenuti dall'app web progressiva.

Risoluzione dei problemi

La mia applicazione non viene visualizzata come opzione quando provo a condividere un file da un'altra applicazione.

Se l'applicazione non viene visualizzata come opzione, significa che intent-filter è sbagliato. Controlla il markup intent-filter e assicurati che contenga le azioni, la categoria e il valore mime-types gestiti dall'applicazione corretti.

La mia applicazione viene visualizzata come opzione, la PWA viene avviata, ma i dati non vengono condivisi.

Le cause possono essere diverse. Ecco un elenco di controllo degli aspetti da esaminare:

  • Assicurati che la convalida di Digital Asset Links sia andata a buon fine.
  • Controlla se il file JSON all'interno di logs.xml è corretto.