PWA笔记四:Web App Manifest 介绍

Brandonxiang NOV 5, 2019

首先,在 vue 的初始化 webpack 项目中存在 manifest.js,这个文件更多是静态脚本的代码指纹。但是它和 PWA 的 Web App Manifest 是两个概念。下面是 webkit.org 对它的定义。

A JSON-format manifest file for developers to place metadata associated with a web application. Web App Manifest 是用 json 格式文件来配置网页应用。

网页应用需要配置哪些方面?

PWA 指的是网页应用,Web App Manifest 主要针对的是单页面应用而言,包含了应用名字,图标,起始路径。如今最新版本的 ios 和 Android 都已经支持 Web App Manifest,用户可以把网页应用直接“留在”手机桌面上,它就像小程序后台一样注册你的应用信息。手机操作系统会根据你提供的信息,帮你注册这款网页应用到收集当中,以后会把该应用也可能出现在对应的 appStore。

{
  "background_color": "#ffffff",
  "theme_color": "#333333",
  "name": "Brandon's Blog",
  "short_name": "Brandon's Blog",
  "description": "A Web Developer's Blog",
  "display": "standalone",
  "start_url": "/",
  "scope": "/",
  "icons": [
    {
      "src": "logo-192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "logo-512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ],
  "share_target": {
    "action": "compose/share",
    "params": {
      "title": "title",
      "text": "text",
      "url": "url"
    },
    "method": "GET",
    "enctype": "application/x-www-form-urlencoded"
  },
  "prefer_related_applications": false
}

通过这个 manifest,app 的名字和图标可以被设置(其中还包括分享模块)。该manifest.json需要在页面 header 被引入,service-worker 会控制它的缓存机制。

<!-- 在html头部引入manifest.json -->
<link rel="manifest" href="../static/manifest.json" />

Chrome 的支持

最新版本的 chrome 能够支持桌面级别的 pwa 应用,当它检测到该页面是 pwa 时,地址栏处会出现一个加号,可以将 pwa 安装至电脑本地。它正如一个 app 般存在于你的电脑里。

Chrome PWA

IOS 的支持

最新版本的 IOS 也对 pwa 应用有着最新的支持,能够对status-bar或者苹果应用图标有特殊的设置,此处,IOS 并没有取 manifest 中的 icon,需要对apple-touch-icon进行设置。

此处注意下对 iPhoneX 刘海屏的样式支持,此处采用viewport-fit的属性进行最简单的设置,具体复杂的适配方案不在这里展开。

<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
<meta name="apple-mobile-web-app-title" content="Brandon's Blog" />
<meta
  name="viewport"
  content="width=device-width,initial-scale=1,user-scalable=no,viewport-fit=contain"
/>
<link rel="apple-touch-icon" href="icon/appicon.png" />