PWA(Progressive Web App)入门系列:(三)PWA关键技术Manifest

前言

前面说过,让Web App能够达到Native App外观体验的主要实现技术就是PWA中的manifest技术,本章会详细说明manifest的实现,及各个参数的具体含义,还将了解如何定义Web App的启动图标、启动样式等。

简介

manifest是一种简单的json数据风格的配置文件,通过对其相应的属性进行配置,才实现相应的功能,这里可以称manifest为WEB应用清单。WEB应用清单可以实现自定义启动画面、打开URL、设置界面颜色、设置桌面图标等等。

大概就是下面这样:

{"short_name": "短名称","name": "这是一个完整名称","icons": [{"src": "144x144.png","type": "image/png","sizes": "144x144"}],"background_color": "#2196f3","display": "standalone","start_url": "index.html"
}

部署到浏览器

好么manifest.js如何让浏览器去执行呢?

只需要用link标记引用即可:

<link rel="manifest" href="manifest.js">

目前各大浏览器对manifest的支持程度:

成员

下面对manifest涉及到的各个属性详细说一下。

name

name: {string},用来描述应用的名称,会显示在各类提示的标题位置和启动画面中。

short_name

short_name: {string},用来描述应用的短名字。当应用的名字过长,在桌面图标上无法全部显示时,会用short_name中定义的来显示。

start_url

start_url: {string},用来描述当用户从设备的主屏幕点击图标进入时,出现的第一个画面。

  • 如果设置为空字符串,则会以manifest.js的地址做为URL
  • 如果设置的URL打开失败,则和正常显示的网页打开错误的样式一下(可以通过后面讲的ServiceWorker改善)
  • 如果设置的URL与当前的项目不在一个域下,也不能正常显示
  • start_url 必须在scope的作用域范围内
  • 如果 start_url 是相对地址,那么根路径基于manifest的路径
  • 如果 start_url 为绝对地址,则该地址将永远以 / 作为根路径

scope

scope : {string},用来设置manifest对于网站的作用范围。
下面列一下,scope的作用范围及对start_url的影响:

manifest的文件位置start_urlscope配置计算好的scope计算好的start_url是否有效
/inner/manifest.json./index.htmlundefined/inner//index.html有效
/inner/manifest.json./index.html..///index.html有效 - 但作用域泄露到了更高层级
/inner/manifest.json////index.html有效 - 但作用域泄露到了更高层级
/inner/manifest.json/undefined/inner//无效 - start url不在作用域范围内
/inner/manifest.json./inner/index.htmlundefined/inner//inner/inner/index.html有效 - 但start url明显不符合预期
/manifest.json./inner/index.htmlundefined//inner/index.html有效 - 广作用域
/manifest.json./inner/index.htmlinner/inner//inner/index.html有效 - 窄作用域

icons

icons: {Array.<ImageObject>},用来设置Web App的图标集合。

ImageObject 包含属性:

  • src: {string},图标的地址
  • type {string},图标的 mime 类型,可以不填写。这个字段会让浏览器不使用定义类型外的图标
  • sizes {string},图标的大小,用来表示widthxheight,单位为px,如果图标要适配多个尺寸,则第个尺寸间用空格分割,如12x12 24x24 100x100

sizes适配规则:

  • 在PWA添加到桌面的时候,浏览器会适配最合适尺寸的图标。浏览器首先会去找与显示密度相匹配且尺寸调整到 48dp 屏幕密度的图标,例如它会在 2 倍像素的设备上使用 96px,在 3 倍像素的设备上使用 144px。。
  • 如果没有找到任何符合的图标,则会查找与设备特性匹配度最高的图标。
  • 如果匹配到的图标路径错误,将会显示浏览器默认 icon。

需要注意的是,图标中必须要有一张尺寸为144x144的,图标的 mime 类型为 image/png的。

background_color

background_color: {Color},值为CSS的颜色值,用来设置Web App启动画面的背景颜色。

可以像正常写CSS颜色那样定义:

// 完整色值
"background_color": "#0000ff"
// 缩写
"background_color": "#00f"
// 预设色值
"background_color": "yellow"
// rgb
"background_color": "rgb(0, 255, 255)"
// transparent 背景色显示为黑色
"background_color": "transparent"

其他的定义rgbahslhsla等颜色定义方式浏览器不支持,未设置时,背景色均显示白色。

theme_color

theme_color: {Color},定义和background_color一样的CSS颜色值,用于显示Web App的主题色,显示在banner位置。

display

display: {string},用来指定 Web App 从主屏幕点击启动后的显示类型

