Na primeira vez que um usuário inicia um Progressive Web App (PWA) via Trusted Web Atividade, o service worker ainda não estará disponível, desde o processo de registro ainda não aconteceu. Além disso, se o usuário não tiver conectividade durante o primeiro aplicativo iniciar, em vez da experiência off-line personalizada, a página de erro de rede será mostrados.
Um exemplo desse cenário pode acontecer depois que o usuário faz o download do PWA na Play Store. Se o usuário não tiver conectividade ao tentar abrir o app pela primeira vez, o service worker ainda não estará disponível para mostrar a página de fallback off-line, portanto. A página de erro padrão será mostrada, levando a uma experiência ruim.
Este guia explica como exibir sua própria atividade nessa situação verificar o status da rede antes de iniciar a Atividade na Web Confiável.
Criar uma LauncherActivity personalizada
A primeira etapa é criar uma atividade personalizada da tela de início. Este Activity
que contém a tela off-line para mostrar se não há conectividade
na primeira vez que um usuário abrir o aplicativo.
Chame a atividade OfflineFirstTWALauncherActivity
e faça com que ela se estenda:
com.google.androidbrowserhelper.trusted.LauncherActivity
.
import com.google.androidbrowserhelper.trusted.LauncherActivity;
public class OfflineFirstTWALauncherActivity extends LauncherActivity {
}
Em seguida, registre a atividade em 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>
O código anterior registra OfflineFirstTWALauncherActivity
como uma tela de início.
atividade e define https://airhorner.com como o URL
que será aberta quando o TWA for lançado.
Lidar com cenários off-line
Primeiro, dentro da atividade, substitua o método shouldLaunchImmediately()
e
fazê-la retornar false
, para que a Atividade Confiável na Web não seja iniciada
imediatamente. Também é possível adicionar verificações extras antes do lançamento inicial:
@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;
}
Substitua o método onCreate()
para verificar o status da rede antes da TWA
é lançado. Adicione uma chamada para tryLaunchTwa()
, um método auxiliar que vai conter esse
lógica:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tryLaunchTwa();
}
Em seguida, implemente 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();
}
}
O código anterior lida com três cenários:
- Se a TWA tiver sido iniciada anteriormente, o service worker
foi registrado e o PWA poderá responder off-line. Nesse caso,
chame
launchTwa()
, definido na classe pai, para iniciar o Atividade confiável na Web diretamente. - Se o TWA não tiver sido lançado anteriormente e o usuário estiver on-line, inicie
Atividade confiável na Web pela primeira vez usando o
firstTimeLaunchTwa()
que você implementará mais tarde. - Se o TWA ainda não tiver sido lançado e o usuário estiver off-line, renderize o arquivo nativo tela de substituição off-line.
Implementar métodos auxiliares
A etapa final é implementar os métodos auxiliares chamados pelo código anterior.
Este é o código para verificar o estado off-line isOnline()
:
private boolean isOnline() {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
Em seguida, implemente hasTwaLaunchedSuccessfully()
, que verifica se a TWA tem
iniciado pelo menos uma vez:
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);
}
O código anterior chama launchTWA()
da classe pai e salva a
Sinalização twa_launched_successfully
nas preferências compartilhadas. Isso indica que o TWA
foi iniciado com sucesso, pelo menos uma vez.
O método auxiliar restante, renderOfflineFallback()
, renderiza um Android
tela off-line.
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();
}
});
}
Na demonstração dele, definimos o layout activity_offline_first_twa
, que
contém um botão para tentar novamente, que será executado a tempo
firstTimeLaunchTwa()
após verificar a conexão.
Conclusão
- Na primeira vez que um usuário inicia um Progressive Web App (PWA) via Trusted Web Activity, o service worker ainda não vai estar disponível.
- Para evitar a exibição da tela off-line padrão se o usuário não tiver conectividade, você pode detectar a condição off-line e mostrar uma tela substituta como alternativa.
- Neste guia, você aprendeu como implementar essa estratégia. Se você for interesse em verificar o código que usamos ao longo deste guia, poderá encontrar a solução completa na demonstração off-line da primeira TWA.