PWA
互联网是一个不可思议的平台。它横跨不同设备和操作系统。其与生俱来的可链接性,使得它可以被搜索,从任何地方分享给任何人。
What are PWA(Progressive Web Apps)?
Web 应用是运行在浏览器里的代码。其优势是可以使用一套代码在任何设备、任何地方,触达任何人。无论何时访问网站,它的内容都可以是最新的。
原生应用以独立的体验在用户设备上启动,可以从本地文件系统读写文件,通过USB、蓝牙等访问与设备连接的硬件,甚至同设备上存储的数据交互,如:联系人、日历事件。原生应用就像是其所运行的设备的一部分。
如果从功能和覆盖范围两个维度看,原生应用代表了最佳功能,而 Web 应用代表了最好的覆盖范围。
Web APIs 规范和接口一览。
可以看到尽管目前一些功能仍然在 Web 应用的能力范围之外,但是新的即将到来的 APIs 将改变和扩展 Web 应用的能力。
渐进式 Web 应用程序(PWA)是使用了现代 APIs 构建和增强,提供类似原生应用的功能性、可靠性和可安装性,同时保留了Web应用的最佳覆盖范围。PWA本质上就是Web应用。通过使用 service workers和一个web app manifest 使得一个Web应用变得可靠、可安装。即使新功能不可用,用户仍然获得核心体验。
PWA最佳实现核心清单
- fast load time
- 跨浏览器 首先分析出核心功能,以尽可能简单的技术使这些功能可用。 通过跨浏览器功能检测,可以为最广泛的潜在用户提供可用的体验
- 自适应各种屏幕尺寸 移动端设备需要开发团队集中在应用里最重要的数据和行为上。关于响应式设计有 content-first design 和 content-out responsive layouts
- Custom Offline Page 无论是用户导航至一个没有缓存的url,还是尝试使用一个需要网络连接的功能,不要仅仅扔一个浏览器的默认离线页,提供一个类似原生的体验。
- Installable 安装 PWA 使它看起来、感觉上、表现上像其他安装的app。我们为什么想要用户安装我们的Web应用程序?与我们希望用户从任何应用商店中安装原生应用的原因是一样的。提供这样的体验带来更好的参与体验,从而获得更频繁的访问、更长的留存时间、更高频的互动。
前三点同样适用于H5最佳实践,因此让我们重点来看后两点。
怎样让一个PWA可安装?
当 PWA 满足某些条件时,浏览器会提示用户可以安装。准确的说是 Add to Home Screen(添加到主屏)。
如:浏览器地址栏里出现一个 Install 按钮。
当满足标准,浏览器会触发一个 beforeinstallprompt
事件,通过绑定事件处理函数可以直接从 PWA 开启 install flow。
以Chrome为例,需满足条件:
- web app 还未安装 2.满足用户参与的启发式的方法 3.通过 https 访问(即满足 secure context。本地开发 localhost 也认为是安全的context) 4.有一个 web app manifest 文件,包含以下核心属性:
name
orshort_name
- 必须有一个192px 和一个 512px的 icon
start_url
display
值必须是 fullscreen, standalone, 或 minimal-ui 其中之一prefer_related_applications
要么不写,要么置为 false
5.注册一个包含 fetch
处理函数的 service worker
其他浏览器的安装标准可能有细微的不同,点击 查看完整细节
接下来,让我们动手实践一下。
添加 manifest 文件
web app manifest 是一个 JSON 文件,放在网站代码根目录下。它告诉浏览器当 PWA 安装到用户桌面或移动设备时应该如何表现。
具体操作见这篇 Add a web app manifest 文章。
theme_color
,在 display:minimal-ui
模式下,该颜色显示在Android手机头部地址栏及系统顶部信息栏;在 standalone 模式下,该颜色显示在Android手机系统顶部信息栏。iOS不生效
background_color
,该颜色在Android手机 PWA启动画面上生效。iOS不生效
Chrome 会以 manifest 文件里的 name
,background_color
,icons
自动创建一个启动画面,Android 上可以看到。iOS启动是白屏。
检测文件配置正确,打开浏览器开发者工具-》Application-》Manifest
桌面 Chrome 的 manifest 文件不会自动更新。Android Chrome 在 PWA 启动时,会根据实时获取的 manifest 比对当前安装的 manifest。如有更新,则当设备连接wifi,会排队和更新。
提供定制化的 install 体验
为了推广安装 PWA,可以在用户 UI 里提示这个 Web app 是可安装的,然后提供快捷方式(如,一个按钮)直接在 UI 里开启/弹出 PWA 安装,方便用户操作。
更多推广安装 PWA 的模式作为延伸阅读,可参看这篇 Patterns for promoting PWA installation 文章。
如何开启安装?
:x: iOS(Safari、Chrome) :white_check_mark: Android Chome,PC Chrome
原理是当 PWA 满足可安装条件时,浏览器触发 beforeinstallprompt
事件,保留该事件的 reference,更新 UI 告知用户可安装。当用户点击 UI 提供的触发安装流程的按钮时,调用该事件的 prompt()
方法,显示安装对话框,让用户确认安装或取消。
代码可参考这篇文章 Provide a custom install experience 。
比较遗憾的是 beforeinstallprompt
这个 event API 目前浏览器支撑率只有约66%,基本只有谷歌浏览器在支持。
目前 m 站的做法是检测 UA 是否为 Android Chrome,是的话在头部导航栏显示一个手机图标,用户点击后页面刷新为引导图片,提示用户使用浏览器菜单栏里的“添加到主屏幕”功能。
const show_phone_icon = /android/.test(ua) && /chrome\/([\d.]+)/.test(ua) && !/huaweibrowser\/([\d.]+)/.test(ua)
这里 有一个在线示例,大家可用编辑代码感受下谷歌所提倡的“个性化的安装体验”具体是怎样的。
如何检测安装成功?
:x: iOS Safari :white_check_mark: Android Chrome,PC Chrome
根据上文,通过 beforeinstallprompt 事件的 userChoice
属性我们可以知道用户是否通过 UI 安装了 PWA。但是如果用户是从地址栏或者其他浏览器组件安装的,这个属性就无济于事了。因此谷歌建议侦听 appinstalled
事件。
不论你通过什么机制安装的PWA,当 PWA 安装成功后,都会触发这个事件。
但是很遗憾,appinstalled
API 的支持率也只有 65%,而且 MDN 提醒该功能随时可能被移除。
如何检测PWA通过什么方式启动?
:white_check_mark: iOS Safari,Android Chrome
通过 CSS 媒体查询检测 display-mode
的值,可以根据 app 启动的方式做个性化显示。
@media all and (display-mode: standalone) {
body {
background-color: yellow;
}
}
js 里通过 matchMedia
检测 display-mode
媒体,其结果 matches 返回一个Boolean,可用来记录用户是如何启动你的 PWA。
window.addEventListener('load', () => {
if (matchMedia('(display-mode: standalone)').matches) {
alert('Launched: Installed');
} else {
alert('Launched: Browser Tab');
}
});
题外话:iOS PWA 页面不支持下拉刷新,每次都要关掉 app 再打开。
如何提供一个离线页面?
todo
卖家pwa方案
- 原h5登录、注册页直接复用
- 需要调整url:2级域名才支持 https: m-seller.clubfactory.com/login.html
- 保持登录状态?原来是1天失效,c端设置很长的过期时间
- 一个巨大的spa?是的
- 开发框架(提效)?直接配置的webpack,create-react-app本身开启pwa,最新版本再学习!
可安装
发现c端pwa icon显示不出来,他们切cdn的锅。他们配置也有问题,flipkart一样的问题。twitter是pwa模范生。 -》我们基于create-react-app开发的h5没有这个问题 让用户直接使用Safari浏览器安装
iOS
- Safari里面,选中“添加到主屏幕”即可
- Chrome 没有此选项,Flipkart提示:click : then“Add to Home screen” from browser menu to add Flipkart shortcut for easy access
Android
- Chrome 浏览器右上角点击三个小圆点,出现的菜单里有“添加到主屏幕”
- 可以利用
appinstalled
事件做一些效果
本地调试安装体验流程
:white_check_mark: PC Chrome
几点说明: 1.应用需要注册 serviceWorker 2.只有直接访问 localhost 才支持 serviceWorker
PC端卸载PWA
上文也提到触发 beforeinstallprompt 事件的第一条件是,你还没有安装过相应的 pwa。安装过一次后,就不再触发 beforeinstallprompt 事件。想要重新开启,先卸载对应的应用。