显示类型描述降级显示类型
fullscreen应用的显示界面将占满整个屏幕standalone
standalone浏览器相关UI(如导航栏、工具栏等)将会被隐藏minimal-ui
minimal-ui显示形式与standalone类似,浏览器相关UI会最小化为一个按钮,不同浏览器在实现上略有不同browser
browser浏览器模式,与普通网页在浏览器中打开的显示一致(None)

对于不同的显示样式,可以通过CSS的媒体查询进行设置:

@media all and (display-mode: fullscreen) {div {padding: 0;}
}@media all and (display-mode: standalone) {div {padding: 1px;}
}@media all and (display-mode: minimal-ui) {div {padding: 2px;}
}@media all and (display-mode: browser) {div {padding: 3px;}
}

orientation

orientation: {string},Web App的在屏幕上的显示方向。

  • landscape-primary,当视窗宽度大于高度时,当前应用处于“横屏”状态
  • landscape-secondarylandscape-primary的180°方向
  • landscape,根据屏幕的方向,自动横屏幕180°切换
  • portrait-primary,当视窗宽度小于高度时,当前应用处于“竖屏”状态
  • portrait-secondaryportrait-primary的180°方向
  • portrait,根据屏幕方向,自动竖屏180°切换
  • natural, 根据不同平台的规则,显示为当前平台的0°方向
  • any,任意方向切换

dir

dir: {string},设置文字的显示方向。
- ltr,文本显示方向,左到右
- rtl,文本显示方向,右到左
- auto,根据系统的方向显示

related_applications

related_applications: {Array.<AppInfo>},用于定义对应的原生应用,类似应用安装横幅的形式去推广、引流。

AppInfo结构:
- platform: {string}, 应用平台
- id: {string} 应用id

如安卓可以这么定义:

"related_applications": [{"platform": "play","id": "com.app.xxx"}
]

prefer_related_applications

prefer_related_applications:{Boolean},用于设置只允许用户安装原生应用。

实例

下面写一下相关的常用实例。

目录结构

项目结构:

根路径 /||----manifest.json  // 清单文件||----index.html||----144x144.png  // 图标文件||----sw.js

因为浏览器要安装manifest中的定义,需要一些其他的代码环境条件,以上目录中,我们只讨论manifest.json文件,其他文件后面会做说明。

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Manifest</title><link rel="manifest" href="./manifest.json"> <!-- 引用manifest文件 -->
</head>
<body><h1>Manifest Page</h1><script>// 此处代码 后面相关章节会去说明if ('serviceWorker' in navigator) {window.addEventListener('load', function() {navigator.serviceWorker.register('sw.js').then(function(registration) {}).catch(function(err) {})})}</script>
</body>
</html>

sw.js

// 此处代码 后面相关章节会去说明
var cacheName = 'helloWorld'self.addEventListener('install', event => {event.waitUntil(caches.open(cacheName).then(cache => cache.addAll(['index.html'])))
})self.addEventListener('fetch', function (event) {event.respondWith(caches.match(event.request).then(function (response) {if (response) {return response;}return fetch(event.request);}))
})

144x144.png

将应用添加到桌面

manifest.js

{"short_name": "短名称","name": "这是一个完整名称","icons": [{"src": "144x144.png","type": "image/png","sizes": "144x144"}],"display": "standalone","start_url": "index.html"
}

按照上面方式配置,在移动端Chrome上访问,效果如下:

浏览器会提示一个“添加到主屏幕”的提示。提示的标题显示的是在manifest中定义的name,当点击时,就会将应用添加到桌面:

桌面图标上显示的文本为manifest中定义的short_name。

点击应用图标,打开应用:

可以看到根据设置的display属性,打开的应用去除了浏览器的地址栏。

注意

浏览器“添加到主屏幕”的提示是需要满足下面条件才会显示的:

  1. 需要manifest文件
  2. manifest中需要定义start_url
  3. 需要包含144x144的png图标文件
  4. 网站是通过Https访问的
  5. 并且网站中运行ServiceWorker
  6. 用户需要至少浏览过网站两次,并且两次的间隔大于5分钟
  7. 如果修改了 manifest 的配置,已添加到主屏幕的名称并不会改变,只有当用户重新添加到桌面时,更改后的配置才会生效。但是在未来版本的 Chrome 浏览器将支持自动更新

关于上面提到的第4点,我们可以建立一个https网站或者可以直接用github的pages服务来实现。

关于第6点,是为了防止每次打开网址都有这个提示,对用户造成较差的体验。

设置主题色

"theme_color": "red"

给主题色设置个红色:

可以发现App的header上已经变成了设置的红色。

设置启动界面

启动界面是由icon、background_color和name构成的。

"background_color": "#2196f3"

效果:

icon也会根据屏幕的尺寸,浏览器来适配最佳的图标。

添加到主屏幕 触发的事件

