Rendi la tua PWA più simile a un'app

Data di pubblicazione: 15 giugno 2020

Quando giochi a bingo con le parole d'effetto delle app web progressive, puoi scommettere tranquillamente su "Le PWA sono solo siti web". La documentazione di Microsoft sulle PWA è d'accordo, lo diciamo noi, e così anche i candidati alle PWA Frances Berriman e Alex Russell. Sì, le PWA sono solo siti web, ma sono anche molto di più. Se fatta bene, una PWA non sembrerà un sito web, ma un'app reale.

Ma cosa significa avere l'aspetto di una vera app?

Prendiamo come esempio l'app Podcasts di Apple. È disponibile su macOS su computer e su iOS (e iPadOS rispettivamente) su dispositivi mobili. Anche se Podcasts è un'applicazione multimediale, le idee principali che illustro con il suo aiuto si applicano anche ad altre categorie di app.

Un iPhone e un MacBook affiancati, entrambi con l'applicazione Podcast in esecuzione.
Apple Podcasts su iPhone e macOS (fonte).

In grado di funzionare offline

Pensa alle applicazioni specifiche per piattaforma che hai sul tuo cellulare o sul tuo computer. Una cosa è certa: puoi sempre utilizzarlo. Nell'app Podcasts, anche se sono offline, c'è sempre qualcosa da fare o da vedere. Quando non è presente una connessione di rete, l'app si apre comunque. La sezione Classifiche non mostra alcun contenuto, ma visualizza un messaggio Impossibile connettersi al momento abbinato a un pulsante Riprova.

L'app Podcasts mostra il messaggio "Impossibile connettersi in questo momento" quando non è disponibile alcuna connessione di rete.

Esegui questa operazione sul web

L'app Podcasts segue il cosiddetto modello di shell dell'app. Tutti i contenuti statici necessari per mostrare l'app principale vengono memorizzati nella cache in locale, incluse le immagini decorative come le icone del menu a sinistra e le icone della UI del player principale. I contenuti dinamici come i dati delle classifiche vengono caricati solo su richiesta. Se il caricamento non va a buon fine, sono disponibili contenuti di riserva memorizzati nella cache locale. Leggi l'articolo Il modello App Shell per scoprire come applicare questo modello architetturale alla tua app web.

Contenuti offline disponibili e contenuti multimediali riproducibili

Quando sono offline, nel riquadro a sinistra posso comunque accedere alla sezione Scaricati e riprodurre le puntate dei podcast scaricate, che vengono visualizzate con tutti i metadati, inclusi artwork e descrizioni.

App Podcasts con la riproduzione di una puntata scaricata di un podcast.
Le puntate dei podcast scaricate possono essere riprodotte anche senza rete.

Esegui questa operazione sul web

I contenuti multimediali scaricati in precedenza possono essere pubblicati dalla cache, ad esempio utilizzando la ricetta Serve cached audio and video dalla libreria Workbox. Altri contenuti possono sempre essere archiviati nella cache o in IndexedDB. Leggi l'articolo Archiviazione per il web per tutti i dettagli e per sapere quando utilizzare una tecnologia di archiviazione. Se hai dati che devono essere archiviati in modo permanente senza il rischio di essere eliminati quando la quantità di memoria disponibile si esaurisce, puoi utilizzare l'API Persistent Storage.

Download proattivo in background

Quando torno online, posso ovviamente cercare contenuti con una query come http 203 e, quando decido di abbonarmi al risultato di ricerca, l'ultima puntata della serie, HTTP 203 podcast, viene scaricata immediatamente, senza domande.

L'app Podcasts scarica l'ultima puntata di un podcast subito dopo l'iscrizione.
Dopo aver effettuato l'iscrizione a un podcast, l'ultima puntata viene scaricata immediatamente.

Esegui questa operazione sul web

Il download di una puntata di podcast è un'operazione che può richiedere più tempo. L'API Background Fetch ti consente di delegare i download al browser, che se ne occupa in background.

Su Android, il browser può delegare ulteriormente questi download al sistema operativo, quindi non deve essere in esecuzione continua. Una volta completato il download, il service worker della tua app viene riattivato e puoi decidere cosa fare con la risposta.

Interagire e condividere con altre applicazioni

L'app Podcast si integra naturalmente con altre applicazioni. Ad esempio, quando faccio clic con il tasto destro del mouse su un episodio che mi piace, posso condividerlo con altre app sul mio dispositivo, come l'app Messaggi. Si integra anche in modo naturale con gli appunti di sistema. Posso fare clic con il tasto destro del mouse su qualsiasi episodio e copiarne il link.

