Sklepy z aplikacjami zapewniają deweloperom miejsce, w którym mogą zaprezentować swoje aplikacje przed instalacją, wraz ze zrzutami ekranu i informacjami tekstowymi, które ułatwiają podjęcie decyzji o zainstalowaniu aplikacji. Bogatszy interfejs instalacji zapewnia deweloperom aplikacji internetowych podobne miejsce, w którym mogą zapraszać użytkowników do instalowania ich aplikacji bezpośrednio w przeglądarce. Ten rozszerzony interfejs jest dostępny w Chrome na Androida i na komputerach.
Domyślny prompt
Poniżej znajdziesz przykład domyślnego interfejsu, który nie zawiera wystarczającego kontekstu.
![Okno instalacji domyślnej przeglądarki na komputerze.](https://web.dev/static/patterns/web-apps/richer-install-ui/images/y5sNbIN19bPNbqni3xay.png?authuser=19&hl=pl)
![Okno domyślnej instalacji przeglądarki na urządzeniach mobilnych.](https://web.dev/static/patterns/web-apps/richer-install-ui/images/yshUdzH27Gm1Rzdj9s8O.png?authuser=19&hl=pl)
Bogatszy interfejs instalacji
Aby wyświetlać bardziej szczegółowe okno interfejsu instalacji zamiast zwykłego, małego domyślnego promptu, dodaj do pliku manifestu internetowego pola screenshots
i description
. Oto przykład Squoosh.app:
![Poszerzony UI instalacji na komputerach i urządzeniach mobilnych](https://web.dev/static/patterns/web-apps/richer-install-ui/images/5SlCnibmZHqkXdGVgPZY.jpeg?authuser=19&hl=pl)
Okno instalatora bogatszego interfejsu użytkownika składa się z zawartości pól description
i screenshots
w pliku manifestu internetowego.
Aby wyświetlić to okno, musisz dodać co najmniej 1 zrzut ekranu dla odpowiedniego formatu, ale zalecamy też dodanie opisu. Sprawdź szczegóły dotyczące poszczególnych pól poniżej.
Zrzuty ekranu
Zrzuty ekranu dodają do nowego interfejsu instalacji. Zdecydowanie zalecamy ich użycie. W pliku manifestu dodajesz element screenshots
, który pobiera tablicę, która wymaga co najmniej 1 obrazu, a Chrome wyświetla ich maksymalnie 8. Przykład poniżej.
"screenshots": [
{
"src": "source/image1.png",
"sizes": "640x320",
"type": "image/png",
"form_factor": "wide",
"label": "Wonder Widgets"
}
]
Zrzuty ekranu muszą spełniać te kryteria:
- Szerokość i wysokość musi wynosić co najmniej 320–3840 pikseli.
- Maksymalny wymiar nie może być dłuższy niż 2,3 raza dłuższy niż wymiar minimalny.
- Wszystkie zrzuty ekranu z wartością jednego formatu muszą mieć identyczne formaty obrazu.
- Obsługiwane są tylko formaty graficzne JPEG i PNG.
- Wyświetli się tylko 8 zrzutów ekranu. Jeśli zostanie dodanych więcej, klient użytkownika po prostu je zignoruje.
Pamiętaj też o podaniu rozmiaru i typu obrazu, aby wyświetlał się prawidłowo. Zobacz tę demonstrację
form_factor
wskazuje przeglądarce, czy zrzut ekranu powinien pojawić się na komputerze (wide
) czy na urządzeniu mobilnym (narrow
).
Opis
Użytkownik description
opisuje aplikację w komunikacie instalacji, aby zaprosić użytkownika do jej zachowania.
Okno wyświetla się nawet bez description
, ale jest to zalecane.
Obowiązuje limit 7 wierszy tekstu (około 324 znaki). Dłuższe opisy są obcinane i dołączane wielokropek (jak widać w tym przykładzie).
{
…
"description": "Compress and compare images with different codecs
right in your browser."
}
![Dodano opis](https://web.dev/static/patterns/web-apps/richer-install-ui/images/oOj7Ls7cQ8E274faxfOz.jpg?authuser=19&hl=pl)
![Dłuższy opis, który został skrócony.](https://web.dev/static/patterns/web-apps/richer-install-ui/images/Dpzs03K6QmBkZaefX2nU.jpg?authuser=19&hl=pl)
Opis pojawi się u góry komunikatu z prośbą o instalację.
Na zrzutach ekranu możesz już zauważyć, że w oknach instalacji jest też wyświetlana informacja o pochodzeniu aplikacji. Źródła, które są zbyt długie, aby zmieścić się w interfejsie, są obcinane. Nazywa się to eliminacją i jest używane w ramach zabezpieczeń chroniących użytkowników.
Więcej informacji
- Bardziej rozbudowany interfejs użytkownika instalacji PWA
- Bardziej rozbudowany interfejs instalacji dostępny na komputerach
Prezentacja
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="color-scheme" content="dark light" />
<link rel="manifest" href="manifest.json" />
<title>How to add Richer Install UI to your web app</title>
<!-- TODO: Devsite - Removed inline handlers -->
<!-- <script>
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('sw.js');
});
}
</script>
<script type="module" src="script.js"></script> -->
</head>
<body>
<h1>How to add Richer Install UI to your web app</h1>
<ol>
<li>
Install the app by clicking the button below. After the installation,
the button is disabled.
<p>
<button disabled type="button">Install</button>
</p>
</li>
<li>
When you click on install a dialog similar to the ones from app stores
will be displayed.
</li>
<li>
The dialog includes the `description` and `screenshots` set in the app
manifest.
</li>
<li>
Screenshots should be different depending if the app is being installed
on a mobile or desktop device, according to the `form_factor` value set
for the screenshots on the manifest
</li>
</ol>
</body>
</html>
JS
// The install button.
const installButton = document.querySelector('button');
// Only relevant for browsers that support installation.
if ('BeforeInstallPromptEvent' in window) {
// Variable to stash the `BeforeInstallPromptEvent`.
let installEvent = null;
// Function that will be run when the app is installed.
const onInstall = () => {
// Disable the install button.
installButton.disabled = true;
// No longer needed.
installEvent = null;
};
window.addEventListener('beforeinstallprompt', (event) => {
// Do not show the install prompt quite yet.
event.preventDefault();
// Stash the `BeforeInstallPromptEvent` for later.
installEvent = event;
// Enable the install button.
installButton.disabled = false;
});
installButton.addEventListener('click', async () => {
// If there is no stashed `BeforeInstallPromptEvent`, return.
if (!installEvent) {
return;
}
// Use the stashed `BeforeInstallPromptEvent` to prompt the user.
installEvent.prompt();
const result = await installEvent.userChoice;
// If the user installs the app, run `onInstall()`.
if (result.outcome === 'accepted') {
onInstall();
}
});
// The user can decide to ignore the install button
// and just use the browser prompt directly. In this case
// likewise run `onInstall()`.
window.addEventListener('appinstalled', () => {
onInstall();
});
}