当执行”添加到主屏幕“的操作时,内部会触发相应的事件beforinstallprompt。可以利用这个事件做一些事情,例如App判断流量入口:

window.addEventListener('beforeinstallprompt', function(e) {e.userChoice.then(function (result){if (result.outcome === 'dismissed'){// 发送数据进行分析} else {// 发送数据进行分析}})
})

事件中的userChoice对象用来返回用户的选择信息,处理是基于Promise的,这个后面章节会详说。

本地调试

上面是为了实现真是效果,所以在真是移动端上实现的。其实在测试的时候,是可以通过Chrome的开发者工具来测试的。

首先,打开上一章里下载的”WebServer for Chrome”本地服务器工具,并把项目加下到里面,然后开始服务

然后,在Chrome浏览器中访问”Web Server URL(s)“下的地址http://127.0.0.1:8887

然后,打开开发者工具,打开Application选项卡,选择Manifest,就可以后到配置的信息了。

并可以通过点击”Add to homescreen“触发添加图标到桌面的事件。

授权后即可添加到桌面




线上manifest验证

除去本地调试外,还可以通过在线清单验证工具来实现验证,例如:Web Manifest Validator

总结

到这里,总结一下:

  • manifest是一种简单的JSON文件,通过对属性进行相应的配置,可以实现很多类Native的体验
  • 添加到主屏幕会触发相应的事件,可以基于这些事件做相应的处理
  • 调试的时候,可以基于Chrome的开发者工具,或者通过线上的测试验证工具
  • https可以借助github pages功能实现

博客名称:王乐平博客

CSDN博客地址:http://blog.csdn.net/lecepin

知识共享许可协议
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用百度LBS做一个小Demo

为什么80%的码农都做不了架构师&#xff1f;>>> 申请ak&#xff08;即获取密钥&#xff09;http://lbsyun.baidu.com/apiconsole/key?applicationkey 去这儿注册一个开发者账号即可拼写发送http请求的url譬如这样的调用http://api.map.baidu.com/geocoder/v2/?ad…

PWA(Progressive Web App)入门系列:(四)Promise

前言 这一章说一下ES6的Promise对象。为什么要在PWA系列的文章中讲Promise呢&#xff1f;因为PWA中的许多技术API中都是以Promise返回的方式返回的&#xff0c;为了对后续章节中PWA技术API更好的理解&#xff0c;这里就来说一个Promise对象。 Promise出现的背景 在JavaScrip…

图文详解如何搭建Windows的Android C++开发环境

原地址:http://www.apkbus.com/android-18595-1-1.html ////TITLE:// 图文详解如何搭建Windows的Android C开发环境&#xff08;一&#xff09;//AUTHOR:// norains//DATE:// Thursday 14-April-2011//Environment:// Cygwin 1.7.9// Android NDK r5//1. 下载A…

PWA(Progressive Web App)入门系列:(五)Web Worker

前言 在说Service Worker前有必要说一下Web Worker&#xff0c;因为Service Worker本身就属于Web Worker的延伸&#xff0c;大部分功能也是基于Web Worker进行的扩展。 背景 众所周知&#xff0c;JavaScript引擎是以单线程调度的方式进行&#xff0c;我们无法同时运行多个Ja…

Glob Patterns匹配模式使用

前段时间在用workbox时&#xff0c;在做precache时&#xff0c;匹配模式基于的是Glob Pattern模式&#xff0c;于是就看了下相关文档。 下面翻译一下node-glob的使用&#xff0c;原文&#xff1a;https://github.com/isaacs/node-glob#glob-primer Glob 像在shell里面&#x…

Workbox CLI v3.x 中文版

在写PWA应用时&#xff0c;用到WorkBox工具&#xff0c;使用过程中发现没有中文的帮助文档&#xff0c;为了体验好一些&#xff0c;也为了方便自己和他人查看&#xff0c;在这里翻译了一下workbox-cli。 Workbox CLI 是什么? Workbox命令行&#xff08;在workbox-cli包内&…

Workbox.routing v3.x 中文版

NAMESPACE STATIC VERSION V3.6.1 类 NavigationRoute NavigationRoute可以轻松创建匹配浏览器navigation requests的Route。 它仅匹配mode设置为navigate的请求。 您可以只使用blacklist和whitelist参数中的一个或两个&#xff0c;将此路由应用于导航请求中。 RegExpRout…

Workbox.strategies v3.x 中文版

NAMESPACE STATIC VERSION V3.6.1 该模块提供了大多数serviceworker常用的缓存策略的简单实现。 类 CacheFirst cache-first请求策略的实现。 缓存优先策略对于带版本号的资源是非常有用的&#xff0c;像这种URLstyles/example.a8f5f1.css&#xff0c;因为它们可以长时间缓存…

集算器访问HTTP数据的代码示例

使用集算器&#xff08;esProc&#xff09;可以很方便的从http数据源读取数据进行处理。本例子中有一个servlet&#xff0c;对外提供json格式的雇员信息查询。Servlet访问数据库的员工表&#xff0c;保存了员工的信息&#xff0c;如下&#xff1a;EID NAME SURNAME …

PWA(Progressive Web App)入门系列:Cache Storage Cache

前言 目前浏览器的存储机制有很多&#xff0c;如&#xff1a;indexedDB、localStorage、sessionStorage、File System API、applicationCache 等等&#xff0c;那为什么又制定了一套 Cache API 呢&#xff1f;对比其他存储机制有什么优势&#xff1f; 简介 Cache API 是一套…

「浏览器插件」无广告国内视频平台直接播放插件

前段时间发现一些比较不错的解析国内视频平台的一些 API 接口&#xff0c;很早之前基于这些接口做过一个 Android 端的播放软件&#xff0c;但为了更方便使用吧&#xff0c;于是做了一个 Chrome 的浏览器插件&#xff0c;解析接口也是在线更新的&#xff0c;所以用起来会比较方…

kafka性能测试(转)KAFKA 0.8 PRODUCER PERFORMANCE

来自:http://blog.liveramp.com/2013/04/08/kafka-0-8-producer-performance-2/ At LiveRamp, we constantly face scaling challenges as the volume of data that our infrastructure must deal with continues to grow. One such challenge involves the logging system. At…

Workbox-Window v4.x 中文版

Workbox 目前发了一个大版本&#xff0c;从 v3.x 到了 v4.x&#xff0c;变化有挺大的&#xff0c;下面是在 window 环境下的模块。 什么是 workbox-window? workbox-window 包是一组模块&#xff0c;用于在 window 上下文中运行&#xff0c;也就是说&#xff0c;在你的网页内…

媒体播放器三大底层架构

2019独角兽企业重金招聘Python工程师标准>>> 媒体播放工具&#xff0c;这里主要指视频播放&#xff0c;因为要面临庞大的兼容性和纷繁复杂的算法&#xff0c;从架构上看&#xff0c;能脱颖而出的体系屈指可数。大体来说业界主要有3大架构&#xff1a;MPC、MPlayer和…

PWA 可用性检测工具

针对移动端或者 PC 端浏览器是否对 PWA 可用的问题上&#xff0c;做了一个简单的站点&#xff0c;来实现上述问题的方便检测。让开发者较快的了解终端浏览器的特性支持度。 使用 工具地址&#xff1a;https://lecepin.gitee.io/detect-sw/ 地址二维码&#xff1a; 检测 可…

PWA 应用列表及常用工具

引言 在做 PWA 的过程中自己写了一些相关的应用和工具&#xff0c;在这里整合下&#xff0c;方便记录及查找使用。 应用列表 PWA 支持检测工具番茄钟二维码生成新闻应用身体数据统计应用支付宝集福应用田英章书法字典应用抖音无水印下载应用很好用的备忘录精神氮泵 PWA 支持检…

Struts2中访问HttpServletRequest和HttpSession

2019独角兽企业重金招聘Python工程师标准>>> 关键字: struts2 httpservletrequest httpsession 在没有使用Struts2之前,都习惯使用HttpServletRequest和HttpSession对象来操作相关参数,下面介绍一下在Struts2中访问隐藏的HttpServletRequest和HttpSession的两种方法…

web前端长度单位详解(px、em、rem、%、vw/vh、vmin/vmax、vm、calc())

基础理论1&#xff09;简介2&#xff09;绝对长度3&#xff09;相对长度4&#xff09;经验之谈1&#xff09;简介 在前端开发中&#xff0c;会遇到各种不同类型的长度单位&#xff0c;比如px,em,rem等。 而整体的长度单位分为两大类&#xff1a;相对长度 和 绝对长度。 2&…

PWA(Progressive Web App)入门系列:Fetch Request Headers Response Body

前言 在 WEB 中&#xff0c;对于网络请求一直使用的是 XMLHttpRequest API 来处理&#xff0c;XMLHttpRequest 也很强大&#xff0c;传统的 Ajax 也是基于此 API 的。那么为什么 W3C 标准中又加入了类似功能的 Fetch API 呢&#xff1f;他有何优势。 Fetch 什么是 Fetch Fet…

CSS3开发总结(圆角、盒阴影、边界图片)

CSS3开发总结&#xff08;圆角&#xff09; 12/100 发布文章 qq_41913971 CSS31&#xff09;圆角 border-radius2&#xff09;盒阴影 box-shadow3&#xff09;边界图片 border-image-source1&#xff09;圆角 border-radius border-radius属性&#xff0c;复合属性。一个最多可…