Il menu contestuale dell'app Podcast richiamato su una puntata del podcast con l'opzione "Condividi puntata → Messaggi" selezionata.
Condivisione di una puntata di podcast nell'app Messaggi.

Esegui questa operazione sul web

L'API Web Share e l'API Web Share Target consentono alla tua app di condividere e ricevere testi, file e link da e verso altre applicazioni sul dispositivo. Anche se non è ancora possibile per un'app web aggiungere voci di menu al menu di scelta rapida integrato del sistema operativo, esistono molti altri modi per creare link da e verso altre app sul dispositivo. Con l'API Async Clipboard, puoi leggere e scrivere in modo programmatico dati di testo e immagini (immagini PNG) negli appunti di sistema. Su Android, puoi utilizzare l'API Contact Picker per selezionare le voci dal gestore dei contatti del dispositivo. Se offri sia un'app specifica per la piattaforma sia una PWA, puoi utilizzare l'API Get Installed Related Apps per verificare se l'app specifica per la piattaforma è installata. In questo caso, non è necessario incoraggiare l'utente a installare la PWA o ad accettare le notifiche push web.

Aggiornamento app in background

Nelle impostazioni dell'app Podcasts, posso configurare l'app in modo che scarichi automaticamente i nuovi episodi. In questo modo, non devo nemmeno pensarci: i contenuti aggiornati saranno sempre disponibili. Magia.

Podcast è configurato per aggiornare il feed per le nuove puntate del podcast ogni ora.

Esegui questa operazione sul web

L'API Periodic Background Sync consente alla tua app di aggiornare regolarmente i propri contenuti in background senza che sia necessario che sia in esecuzione. Ciò significa che i nuovi contenuti sono disponibili in modo proattivo, quindi gli utenti possono iniziare a esplorarli subito quando vogliono.

Stato sincronizzato tramite cloud

I miei abbonamenti sono sincronizzati su tutti i miei dispositivi. In un mondo senza interruzioni, non devo preoccuparmi di mantenere sincronizzate manualmente le mie iscrizioni ai podcast. Allo stesso modo, non devo temere che la memoria del mio dispositivo mobile venga consumata dagli episodi che ho già ascoltato sul mio computer. Lo stato di riproduzione viene mantenuto sincronizzato e gli episodi ascoltati vengono eliminati automaticamente.

Il menu delle impostazioni dell'app Podcast nella sezione "Avanzate" in cui è attivata l'opzione "Sincronizza abbonamenti su tutti i dispositivi". Lo stato viene sincronizzato tramite il cloud.

Esegui questa operazione sul web

La sincronizzazione dei dati di stato dell'app è un'attività che puoi delegare all'API Background Sync. L'operazione di sincronizzazione non deve avvenire immediatamente, ma alla fine, magari anche quando l'utente ha già chiuso di nuovo l'app.

Controlli dei tasti multimediali hardware

Quando sono impegnato con un'altra applicazione, ad esempio la lettura di una pagina di notizie nel browser, posso comunque controllare l'app Podcasts con i tasti multimediali del mio laptop. Non è necessario passare all'app solo per andare avanti o indietro.

Tastiera Magic Keyboard di Apple MacBook Pro con tasti multimediali annotati.
I tasti multimediali consentono di controllare l'app Podcasts.

Esegui questa operazione sul web

I tasti multimediali sono supportati dall'API Media Session. In questo modo, gli utenti possono utilizzare i tasti multimediali hardware su tastiere, cuffie o persino controllare l'app web dai tasti multimediali software sugli smartwatch. Inoltre, potresti utilizzare un pattern di vibrazione quando l'utente cerca una parte significativa dei contenuti, ad esempio quando supera i titoli di apertura o il limite di un capitolo.

Multitasking e scorciatoia app

Certo, posso sempre tornare all'app Podcast da qualsiasi punto. L'app ha un'icona chiaramente distinguibile che posso mettere anche sul desktop o nel dock delle applicazioni, in modo che Podcasts possa essere avviato immediatamente quando voglio.

Il selettore di attività di macOS con una serie di icone di app tra cui scegliere, una delle quali è l'app Podcast.
Multitasking per tornare all'app Podcasts.

Esegui questa operazione sul web

