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 应用,也不会出现安装按钮。



  • 2020-11-22 22:58:52

    Android LiveData Transformations

    有时候有这样的需求,需要在LiveData将变化的数据通知给观察者前,改变数据的类型;或者是返回一个不一样的LiveData。

  • 2020-11-22 23:00:16

    androidx中的lifecycle组件

    Lifecycle-aware components生命周期感知组件执行操作,以响应另一个组件生命周期状态的更改,例如Activity和Fragment。这些组件可以帮助您生成更有组织、更容易维护的轻量级代码。

  • 2020-11-22 23:02:50

    Android数据存储之DataBase的Room

    Room是Google在AndroidX中提供的一个ORM(Object Relational Mapping,对象关系映射)库。它是在SQLite上提供的一个抽象层,可以使用SQLite的全部功能,同时可以更好更便捷流畅地访问数据库。(关于AndroidX可以参考

  • 2020-11-22 23:04:39

    Android组件 LiveData与MutableLiveData教程

    LiveData与ViewMode是经常搭配在一起使用的,但是为了不太混乱,我还是拆分开来说明,此篇博客只讲解 LiveData 与 MutableLiveData的概念与使用方式(但是会涉及到ViewMode的部分代码).

  • 2020-11-22 23:14:52

    Dagger 2 在 Android 上的用法

    在前面的文章我们介绍了Dagger2 中的大部分注解的使用,接下来我们从源码角度分析下第一篇文章中例子的原理。

  • 2020-11-22 23:18:59

    Android开发从Dagger2迁移至Kodein的感受

    最近个人在尝试构建 Kotlin版本 的Android MVVM开发框架,在依赖注入框架的选型上,我最终选择了 Kodein 。这是一个非常轻量级的DI框架,相比于配置繁琐的Dagger(繁琐的配置也是导致Dagger学习成本一直居高不下的原因!),它的配置过程更清晰且简单,并且,这个库的源码也是 Kotlin 的。

  • 2020-11-22 23:25:56

    Dagger2源码解析inject过程

    添加inject后,通过编译生成的DaggerMainComponent类来导入,说明编译以后生成了一些类,那到底生成了什么类呢。 Module和Component又是什么,该怎么里理解 在这篇文章后里将一一讨论。

  • 2020-11-22 23:27:28

    dagger学习教程

    dagger android 学习(一):dagger基础使用 dagger android 学习(二):AndroidInjector的使用 dagger android 学习(三):ContributesAndroidInjector的进一步优化 dagger android 学习(四):基于dagger2的mvp架构

  • 2020-11-22 23:31:22

    Dagger2与AndroidInjector详解

    相信使用过Dagger开发Android应用的小伙伴会知道(如果你还不是很了解Daager,可以先看我之前的一篇基本介绍:Dagger2使用攻略),我们会在Activity或Fragment的生命周期方法中执行成员注入。比如这样: