Attività web attendibili offline

Demián Renzulli
Demián Renzulli

La prima volta che un utente avvia un'applicazione web progressiva (PWA) tramite l'attività web attendibile, il service worker non sarà ancora disponibile poiché la procedura di registrazione non è ancora stata eseguita. Inoltre, se l'utente non ha connettività durante il primo avvio dell'app, anziché l'esperienza offline personalizzata viene visualizzata la pagina di errore di rete.

Un esempio di questo scenario potrebbe verificarsi dopo che l'utente ha scaricato la PWA dal Play Store. Di conseguenza, se l'utente non dispone di connettività quando tenta di aprire l'app per la prima volta, il service worker non sarà ancora disponibile a mostrare la pagina di riserva offline. Verrà visualizzata la pagina di errore standard, inducendo a un'esperienza negativa.

TWA offline: la pagina offline standard

Questa guida spiega come visualizzare la tua attività in questa situazione controllando lo stato della rete prima di avviare l'Attività web attendibile.

Creare un'attività LauncherActivity personalizzata

Il primo passaggio consiste nel creare un'attività personalizzata in Avvio app. Questo Activity contiene la schermata offline che viene visualizzata se non è presente alcuna connettività la prima volta che un utente apre l'app.

Chiama l'attività OfflineFirstTWALauncherActivity e estendila: com.google.androidbrowserhelper.trusted.LauncherActivity.

import com.google.androidbrowserhelper.trusted.LauncherActivity;

public class OfflineFirstTWALauncherActivity extends LauncherActivity {

}

Successivamente, registra l'attività in AndroidManifest.xml:

<activity android:name=".OfflineFirstTWALauncherActivity" android:theme="@style/Theme.Design.NoActionBar">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <!-- Edit android:value to change the url opened by the Trusted Web Activity -->
    <meta-data android:name="android.support.customtabs.trusted.DEFAULT_URL" android:value="https://airhorner.com" />
    <!-- This intent-filter adds the Trusted Web Activity to the Android Launcher -->
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Edit android:host to handle links to the target URL -->
        <data android:host="airhorner.com" android:scheme="https" />
    </intent-filter>
</activity>

Il codice precedente registra OfflineFirstTWALauncherActivity come attività di avvio e definisce https://airhorner.com come URL da aprire all'avvio della TWA.

Gestire scenari offline

Innanzitutto, all'interno dell'attività, sostituisci il metodo shouldLaunchImmediately() e fai in modo che restituisca false, in modo che l'attività web attendibile non si avvii immediatamente. Puoi anche aggiungere controlli aggiuntivi prima del lancio iniziale:

@Override
protected boolean shouldLaunchImmediately() {
    // launchImmediately() returns `false` so we can check connection
    // and then render a fallback page or launch the Trusted Web Activity with `launchTwa()`.
    return false;
}

Sostituisci il metodo onCreate() per controllare lo stato della rete prima del lancio del TWA. Aggiungi una chiamata a tryLaunchTwa(), un metodo di supporto che conterrà la logica:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    tryLaunchTwa();
}

Successivamente, implementa tryLaunchTwa():

private void tryLaunchTwa() {
    // If TWA has already launched successfully, launch TWA immediately.
    // Otherwise, check connection status. If online, launch the Trusted Web Activity with `launchTwa()`.
    // Otherwise, if offline, render the offline fallback screen.
    if (hasTwaLaunchedSuccessfully()) {
        launchTwa();
    } else if (isOnline()) {
        firstTimeLaunchTwa();
    } else {
        renderOfflineFallback();
    }
}

Il codice precedente gestisce tre scenari:

  • Se la TWA è stata lanciata in precedenza, il servizio worker è stato registrato e la PWA potrà rispondere offline. In questo caso, chiama launchTwa(), definito nella classe principale, per avviare direttamente l'attività web attendibile.
  • Se l'Attività web attendibile non è stata avviata in precedenza e l'utente è online, avviala per la prima volta utilizzando il metodo firstTimeLaunchTwa() che implementerai in un secondo momento.
  • Se la TWA non è ancora stata lanciata e l'utente è offline, viene visualizzata la schermata di riserva offline nativa.

Implementa metodi di assistenza

Il passaggio finale consiste nell'implementare i metodi di assistenza chiamati dal codice precedente. Ecco il codice per controllare lo stato offline isOnline():

private boolean isOnline() {
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

Poi implementa hasTwaLaunchedSuccessfully(), che controlla se la TWA è stata lanciata almeno una volta:

private boolean hasTwaLaunchedSuccessfully() {
    // Return `true` if the preference "twa_launched_successfully" has already been set.
    SharedPreferences sharedPref = getSharedPreferences(getString(R.string.twa_offline_first_preferences_file_key), Context.MODE_PRIVATE);
    return sharedPref.getBoolean(getString(R.string.twa_launched_successfully), false);
}

Il codice precedente chiama launchTWA() dalla classe principale e salva il flag twa_launched_successfully nelle preferenze condivise. Ciò indica che la TWA è stata avviata correttamente almeno una volta.

Il metodo di supporto rimanente, renderOfflineFallback(), esegue il rendering di una schermata offline di Android.

private void renderOfflineFallback() {
    setContentView(R.layout.activity_offline_first_twa);

    Button retryBtn = this.findViewById(R.id.retry_btn);
    retryBtn.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            // Check connection status. If online, launch the Trusted Web Activity for the first time.
            if (isOnline()) firstTimeLaunchTwa();
        }
    });
}

Per la sua demo, abbiamo definito il layout activity_offline_first_twa, che contiene un pulsante per riprovare, che, nel tempo, eseguirà firstTimeLaunchTwa() dopo aver controllato la connessione.

twa offline - schermata offline personalizzata

Conclusione

  • La prima volta che un utente avvia un'applicazione web progressiva (PWA) tramite Attività web attendibile, il service worker non sarà ancora disponibile.
  • Per evitare di mostrare la schermata offline standard se l'utente non ha connettività, puoi rilevare la condizione offline e mostrare una schermata offline di riserva.
  • In questa guida hai imparato a implementare questa strategia. Se ti interessa controllare il codice che abbiamo utilizzato in questa guida, puoi trovare la soluzione completa nella demo TWA offline first.