Installation von Ihrer PWA auslösen
Warnung:
Die hier beschriebene Technik hängt von dem beforeinstallprompt
-Ereignis ab, das nicht standardisiert ist und derzeit nur in auf Chromium basierenden Browsern implementiert ist.
Standardmäßig zeigt der Browser, wenn ein Benutzer Ihre Website besucht und der Browser feststellt, dass die Seite als PWA installierbar ist, eine integrierte Benutzeroberfläche – zum Beispiel ein Symbol in der URL-Leiste – um die Installation der Website anzustoßen. Wenn der Benutzer auf das Symbol klickt, zeigt der Browser ein Installationsfenster an, das mindestens den Namen und das Icon der App enthält. Wenn der Benutzer zustimmt, die App zu installieren, wird sie installiert.
Sie können jedoch Ihre eigene In-App-Benutzeroberfläche implementieren, um den Benutzer zu fragen, ob er die App installieren möchte, was den Installationsdialog auslöst. Die Vorteile dabei sind:
- Sie können mehr Kontext über die App bieten und dem Benutzer erklären, warum er sie als PWA installieren sollte.
- Eine In-App-Installationsoberfläche ist wahrscheinlich leichter für Benutzer zu entdecken und zu verstehen als die Standard-Benutzeroberfläche des Browsers.
Hinzufügen einer In-App-Installationsoberfläche
Zuerst fügen Sie Ihrer App eine Benutzeroberfläche hinzu, die anzeigt, dass der Benutzer die App installieren kann. Zum Beispiel:
<button id="install" hidden>Install</button>
Wir setzen das hidden
-Attribut des Buttons, da die Installationsoberfläche nicht sichtbar sein soll, wenn der Benutzer die App mit einem Browser besucht, der die Installation nicht unterstützt. Als nächstes werden wir sehen, wie man den Button nur für Browser sichtbar macht, die die lokale Installation von PWAs unterstützen.
Zuhören auf beforeinstallprompt
Sobald der Browser festgestellt hat, dass er die App installieren kann, löst er das beforeinstallprompt
-Ereignis im globalen Window
-Bereich aus.
In unserem Haupt-App-Code werden wir auf dieses Ereignis hören:
// main.js
let installPrompt = null;
const installButton = document.querySelector("#install");
window.addEventListener("beforeinstallprompt", (event) => {
event.preventDefault();
installPrompt = event;
installButton.removeAttribute("hidden");
});
Der Ereignishandler macht hier drei Dinge:
- Rufen Sie
preventDefault()
für das Ereignis auf. Dadurch wird verhindert, dass der Browser seine eigene Installationsoberfläche anzeigt. - Nehmen Sie eine Referenz auf das Ereignisobjekt, das in den Handler übergeben wird. Dies ist eine Instanz von
BeforeInstallPromptEvent
und ermöglicht uns, den Benutzer zur Installation der App aufzufordern. - Zeigen Sie unsere In-App-Installationsoberfläche an, indem Sie das
hidden
-Attribut auf dem Button entfernen.
Auslösen des Installationsdialogs
Als nächstes müssen wir einen Klick-Handler zu unserem In-App-Installationsbutton hinzufügen:
// main.js
installButton.addEventListener("click", async () => {
if (!installPrompt) {
return;
}
const result = await installPrompt.prompt();
console.log(`Install prompt was: ${result.outcome}`);
disableInAppInstallPrompt();
});
function disableInAppInstallPrompt() {
installPrompt = null;
installButton.setAttribute("hidden", "");
}
Die Variable installPrompt
wurde mit dem BeforeInstallPromptEvent
-Objekt in unserem beforeinstallprompt
-Ereignishandler initialisiert. Falls installPrompt
aus irgendeinem Grund nicht initialisiert wurde, tun wir nichts.
Andernfalls rufen wir die Methode prompt()
auf. Dies zeigt das Installationsdialogfeld an und gibt ein Promise
zurück, das mit einem Objekt aufgelöst wird, das anzeigt, ob die App installiert wurde oder nicht. Insbesondere ist die outcome
-Eigenschaft "accepted"
, wenn der Benutzer sich entschieden hat, die App zu installieren, oder "dismissed"
, wenn er den Dialog abgelehnt hat.
In jedem Fall müssen wir unseren Zustand nach dem Aufrufen von prompt()
zurücksetzen, da wir es nur einmal für jede BeforeInstallPromptEvent
-Instanz aufrufen können. Also setzen wir unsere Variable installPrompt
zurück und verstecken den Installationsbutton erneut.
Reagieren auf App-Installation
Je nach Browser und Plattform kann es sein, dass der Browser auch nach wie vor seine eigene Benutzeroberfläche zur Installation der App anbietet. Dies bedeutet, dass die App möglicherweise installiert wird, ohne unsere In-App-Installationsoberfläche zu durchlaufen. Wenn dies geschieht, möchten wir die In-App-Installationsoberfläche deaktivieren, oder wir zeigen sie in einer bereits installierten App an.
Um dies zu erreichen, können wir auf das appinstalled
-Ereignis hören, das im globalen Window
-Bereich ausgelöst wird, wenn die App installiert wurde:
// main.js
window.addEventListener("appinstalled", () => {
disableInAppInstallPrompt();
});
function disableInAppInstallPrompt() {
installPrompt = null;
installButton.setAttribute("hidden", "");
}
Reagieren auf plattformspezifische App-Installationen
Ein Fall, der in den obigen Beispielen nicht abgedeckt ist, ist der, wenn Sie neben einer Web-App auch eine plattformspezifische Version der App haben und das Web-App-Erlebnis personalisieren möchten, je nachdem, ob die plattformspezifische App bereits installiert ist. Möglicherweise möchten Sie Benutzer nicht einladen, die PWA zu installieren, wenn sie die plattformspezifische App bereits installiert haben und/oder Sie möchten sie einladen, zur plattformspezifischen App zu wechseln, um Inhalte anzusehen.
Dies kann mit der Methode Navigator.getInstalledRelatedApps()
gehandhabt werden, die es Ihnen ermöglicht, installierte verwandte plattformspezifische Apps (oder PWAs) zu erkennen und entsprechend zu reagieren.
Zum Beispiel:
const relatedApps = await navigator.getInstalledRelatedApps();
// Search for a specific installed platform-specific app
const psApp = relatedApps.find((app) => app.id === "com.example.myapp");
if (psApp) {
// Update UI as appropriate
}
Diese Methode könnte auch mit beforeinstallprompt
kombiniert werden, um die Installationsoberfläche des Browsers basierend auf der Verfügbarkeit einer plattformspezifischen App zu unterdrücken:
window.addEventListener("beforeinstallprompt", async (event) => {
const relatedApps = await navigator.getInstalledRelatedApps();
// Search for a specific installed platform-specific app
const psApp = relatedApps.find((app) => app.id === "com.example.myapp");
if (psApp) {
event.preventDefault();
// Update UI as appropriate
}
});
Siehe auch
- Making PWAs installable
beforeinstallprompt
Ereignis- How to provide your own in-app install experience auf web.dev (2021)