Bonjour, j'essaie d'installer un PWA personnalisé "Ajouter à l'écran d'accueil".
L'enregistrement ServiceWorker est réussi.
Mais la fonction beforeinstallpromp n'appelle pas après s'inscrire.
<script type="text/javascript">
function request_debug(paramdata){
document.getElementById('output').innerHTML += '<BR>'+ paramdata;
}
window.addEventListener('load', function() {
document.getElementById('output').style.display = "block";
if('serviceWorker' in navigator) {
navigator.serviceWorker.register('sw.js').then(function(registration) {
console.log('Service worker registrado com sucesso:', registration);
request_debug(registration);
}).catch(function(error) {
console.log('Falha ao Registrar o Service Worker:', error);
request_debug(error);
});
var isTooSoon = true;
window.addEventListener('beforeinstallprompt', function(e) {
//e.preventDefault();
//e.Prompt();
//promptEvent = e;
request_debug(' window.addEventListener beforeinstallprompt fired!')
if (isTooSoon) {
//e.preventDefault(); // Prevents Prompt display
// Prompt later instead:
setTimeout(function() {
isTooSoon = false;
e.Prompt(); // Throws if called more than once or default not prevented
}, 4000);
}
});
}else{
console.log('serviceWorker not in navigator');
request_debug('serviceWorker not in navigator');
}
});
</script>
De plus, mon agent de service dans le répertoire racine ... HTTPS est sécurisé!
mon manifeste:
{
"background_color": "purple",
"description": "lojaportaldotricot TESTE",
"display": "standalone",
"icons": [
{
"src": "/componentes/serviceWorker/fox-icon.png",
"sizes": "192x192",
"type": "image/png"
}
],
"name": "lojaportaldotricot",
"short_name": "lojaportaldotricot",
"start_url": "/dashboard"
}
Cela ne fonctionne que lorsque je définis "Enable" chrome: // flags/# bypass-app-banner-engagement-checks
Edit: On dirait que j'ai trouvé le problème. Les onglets Audits de l'outil de développement de Chrome (F12) fournissent des informations sur le débogage .
Essaye ça :
<script>
let deferredPrompt;
window.addEventListener('beforeinstallprompt', function(event) {
// Prevent Chrome 67 and earlier from automatically showing the Prompt
e.preventDefault();
// Stash the event so it can be triggered later.
deferredPrompt = e;
});
// Installation must be done by a user gesture! Here, the button click
btnAdd.addEventListener('click', (e) => {
// hide our user interface that shows our A2HS button
btnAdd.style.display = 'none';
// Show the Prompt
deferredPrompt.Prompt();
// Wait for the user to respond to the Prompt
deferredPrompt.userChoice
.then((choiceResult) => {
if (choiceResult.outcome === 'accepted') {
console.log('User accepted the A2HS Prompt');
} else {
console.log('User dismissed the A2HS Prompt');
}
deferredPrompt = null;
});
});
</script>
beforeinstallprompt ne sera déclenché que si certaines conditions sont remplies:
Incluez-vous le fichier manifeste dans l'en-tête de la page?
<link rel="manifest" href="/manifest.json">
Oui, "start_url" est incorrect dans le manifeste.
SI UNE PARTIE DU MANIFESTE IS CASSÉ 'beforeinstallprompt' n'est pas déclenchée.
L'événement n'est pas déclenché parce que ... le manifeste start_url est incorrect.
Ma façon préférée de comprendre cela est de regarder dans l'onglet> RÉSEAU de DevTools for 404's.
ET l’autre façon de voir pourquoi manifeste est cassé, c’est d’exécuter> AUDIT dans DevTools et de voir l’erreur. Comme ce que @sealabr a trouvé:
"Échecs: le technicien de service ne sert pas avec succès l'adresse start_url du manifeste, Délai d'attente pour l'attente start_url. Ce qui signifie le 'start_url "
Ce fil était une aide précieuse pour le dépannage de la production. Merci.