PWA:安装 Web 应用

2020-03-03 21:35:57

参考地址 PWA:安装 Web 应用

初识 PWA

要完整介绍 PWA 是什么,需要扯一堆名词,毫无意义。
以改造公羊阅读的过程为例,简要的说明什么是 PWA。

公羊阅读是个网站,将它改造成 PWA 应用之后,在谷歌浏览器上点击右上角三个小点点,可以看到安装按钮。
(没有改造成 PWA 的网站是看不到安装按钮的~~)

图1

点击安装,完成后会发现生成了桌面应用图标,像原生 App 一样点击一下图标即可进入。

图2

PWA 不只是改变 Web 网站的入口,点击进入应用,可以看到没有浏览器中的地址栏,看起来就跟原生应用一毛一样。

图3

在谷歌浏览器中输入 chrome://apps 可以查看安装了哪些 PWA 应用,选择应用,右键可以卸载该应用。

图4

移动端也是一样的,在手机浏览器上访问公羊阅读的网址:https://novel.dkvirus.top ,在网页最下方可以看到提示框:"将公羊阅读添加到主屏幕",点击即可添加到桌面。

图5

注意:移动端并不是所有机型都支持添加到桌面功能。

  • 360N6 手机就不支持,

  • IPhone XR 可以支持添加到主屏幕。

身边测试手机机型有限,欢迎给我发邮件说明你的测试结果 me@dkvirus.com

将网站改造成 PWA 应用

这部分从头介绍如何将一个网站改造成 PWA 应用。

搭建一个网站

PWA 要求一:网址必须是 https 协议,或者域名是 localhost。

本地测试只要保证访问域名是 localhost 即可,创建一个网页 index.html,然后部署到 nginx 服务器上,通过 localhost 访问 index.html。

不了解 Web 服务器的参考:图解 Web 服务器

创建 index.html 文件

<!DOCTYPE html><html lang="en"><head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>PWA DEMO</title></head><body>
    <h1>将网站改造成 pwa 应用</h1></body></html>

manifest.json

PWA 要求2:包含 manifest.json 中关键字段:short_name/name、icons、start_url、display;

manifest.json 定义了Web 应用的参数,比如:Web 应用叫什么名字、Web 应用的图标是啥等等。

在 index.html 同级目录下创建 manifest.json 文件

{
    "name": "测试PWA",
    "start_url": "/index.html",
    "display": "standalone",
    "icons": [
        {
            "src": "logo.png",
            "sizes": "192x192",
            "type": "image/png"
        }
    ]}

属性说明:

  • name 安装应用的名称,比如上面👆的 公羊阅读

  • start_url 点击图标进入应用,访问的第一个页面;

  • display 有三个值 fullscreen(全屏展示)、standalone(不包含浏览器的地址栏)、minimal-ui;

  • icons 应用的图标,自己找个图标命名为 logo.png 放在根目录下即可。

在 index.html 的 header 属性中引入 manifest.json 文件

// index.html<head>
    // ......    <link rel="manifest" href="manifest.json"></head>

sw.js

PWA 要求三:注册 Service Worker 并且监听 fetch 事件;

Service Worker 是 PWA 的另外一个知识点,主要用来做缓存,这里不多介绍。

在 index.html 同级目录下创建 sw.js 文件(sw 是 service worker 的首字母拼接),监听 fetch 事件。

self.addEventListener('fetch', function (evt) {
    console.log('sw fetch() 发送的请求', evt.request.url)})

在 index.html 中注册 sw.js

<body>
    <h1>将网站改造成 pwa 应用</h1>
    <script>
        // 判断浏览器是否支持 service worker
        if ('serviceWorker' in navigator) {
            // load 事件完成之后才注册 service worker
            window.addEventListener('load', function () {
                // 注册 sw.js
                navigator.serviceWorker.register('/sw.js')
                    .then(function (registration) {
                        // 注册成功
                        console.log('sw.js 注册成功', registration.scope);
                    })
                    .catch(function (err) {
                        // 注册失败:(
                        console.log('sw.js 注册失败 ', err);
                    });
            });
        }
    </script></body>

验证结果

启动 nginx 服务器,访问网址,浏览器右上角三个点点可以找到安装按钮。

图6

如果没有安装按钮,请检查是否符合上述介绍的三个要求,亦或是您已经安装过 Web 应用,也不会出现安装按钮。



  • 2017-09-14 10:18:25

    15分钟成为Git专家

    不管是以前使用过 Git 还是刚开始使用这个神奇的版本控制工具的开发者,阅读了本文以后都会收获颇丰。如果你是应一名有经验的 GIT 使用者,你会更好的理解 checkout -> modify -> commit 这个过程。如果你刚开始使用 Git,本文将给你一个很好的开端。

  • 2017-09-28 16:42:57

    Linux vmstat命令实战详解

    vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。

  • 2017-10-13 16:21:29

    Activity的四种launchMode

    launchMode在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity实例公用一个task里。这里简单介绍一下task的概念,task是一个具有栈结构的对象,一个task可以管理多个Activity,启动一个应用,也就创建一个与之对应的task。

  • 2017-10-16 16:45:45

    Android开发技巧:Application和Instance

    在开发过程中,我们经常会需要用到一些全局的变量或者全局的“管理者”,例如QQ,需要有一个“全局的管理者“保存好友信息,各个activity即可直接通过该”管理者“来获取和修改某个好友信息,显然,这样的一个好友信息,保存到某一个具体的activity里面,然后依靠activity的intent来传递参数是不合适。我们有两种方法来实现这样一个全局的管理者,一种是使用C++/Java中常用的单例模式,另一种是利用Android的Application类,下面一一阐述。

  • 2017-11-01 01:30:45

    解决第三方包内jar包冲突

    这个问题就是因为引入jar包的冲突,这时我们可以在build.gradle中添加如下代码,下方单独的是添加的代码

  • 2017-11-06 01:00:17

    撤销git add

    如何撤销git add,不小心执行了git add . 操作,但是又不能提交所有的文件,因为对应不同的分支,现在怎么样可以将git add 撤销回来

  • 2017-11-10 00:06:15

    CORS: credentials mode is 'include'

    XMLHttpRequest cannot load http://localhost/Foo.API/token. The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. Origin 'http://localhost:5000' is therefore not allowed access. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.