Le app web progressive su computer e dispositivi mobili possono essere installate nella schermata Home, nel menu Start o nel dock delle applicazioni. L'installazione può avvenire in base a un prompt proattivo o essere controllata completamente dallo sviluppatore dell'app. L'articolo Cosa serve per essere installabile? tratta tutto ciò che devi sapere. Quando esegui il multitasking, le PWA vengono visualizzate indipendentemente dal browser.

Azioni rapide nel menu contestuale

Le azioni più comuni delle app, Cerca nuovi contenuti e Controlla nuovi episodi, sono disponibili direttamente dal menu contestuale dell'app nel Dock. Nel menu Opzioni, posso anche decidere di aprire l'app al momento dell'accesso.

Menu contestuale dell'icona dell'app Podcast che mostra le opzioni "Cerca" e "Controlla nuove puntate".
Le Azioni rapide sono disponibili immediatamente dall'icona dell'app.

Esegui questa operazione sul web

Se specifichi le scorciatoie delle icone delle app nel manifest dell'app web della PWA, puoi registrare percorsi rapidi per le attività comuni che gli utenti possono raggiungere direttamente dall'icona dell'app. Su sistemi operativi come macOS, gli utenti possono anche fare clic con il tasto destro del mouse sull'icona dell'app e impostare l'avvio dell'app al momento dell'accesso. È in corso l'elaborazione di una proposta per l'esecuzione all'accesso.

Agire come app predefinita

Altre applicazioni iOS e persino siti web o email possono integrarsi con l'app Podcasts sfruttando lo schema URL podcasts://. Se seguo un link come podcasts://podcasts.apple.com/podcast/the-css-podcast/id1042283903 mentre sono nel browser, vengo indirizzato direttamente all'app Podcast e posso decidere di iscrivermi o ascoltare il podcast.

Il browser Chrome che mostra una finestra di dialogo di conferma che chiede all'utente se vuole aprire l'app Podcast.
L'app Podcasts può essere aperta direttamente dal browser.

Esegui questa operazione sul web

La gestione di schemi URL completamente personalizzati non è ancora possibile, ma è in corso una proposta per la gestione del protocollo URL per le PWA. registerProtocolHandler() con un prefisso dello schema web+ è la migliore alternativa.

Integrazione del file system locale

Forse non ci pensi subito, ma l'app Podcast si integra naturalmente con il file system locale. Quando scarico una puntata di podcast sul mio laptop, questa viene memorizzata in ~/Library/Group Containers/243LU875E5.groups.com.apple.podcasts/Library/Cache. A differenza, ad esempio, di ~/Documents, questo directory non è destinato all'accesso diretto da parte degli utenti normali.

Nella sezione Contenuti offline vengono indicati altri meccanismi di archiviazione diversi dai file.

Finder di macOS ha raggiunto la directory di sistema dell'app Podcasts.
Le puntate dei podcast vengono memorizzate in una cartella speciale dell'app di sistema.

Esegui questa operazione sul web

L'API File System Access consente agli sviluppatori di accedere al file system locale del dispositivo. Puoi utilizzarla direttamente o tramite la libreria di supporto browser-fs-access, che fornisce in modo trasparente un fallback per i browser che non supportano l'API. Per motivi di sicurezza, le directory di sistema non sono accessibili dal web.

Aspetto e design della piattaforma

Esiste una funzionalità più sottile che è evidente per un'applicazione iOS, come Podcast. Nessuna delle etichette di testo è selezionabile e tutto il testo si confonde con il carattere di sistema della macchina. Inoltre, la mia scelta del tema a colori del sistema (ad esempio la modalità Buio) viene rispettata.

L'app Podcasts in modalità Buio.
L'app Podcasts supporta la modalità Chiaro e la modalità Buio.
L'app Podcasts in modalità Luce.
L'app utilizza il carattere di sistema predefinito.

Esegui questa operazione sul web

Utilizzando la proprietà CSS user-select con il valore none, puoi proteggere gli elementi dell'interfaccia utente dalla selezione accidentale. Assicurati, tuttavia, di non utilizzare in modo improprio questa proprietà per rendere non selezionabili i contenuti dell'app. Deve essere utilizzato solo per gli elementi dell'interfaccia utente, come i testi dei pulsanti e così via. Il valore system-ui per la proprietà CSS font-family ti consente di specificare il carattere predefinito dell'interfaccia utente del sistema da utilizzare per la tua app. Infine, la tua app può rispettare la preferenza dello schema di colori dell'utente rispettando la sua scelta prefers-color-scheme, con un pulsante di attivazione/disattivazione della modalità buio facoltativo per eseguire l'override. Un'altra cosa da decidere potrebbe essere cosa deve fare il browser quando raggiunge il limite di un'area di scorrimento, ad esempio per implementare l'aggiornamento personalizzato. Ciò è possibile con la proprietà CSS overscroll-behavior.

