如何在Angular PWA中拦截应用安装提示?

时间:2019-02-13 15:10:52

标签: angular progressive-web-apps angular-pwa

我已经使用Angular guidelines创建了PWA。我在拦截应用程序安装横幅时遇到问题。我正在使用此代码将其推迟到以后:

let deferredPrompt;
window.addEventListener('beforeinstallprompt', (e) => {
  // Prevent Chrome 67 and earlier from automatically showing the prompt
  e.preventDefault();
  // Stash the event so it can be triggered later.
  deferredPrompt = e;
  console.log("Intercepting the app install banner prompt");

  setTimeout(function() {
    deferredPrompt.prompt();
  }, 20000);

  // 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;
  });
});

我的清单文件:

{
  "name": "TreadWill",
  "short_name": "TreadWill",
  "theme_color": "#2a3b3d",
  "background_color": "#2a3b3d",
  "display": "standalone",
  "scope": "/",
  "start_url": "/",
  "icons": [
    {
      "src": "assets/icons/icon-72x72.png",
      "sizes": "72x72",
      "type": "image/png"
    },
    {
      "src": "assets/icons/icon-96x96.png",
      "sizes": "96x96",
      "type": "image/png"
    },
    {
      "src": "assets/icons/icon-128x128.png",
      "sizes": "128x128",
      "type": "image/png"
    },
    {
      "src": "assets/icons/icon-144x144.png",
      "sizes": "144x144",
      "type": "image/png"
    },
    {
      "src": "assets/icons/icon-152x152.png",
      "sizes": "152x152",
      "type": "image/png"
    },
    {
      "src": "assets/icons/icon-192x192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "assets/icons/icon-384x384.png",
      "sizes": "384x384",
      "type": "image/png"
    },
    {
      "src": "assets/icons/icon-512x512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ]
}

当我在localhost中尝试此代码时,console.log中包含的消息将被记录,但是20秒后,我得到一个错误:

Uncaught (in promise) DOMException

在此行:

deferredPrompt.prompt();

当我托管代码并在移动设备上试用时,应用安装横幅会立即显示,而不是20秒后显示。

我尝试将这段代码放在index.html文件本身中,放在单独的js文件中,然后在index.html文件中调用它。创建服务,并在.ts文件中包含几乎类似的代码。没事。尽管我绝望地尝试了js解决方案,但我还是更喜欢Angular解决方案。理想情况下,我想捕获“ beforeinstallprompt”事件并将其存储在全局变量中,并在不同点提示该事件。

如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可能做得正确,但根据this article
“当站点满足添加到主屏幕条件时,无论您是否在beforeinstallprompt事件上阻止Default(),不管,都会出现迷你信息栏。”
对我来说,它也立即显示。

Pete LePage(@petele)是在Twitter上关注A2HS更新的好人。

这是我构建的“添加到主屏幕(A2HS)”测试仪。页面底部有一个指向源代码的链接。随意使用任何可能有用的东西。我最近尚未将其更新为最新版本的angular。但是,由于它是基本代码,因此一切仍然应该可以正常工作。
https://a2hs.glitch.me

答案 1 :(得分:1)

Mathias答案中提供的链接帮助我解决了问题。我只是添加了一些答案中未明确提及但可以帮助其他人的观点。

  • 只能在某些用户活动中显示应用程序安装横幅。例如-单击按钮。无法通过setTimeout进行提示。
  • 当前,拦截 beforeinstallprompt 并将其显示在以后的版本中可在Chrome和Edge中使用,因为当用户访问该网站时,Chrome和Edge会自动触发该事件。 Firefox不会触发 beforeinstallprompt 事件,因此无法在Firefox上运行。