uniapp PWA 小白指南

1,380 阅读5分钟

什么是PWA

PWA 即渐进式 Web 应用程序(Progressive Web App),是一种利用多种现代 Web 技术构建的,能够提供类似原生应用体验的 Web 应用。以下是关于 PWA 的详细介绍:

特点

  • 渐进式增强:PWA 采用渐进式增强的策略,这意味着它可以在各种不同性能和功能的设备与浏览器上运行,从最简单的功能手机浏览器到最先进的桌面浏览器,都能为用户提供基本可用的体验,并在支持更多特性的环境中展现出更强大的功能。

  • 类似原生应用的体验 :

    • 安装便捷性:用户可以像安装原生应用一样,将 PWA 添加到设备的主屏幕上,通过点击图标直接启动,无需在浏览器中输入网址来访问。
    • 界面与交互:具备与原生应用相似的界面和交互方式,响应式设计让它能适应各种屏幕尺寸,提供流畅的操作体验,如触摸手势、动画效果等。
    • 离线访问:借助 Service Worker 技术,PWA 能够在离线状态下运行,即使没有网络连接,用户仍然可以使用之前缓存的页面和功能,例如下载好的文章、图片等内容依然可以查看。
    • 推送通知:支持向用户推送通知,就像原生应用一样,可以及时提醒用户有新的消息、内容更新或其他相关事件,增加用户的参与度和留存率。
  • 跨平台兼容性:基于 Web 技术构建,使用 HTML、CSS 和 JavaScript 等通用的 Web 开发语言,因此可以在多种操作系统和设备上运行,如安卓、iOS、Windows 等,大大降低了开发成本和维护难度,开发人员无需为不同平台开发多个版本的应用。

  • 安全性:要求必须使用 HTTPS 协议进行数据传输,确保数据的安全性和完整性,防止数据在传输过程中被窃取或篡改。

指南前提

1. 我的网页应用不需要访问网络服务

2. uniapp 已经打包好网页应用 部署文件,这是我的部署文件目录

image.png

目标

将网页应用一键安装到手机桌面及电脑桌面,即便处于无网络状态,应用也能运行

1. 创建manifest.json文件

{
    // PWA 的名称,它将显示在设备的主屏幕、应用启动器等位置。
    "name": "出口计算",
    // PWA 的简短名称,当空间有限时,如在设备主屏幕上图标下方显示的名称,会优先使用短名称
    "short_name": "出口计算",
    // PWA 在不同设备和场景下使用的图标。可以指定多种尺寸的图标,以适应各种屏幕分辨率和设备类型 
    "icons": [
        {
            "src": "static/logo.png",
            "sizes": "192x192",
            "type": "image/png"
        },
        {
            "src": "static/logo.png",
            "sizes": "512x512",
            "type": "image/png"
        }
    ],
    // 通常是应用的首页或主要入口点指定 PWA 启动时加载的 URL。通常是应用的首页或主要入口点
    "start_url": "/index.html",
    // 有多种模式可供选择,如`fullscreen`(全屏显示)、`standalone`(类似原生应用)、`minimal-ui`(简约模式)
    "display": "standalone",
    // 启动时的背景颜色,在应用启动瞬间或加载过程中显示。
    "background_color": "#ffffff",
    // 定义 PWA 的主题颜色,它将影响浏览器的地址栏、任务栏等界面元素的颜色。
    "theme_color": "#000000"
}

manifest.json文件放到根目录下

image.png

2. 创建service-worker.js文件

// 表示缓存的名称。在 Service Worker 的生命周期中,缓存名称用于标识不同版本的缓存,以便在更新缓存策略时能够区分新旧缓存。
const CACHE_NAME = 'my-site-cache-v1';
// 该数组包含了一系列需要被缓存的文件路径, 就是没有网络时能够加载的文件,从而实现离线加载的效果
// 这个是 重点 重点 重点
const urlsToCache = [
    '/',
    '/index.html',
    'static/economy.png',
    'static/economy1.png',
    'static/first.png',
    'static/first1.png',
    'static/logo.jpg',
    'static/logo.png',
    'static/index.2da1efab.css',
    'static/js/chunk-vendors.33095592.js',
    'static/js/index.d9e92b04.js',
    'static/js/pages-index-index.db2941e1.js',
    'static/js/pages-index-index~pages-second-index.d7e90aff.js',
    'static/js/pages-second-index.00c859f3.js',
];
// Service Worker 安装时,将指定的文件列表缓存起来,以便在后续的网络请求中使用
self.addEventListener('install', function (event) {
    // 安装Service Worker时,缓存文件
    event.waitUntil(
        caches.open(CACHE_NAME).then(function (cache) {
            return cache.addAll(urlsToCache);
        })
    );
});
// Service Worker 接收到网络请求时,尝试从缓存中获取资源,如果缓存中没有,则向服务器发起请求,
self.addEventListener('fetch', function (event) {
    // 拦截网络请求,尝试从缓存中获取资源
    event.respondWith(
        caches.match(event.request).then(function (response) {
            if (response) {
                return response;
            }
            return fetch(event.request);
        })
    );
});

service-worker文件放到根目录下

image.png

3. 修改index.html文件

3.1 引入manifest.json文件

<head>
    <meta charset=utf-8>
    <meta http-equiv=X-UA-Compatible content="IE=edge">
    <title>expressDelivery</title>
    <script>var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS.supports('top: constant(a)'))
        document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + (coverSupport ? ', viewport-fit=cover' : '') + '" />')</script>
     <!-- 引入manifest.json语句 -->
    <link rel="manifest" href="manifest.json">
    <link rel=stylesheet href=/static/index.2da1efab.css>
</head>

3.2 注册service-worker.js文件

<body><noscript><strong>Please enable JavaScript to continue.</strong></noscript>
    <div id=app></div>
    <script src=/static/js/chunk-vendors.33095592.js></script>
    <script src=/static/js/index.d9e92b04.js></script>
    // 注册Service Worker
    <script defer>
        if ('serviceWorker' in navigator) {
            navigator.serviceWorker.register('service-worker.js')
                .then(function (registration) {
                    console.log('Service Worker注册成功');
                })
                .catch(function (error) {
                    console.log('Service Worker注册失败:', error);
                });
        }
    </script>
</body>

4. 部署并安装应用

将根目录下的全部文件部署到服务器上 我使用的是unicloud前端网页托管

image.png

使用域名打开网页 即可安装使用网页应用 网页必须是https协议

(谷歌浏览器)PC端

image.png

(edge浏览器)手机端

75740263cb71041167ddac96000c77d.jpg

(谷歌浏览器)手机端

a56eec96eb9c5cbfdade66c823aedc8.jpg

(Safari 浏览器)iOS手机端

1. 打开 Safari 浏览器,打开网页,然后点击下面的发送按钮

image.png

2. 选择“添加到主屏幕”

image.png