【问题标题】:beforeinstallprompt not trigger within a PWA's Vue appbeforeinstallprompt 不会在 PWA 的 Vue 应用程序中触发
【发布时间】:2020-07-20 12:39:33
【问题描述】:

我已经使用 vue cli 标准安装了 PWA 应用。 之后,我只需添加此guide 提供的代码。

但是当我访问 http://localhost:8080/ 时,什么都没有触发。

这是 App.vue 代码:

<template>
  <div id="app">
    <img alt="Vue logo" src="./assets/logo.png">
    <HelloWorld msg="PWA Test"/>
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'

let deferredPrompt;

function showInstallPromotion() {
  alert("ciao");
  console.log(deferredPrompt);
}

export default {
  name: 'App',
  components: {
    HelloWorld
  },
  created() {
    window.addEventListener('beforeinstallprompt', (e) => {
      alert("beforeinstallprompt");

      // Prevent the mini-infobar from appearing on mobile
      e.preventDefault();
      // Stash the event so it can be triggered later.
      deferredPrompt = e;
      // Update UI notify the user they can install the PWA
      showInstallPromotion();
    });
  },
  mounted() {
    if("serviceWorker" in navigator) {
      navigator.serviceWorker.register("service-worker.js").then(reg => {
          console.log("Registration succesful, scope: " + reg.scope);
      })
      .catch(err => {
          console.log(err);
      })
    }
  }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

明显的问题?我相信使用 vue cli 会受到尊重。如何检查清单是否正常以及是否已准备好使用 PWA 应用程序? 在这个世界上的第一步,我错在哪里?谢谢

这是我的 manifest.json(在公用文件夹中):

{
  "name": "vuejspwa",
  "short_name": "vuejspwa",
  "icons": [
    {
      "src": "./img/icons/android-chrome-192x192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "./img/icons/android-chrome-512x512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ],
  "start_url": "./index.html",
  "display": "fullscreen",
  "background_color": "#000000",
  "theme_color": "#4DBA87"
}

【问题讨论】:

    标签: vue.js progressive-web-apps


    【解决方案1】:

    您首先需要满足一些条件才能使您的应用可安装。

    标准是:

    • 应用尚未安装
    • 通过 HTTPS 提供服务(但也应使用 HTTP 在 localhost 中工作)
    • 包括 Web 应用清单

    清单如下所示:

    //manifest.webmanifest
    
    {
      "name": "My App",
      "short_name": "MA",
      "start_url": ".",
      "display": "standalone",
      "icons": [
      {
        "src": "images/touch/homescreen192.png",
        "sizes": "192x192",
        "type": "image/png"
      },
      {
        "src": "images/touch/homescreen512.png",
        "sizes": "512x512",
        "type: "image/png"
      }]
    }
    

    这是您需要的最少数量。然后将其包含在您的标题中:

    <link rel="manifest" href="/manifest.webmanifest">
    
    • 向 fetch 处理程序注册 service worker。

    那么如何注册worker呢?

    你使用 vue.js,所以 mounted() 是一个放置它的好地方:

    //check if service worker is available in browser
    
    if("serviceWorker" in navigator) {
       navigator.serviceWorker.register("path/to/service-worker.js").then(reg => {
          console.log("Registration succesful, scope: " + reg.scope);
       })
       .catch(err => {
          console.log(err);
       })
    }
    

    您需要提供您的工作人员的路径,如上例所示。 Service Worker 只是一个很小的 ​​javascript 文件。

    需求说你需要一个获取处理程序,所以让我们创建一个:

    //service-worker.js
    
    self.addEventListener('fetch', function(event) {
      event.respondWith(fetch(event.request));
    });
    

    就是这样。

    这种缓存方法称为“仅网络”,因为您只从网络而不是缓存加载资源。

    实际上它不是一种缓存方法,因为您不缓存任何内容,但是也有“离线优先”策略。我在这里推荐这个网站,它展示了许多策略以及如何使用它。

    https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook

    【讨论】:

    • 我已经关注你了,还是不行。我附上了我的清单。此外,服务人员似乎工作得很好(它记录了Registration succesful, scope: http://localhost:8080/
    • @markzzz 你的地址栏右边有安装图标吗?
    • 并非如此。您是指右上角带圆圈的 + 吗?
    • @markzzz 是的,如果你点击它应该会有一个安装提示
    • 我没有看到那个 ICON :) 我开始使用 npm run serve,但看不到它
    【解决方案2】:

    您无法在开发模式下测试pwa 功能。您首先必须将您的应用程序构建到生产环境并使用服务器来托管输出dist 文件夹。您可以使用 web server for chrome 等工具为您的应用提供测试服务。

    【讨论】:

    • 你可以在localhost中测试一下
    • @Ifaruki 我不确定你怎么能做到这一点。我有一个应用程序在构建时运行良好,但在开发时无法执行 pwa。
    • 我的本地主机 localhost:5500 上有一个应用程序,它运行良好
    • 你平时是用npm run start开头的吗?
    • 你是对的......使用 HTTPS 在线我可以看到引发的事件。谢谢
    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 2019-11-20
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    相关资源
    最近更新 更多