PWA - 未调用beforeinstallprompt

sea*_*abr 18 progressive-web-apps

您好我正在尝试安装自定义PWA"添加到主屏幕".

ServiceWorkerRegistration成功.

但是函数beforeinstallpromp在注册后没有调用.

<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>
Run Code Online (Sandbox Code Playgroud)

我的服务工作者也在根目录... HTTPS是安全的!

我的清单:

{
  "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"
}
Run Code Online (Sandbox Code Playgroud)

只有当我设置"启用"chrome:// flags /#bypass-app-banner-engagement-checks时,它才有用


编辑:看起来就像我发现了问题.Chrome的DevTools(F12)的Audits选项卡提供调试信息. 在此输入图像描述

小智 16

试试这个 :

 <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>
Run Code Online (Sandbox Code Playgroud)

只有在某些条件为真时才会触发beforeinstallprompt:

  • PWA必须尚未安装
  • 满足用户参与启发式(用户必须与您的Web应用程序至少进行30次交互.
  • 您的网络应用必须包含网络应用清单.
  • 您的网络应用必须通过安全的HTTPS连接提供.
  • 已使用fetch事件处理程序注册了服务工作者.

  • 在哪里添加此脚本代码以确保您不会错过 beforeinstallprompt 事件? (2认同)

and*_*iya 14

除上述所有步骤外,还要检查该应用程序是否已在此处卸载: chrome://apps

只是从 Mac 上的 Chrome Apps 文件夹中删除该应用程序似乎不会将其从 Chrome 中删除

如果之前安装了该应用程序,beforeinstallprompt则不会触发该应用程序,也不会抛出任何错误:(


小智 6

对于任何需要阅读本文的人:我在尝试找出提示时在使用 Vue3 应用程序时遇到的一个小旁注:

beforeInstallPrompt将页面加载后不久触发。

因此,请确保在页面加载附近设置事件侦听器。我花了几个小时才发现这一点。我试图在用户注册的某个地方添加事件监听器。页面加载后的方式。并且无法弄清楚为什么提示没有显示。


Jac*_*one 5

是的,清单中的“start_url”不正确。

如果清单的任何部分被破坏,则不会触发“beforeinstallprompt”。

该事件未触发,因为...清单 start_url 不正确。

我最喜欢的解决方法是查看 DevTools 的 > NETWORK 选项卡中的 404。

查看清单损坏原因的另一种方法是在 DevTools 中运行 > AUDIT 并查看错误是什么。就像@sealabr 发现的那样:

“失败:服务工作线程未成功提供清单的 start_url,等待获取的 start_url 超时。” 这意味着“start_url”

该线程对生产故障排除有很大帮助。谢谢。