PWA DEMO
PWA 开发实战:核心实现与多端适配(PC/移动端/WebView)
PWA(Progressive Web App,渐进式网页应用)并非单一技术,而是整合 Service Worker、Web App Manifest、离线缓存、推送通知等技术的解决方案,旨在让网页具备原生 APP 级的体验(离线可用、添加到桌面、推送通知等)。本文从核心技术实现、多环境适配差异(PC/移动端/移动端WebView)两个维度,梳理完整的 PWA 开发流程与适配要点。
一、PWA 核心概述
1. 核心特性
- 离线可用:基于 Service Worker 实现资源缓存,断网仍可访问核心内容;
- 原生体验:通过 Web App Manifest 实现“添加到主屏幕”、全屏显示、自定义图标/主题色;
- 推送通知:支持系统级推送(部分浏览器受限);
- 性能优化:结合懒加载、缓存策略提升加载速度。
2. 兼容性核心结论
| 技术特性 | Chrome/Firefox(PC/移动端) | Safari(macOS/iOS) | 移动端 WebView |
|---|---|---|---|
| Service Worker | 完全支持 | iOS 14.3+/macOS 11+ | Android 支持,iOS 14.3+ 支持 |
| Web App Manifest | 完全支持 | iOS 15+/macOS 12+ | Android 支持,iOS 部分支持 |
| 推送通知 | 完全支持 | 不支持 | Android 支持,iOS 不支持 |
| 添加到主屏幕 | 支持(快捷方式) | iOS 15+ 支持 | 几乎不支持(受 APP 限制) |
二、PWA 核心技术实现(完整优化版)
1. 项目目录结构
1 | |
2. 核心文件实现(优化版)
(1)index.html(主页面)
优化点:规范 meta 标签、补充 PWA 必要配置、修复资源引用路径
1 | |
(2)manifest.json(Web App 配置)
优化点:补充注释、规范字段、适配 iOS/Safari 兼容
1 | |
(3)data/list.js(示例数据,补充缺失依赖)
1 | |
(4)app.js(注册 Service Worker/通知授权)
优化点:补充错误处理、兼容iOS、优化通知逻辑
1 | |
(5)sw.js(Service Worker 核心逻辑)
优化点:补充缓存版本管理、过期缓存清理、离线回退策略
1 | |
(6)page.js(页面渲染/图片懒加载)
优化点:修复模板字符串语法错误、补充注释、优化懒加载逻辑
1 | |
三、PWA 在不同环境的使用差异(核心重点)
1. 核心差异对比表
| 维度 | PC 端(Chrome/Firefox/Safari) | 移动端原生浏览器(Chrome/Safari) | 移动端 WebView(APP 内嵌) |
|---|---|---|---|
| Service Worker | Chrome/Firefox 完全支持; Safari(macOS) 11.1+ 支持 |
Chrome/Edge 完全支持; iOS Safari 14.3+ 支持 |
Android WebView(Chrome 内核)支持; iOS WKWebView 14.3+ 支持(需配置); 低版本 iOS 不支持 |
| Manifest 生效 | Chrome/Firefox:添加到桌面为快捷方式,图标/主题色生效; Safari:仅部分字段生效 |
Chrome/Edge:添加入主屏幕(原生APP图标),全屏/主题色生效; iOS Safari 15+:添加入主屏幕,无启动画面 |
Android:部分生效; iOS:几乎不生效; 无法添加入主屏幕 |
| 推送通知 | Chrome/Firefox 支持; Safari 不支持 |
Chrome/Edge 支持; iOS Safari 不支持 |
Android:需 APP 授予权限,依赖 WebView 配置; iOS:完全不支持 |
| 离线缓存 | 完全支持(缓存到浏览器) | 完全支持(缓存到手机本地) | Android:支持; iOS:14.3+ 支持,缓存空间受限 |
| 交互体验 | 独立窗口运行,通知在系统通知中心 | 全屏/独立窗口,通知在手机通知栏,支持手势返回 | 受 APP 容器限制,无独立窗口,手势由 APP 控制 |
| 权限管理 | 通知/缓存权限由浏览器控制 | 通知权限需用户手动授权,iOS 需多次确认 | 权限由 APP 配置(如 WebView 设置允许 JS/缓存) |
2. 各环境适配要点
(1)PC 端适配
- 兼容重点:
- Safari(macOS):Manifest 的
display: standalone无效(仍显示浏览器地址栏),推送通知不支持; - 不同桌面分辨率适配(独立窗口的布局不会自适应,需 CSS 媒体查询)。
- Safari(macOS):Manifest 的
- 体验优化:
- 添加入桌面的快捷方式图标建议适配 256x256 尺寸;
- 通知内容适配桌面端显示(避免移动端专属文案)。
(2)移动端原生浏览器适配
- 兼容重点:
- iOS Safari:
- 需添加
apple-touch-icon/apple-mobile-web-app-*系列 meta 标签; - Manifest 的
background_color/theme_color需与 iOS 专属 meta 一致; - 推送通知完全不支持,需降级为“站内通知”;
- 需添加
- Android:
- 图标需添加
purpose: maskable(适配安卓面具图标裁剪规则); display: standalone需配合scope避免路径问题。
- 图标需添加
- iOS Safari:
- 体验优化:
- 适配移动端触摸交互(如点击/滑动);
- 启动画面背景色与页面主题色一致,提升原生感。
(3)移动端 WebView 适配(APP 内嵌)
- Android WebView 配置(需 APP 开发配合):
1
2
3
4
5
6
7
8
9
10
11
12// 启用 JS(必须)
webSettings.setJavaScriptEnabled(true);
// 启用 DOM 存储(缓存依赖)
webSettings.setDomStorageEnabled(true);
// 启用缓存
webSettings.setAppCacheEnabled(true);
// 允许 Service Worker
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
webSettings.setAllowUniversalAccessFromFileURLs(true);
}
// 允许混合内容(HTTPS 页面加载 HTTP 资源)
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); - iOS WKWebView 配置(需 APP 开发配合):
1
2
3
4
5
6
7
8// 启用 JS
webView.configuration.preferences.javaScriptEnabled = true
// 启用缓存
webView.configuration.websiteDataStore = WKWebsiteDataStore.default()
// iOS 14.3+ 允许 Service Worker
if #available(iOS 14.3, *) {
webView.configuration.defaultWebpagePreferences.allowsContentJavaScript = true
} - 核心限制:
- 无法实现“添加入主屏幕”;
- 推送通知需通过 APP 原生推送实现;
- Service Worker 可能被 APP 退出后销毁,离线缓存不稳定。
四、部署与调试注意事项
1. 部署要求
- HTTPS 环境:Service Worker/Manifest 仅在 HTTPS(localhost 除外)下生效,生产环境需配置 SSL 证书;
- 路径一致性:
manifest.json的start_url/scope需与部署路径一致,避免 SW 控制范围异常; - 缓存清理:更新 SW 时需修改
cacheName,否则浏览器会使用旧缓存。
2. 调试工具
- Chrome DevTools:
Application面板可调试 Service Worker/Manifest/缓存; - Safari 调试:开启“开发”菜单后,
Develop > 显示 Web 检查器; - 移动端调试:Chrome DevTools 的
Remote Devices可远程调试手机端 PWA。
五、参考资料
- MDN PWA 官方文档:https://developer.mozilla.org/zh-CN/docs/Web/Progressive_web_apps/Introduction
- Web App Manifest 规范:https://w3c.github.io/manifest/
- Service Worker 最佳实践:https://web.dev/service-workers/
- PWA 多端兼容指南:https://web.dev/pwa-checklist/
总结
- 核心技术:PWA 实现的关键是 Service Worker(离线缓存)+ Manifest(原生体验)+ 通知授权(交互增强),三者缺一不可;
- 环境适配:
- PC 端:优先兼容 Chrome/Firefox,Safari 降级处理推送/Manifest;
- 移动端:iOS Safari 需补充专属 meta 标签,放弃推送通知;
- WebView:依赖 APP 端配置,核心保障 Service Worker/离线缓存生效;
- 开发原则:PWA 是“渐进式增强”,需保证无 PWA 支持的浏览器仍能正常访问核心内容,避免兼容性导致页面不可用。
通过以上实现与适配方案,可在多环境下落地具备离线可用、原生体验的 PWA 应用,兼顾 PC/移动端/WebView 的核心体验。
PWA DEMO
https://cszy.top/20201215-h5-pwa/