Barra del titolo personalizzata

Quando guardi la finestra dell'app Podcasts, noti che non ha una barra del titolo e una barra degli strumenti integrate classiche, come ad esempio la finestra del browser Safari, ma un'esperienza personalizzata che assomiglia a una barra laterale agganciata alla finestra principale del player.

La barra dei riquadri e la barra degli strumenti integrate del browser Safari.
Barre del titolo personalizzate di Safari e Podcasts.

Esegui questa operazione sul web

La personalizzazione della barra del titolo ha una disponibilità limitata. Puoi (e devi) specificare le proprietà display e theme-color del manifest dell'app web. Determina l'aspetto della finestra dell'applicazione e decide quali controlli del browser predefinito devono essere visualizzati, potenzialmente nessuno.

Animazioni rapide

Le animazioni in-app sono rapide e fluide in Podcasts. Ad esempio, quando apro il riquadro Note dell'episodio a destra, questo scorre elegantemente verso l'interno. Quando rimuovo una puntata dai miei download, le puntate rimanenti vengono spostate verso l'alto e occupano lo spazio sullo schermo liberato dalla puntata eliminata.

L'app Podcasts con il riquadro "Note dell'episodio" espanso.
Le animazioni in-app, ad esempio quando si apre un riquadro, sono rapide.

Esegui questa operazione sul web

È sicuramente possibile creare animazioni performanti sul web se tieni conto di una serie di best practice descritte nell'articolo Animazioni e rendimento. Le animazioni di scorrimento, come quelle che si vedono spesso nei contenuti paginati o nei caroselli multimediali, possono essere migliorate notevolmente utilizzando la funzionalità CSS Scroll Snap. Per un controllo completo, puoi utilizzare l'API Web Animations.

Contenuti visualizzati al di fuori dell'app

L'app Podcasts su iOS può mostrare contenuti in posizioni diverse dall'applicazione stessa, ad esempio nella visualizzazione dei widget del sistema o come suggerimento di Siri.

Gli inviti all'azione proattivi e basati sull'utilizzo che richiedono solo un tocco per interagire possono aumentare notevolmente il tasso di riattivazione di un'app come Podcasts.

La visualizzazione del widget iOS mostra l'app Podcasts che suggerisce un nuovo episodio.

Esegui questa operazione sul web

Utilizza l'API Content Index nella tua applicazione per comunicare al browser quali contenuti della PWA sono disponibili offline. In questo modo, il browser può mostrare questi contenuti al di fuori dell'app principale. Se contrassegni i contenuti interessanti della tua app come adatti alla riproduzione audio speakable e utilizzi il markup strutturato, puoi aiutare i motori di ricerca e gli assistenti virtuali, come l'Assistente Google, a presentare le tue offerte nel modo migliore.

Widget di controllo dei contenuti multimediali della schermata di blocco

Quando viene riprodotta una puntata di podcast, l'app Podcast mostra un bellissimo widget di controllo sulla schermata di blocco che include metadati come la copertina della puntata, il titolo della puntata e il nome del podcast.

Widget di riproduzione multimediale di iOS nella schermata di blocco che mostra una puntata di podcast con metadati avanzati.
La riproduzione dei contenuti multimediali nell'app può essere controllata dalla schermata di blocco.

Esegui questa operazione sul web

L'API Media Session ti consente di specificare metadati come artwork, titoli delle tracce e così via, che vengono poi visualizzati nella schermata di blocco, sugli smartwatch o in altri widget multimediali del browser.

Notifiche push

Le notifiche push sono diventate un po' fastidiose sul web (anche se i prompt di notifica sono molto più silenziosi ora). Se utilizzati correttamente, però, possono aggiungere molto valore. Ad esempio, l'app Podcast per iOS può, se voglio, inviarmi notifiche relative alle nuove puntate dei podcast a cui sono iscritto o consigliarmi nuovi podcast, oltre ad avvisarmi delle nuove funzionalità dell'app.

Schermata delle impostazioni "Notifiche" dell'app Podcast per iOS che mostra l'opzione di attivazione/disattivazione delle notifiche "Nuovi episodi".
Le app possono inviare notifiche push per informare l'utente sui nuovi contenuti.

Esegui questa operazione sul web

L'API Push consente alla tua app di ricevere notifiche push in modo da poter informare gli utenti di eventi importanti relativi alla tua PWA. Per le notifiche che devono essere attivate in un momento futuro noto e che non richiedono una connessione di rete, puoi utilizzare l'API Notification Triggers.

Badge delle icone delle app

Ogni volta che sono disponibili nuove puntate di uno dei podcast a cui sono iscritto, viene visualizzato un badge con l'icona dell'app sull'icona della schermata Home di Podcasts, il che mi incoraggia a interagire di nuovo con l'app in modo non intrusivo.

Schermata delle impostazioni di iOS che mostra l'opzione "Badge" attivata.
I badge sono un modo discreto per le applicazioni di informare gli utenti sui nuovi contenuti.

Esegui questa operazione sul web

Puoi impostare i badge delle icone delle app con l'API Badging. Ciò è particolarmente utile quando la tua PWA ha una nozione di elementi "non letti" o quando hai bisogno di un mezzo per attirare in modo discreto l'attenzione dell'utente sull'app.

La riproduzione dei contenuti multimediali ha la precedenza sulle impostazioni di risparmio energetico

Durante la riproduzione di contenuti multimediali di podcast, lo schermo potrebbe spegnersi, ma il sistema non entra in modalità standby. Le app possono anche mantenere lo schermo attivo, ad esempio per visualizzare i testi o i sottotitoli codificati.

Preferenze di macOS nella sezione "Risparmio energetico".
Le app possono mantenere lo schermo attivo.

Esegui questa operazione sul web

Utilizza l'API Screen Wake Lock per impedire lo spegnimento dello schermo. La riproduzione di contenuti multimediali sul web impedisce automaticamente al sistema di entrare in modalità standby.

Rilevamento di app tramite uno store

L'app Podcasts fa parte dell'esperienza desktop macOS, mentre su iOS deve essere installata dall'App Store. Una rapida ricerca di podcast, podcasts o apple podcasts fa immediatamente comparire l'app nell'App Store.

La ricerca di "podcast" nell'App Store di iOS mostra l'app Podcast.
Gli utenti hanno imparato a scoprire le app negli store.

Esegui questa operazione sul web

Anche se Apple non consente le PWA sull'App Store, con Android puoi inviare la tua PWA racchiusa in un'attività web attendibile. Lo script bubblewrap rende questa operazione semplice. Questo script è anche ciò che alimenta internamente la funzionalità di esportazione dell'app per Android di PWABuilder, che puoi utilizzare senza toccare la riga di comando.

Riepilogo della funzionalità

Questa tabella mostra una panoramica compatta di tutte le funzionalità e fornisce un elenco di risorse utili per implementarle sul web.

Funzionalità Risorse utili per farlo sul web
In grado di funzionare offline
Contenuti offline disponibili e contenuti multimediali riproducibili
Download proattivo in background
Condivisione e interazione con altre applicazioni
Aggiornamento app in background
Stato sincronizzato sul cloud
Controlli dei tasti multimediali hardware
Multitasking e scorciatoia app
Azioni rapide nel menu contestuale
Agisci come app predefinita
Integrazione del file system locale
Aspetto della piattaforma
Barra del titolo personalizzata
Animazioni rapide
Contenuti visualizzati al di fuori dell'app
Widget di controllo multimediale della schermata di blocco
Notifiche push
Badge dell'icona dell'app
La riproduzione multimediale ha la precedenza sulle impostazioni di Risparmio energetico
Scoperta di app tramite uno store

Conclusione

Le PWA hanno fatto molta strada dalla loro introduzione nel 2015. Nell'ambito del Project Fugu 🐡, il team interaziendale di Chromium sta lavorando per colmare le ultime lacune rimaste. Seguendo anche solo alcuni dei consigli che abbiamo condiviso, puoi avvicinarti a quell'esperienza simile a un'app e far dimenticare ai tuoi utenti che stanno interagendo con "solo un sito web". In definitiva, la maggior parte degli utenti non si preoccupa di come è creata la tua app (e perché dovrebbe?), purché sembri un'app reale.

Ringraziamenti

Questo documento è stato esaminato da Kayce Basques, Joe Medley, Joshua Bell, Dion Almaer, Ade Oshineye, Pete LePage, Sam Thorogood, Reilly Grant, e Jeffrey Yasskin.