【PWA学习】2. 使用 Manifest, 让你的 WebApp 更 Native

news2025/1/21 15:35:10

引言

我们知道,在 chrome(等一些现代浏览器)中,你可以将访问的网站添加到桌面,这样就会在桌面生成一个类似 “快捷方式” 的图标,当你点击该图标时,便可以快速访问该网站(Web App)

我们以 demo 为例,其添加到桌面后以及重新打开时的状态如下:

普通 Web App 被添加到桌面后的展示形式

然而,对于PWA来说,有一些重要的特性:

  • Web App 可以被添加到桌面并有它自己的应用图标
  • 从桌面开启时,会和原生app一样有它自己的“开屏图”
  • 这个 Web App 的样子几乎和原生应用一样——没有浏览器的地址栏、工具条,似乎和 Native - App 一样运行在一个独立的容器中

Web App Manifest

网络应用清单是一个 JSON 文件,它告诉浏览器您的Web应用程序以及在用户移动设备或桌面上“安装”时它应该如何表现。 Chrome需要提供清单才能显示“添加到主屏幕”提示

典型的清单文件包括有关应用程序名称,应使用的图标,启动时应启动的 start_url 等信息

我们来看一下,learning-pwa 中的 manifest.json 文件内容:

{
  "name": "每日一言",
  "short_name": "一言",
  "start_url": "/",
  "display": "standalone",
  "orientation": "portrait-primary",
  "background_color": "#333",
  "theme_color": "#5eace0",
  "description": "美好生活, 从一言开始!",
  "icons": [
    {
      "src": "img/icons/book-32.png",
      "sizes": "32x32",
      "type": "image/png"
    },
    {
      "src": "img/icons/book-72.png",
      "sizes": "72x72",
      "type": "image/png"
    },
    {
      "src": "img/icons/book-128.png",
      "sizes": "128x128",
      "type": "image/png"
    },
    {
      "src": "img/icons/book-144.png",
      "sizes": "144x144",
      "type": "image/png"
    },
    {
      "src": "img/icons/book-192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "img/icons/book-256.png",
      "sizes": "256x256",
      "type": "image/png"
    },
    {
      "src": "img/icons/book-512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ]
}

background_color

为 web 应用程序预定义的背景颜色。此值在应用程序样式表中可以再次声明。它主要用于在样式表加载之前,当加载 manifest,浏览器可以用来绘制 web 应用程序的背景颜色。在启动 web 应用程序和加载应用程序的内容之间创建了一个平滑的过渡。

"background_color": "red"

备注: background_color 只是在 web 应用程序加载时提高用户体验,而当 web 应用程序的样式表可用时,不能替代作为背景颜色使用。

description

提供有关 Web 应用程序的一般描述。

"description": "The app that helps you find the best food in town!"

dir

指定名称、短名称和描述成员的主文本方向。与 lang 一起配置,可以帮助正确显示右到左文本。

"dir": "rtl",
"lang": "ar",
"short_name": "أنا من التطبيق!"

可选值:

  • ltr (由左到右)
  • rtl (由右到左)
  • auto (由浏览器自动判断)

备注: 当省略时,默认为 auto

display

定义开发人员对 Web 应用程序的首选显示模式。

"display": "standalone"

有效值:

显示模式描述
fullscreen全屏显示,所有可用的显示区域都被使用,并且不显示状态栏
standalone让这个应用看起来像一个独立的应用程序,包括具有不同的窗口,在应用程序启动器中拥有自己的图标等。这个模式中,用户代理将移除用于控制导航的 UI 元素,但是可以包括其他 UI 元素,例如状态栏
minimal-ui该应用程序将看起来像一个独立的应用程序,但会有浏览器地址栏。样式因浏览器而异
browser该应用程序在传统的浏览器标签或新窗口中打开,具体实现取决于浏览器和平台。这是默认的设置。

让我们来看下这四种模式的差异:

display 四种模式的差异

当然,不同的系统所表现出的具体样式也不完全一样。就像示例中的虚拟按键在fullscreen模式下会默认隐藏。

icons

指定可在各种环境中用作应用程序图标的图像对象数组。例如,它们可以用来在其他应用程序列表中表示 Web 应用程序,或者将 Web 应用程序与 OS 的任务切换器和/或系统偏好集成在一起。

"icons": [
  {
    "src": "icon/lowres.webp",
    "sizes": "48x48",
    "type": "image/webp"
  },
  {
    "src": "icon/lowres",
    "sizes": "48x48"
  },
  {
    "src": "icon/hd_hi.ico",
    "sizes": "72x72 96x96 128x128 256x256"
  },
  {
    "src": "icon/hd_hi.svg",
    "sizes": "72x72"
  }
]

图像对象可能包含以下值:

字段描述
sizes图像的大小。包含空格分隔的图像尺寸的字符串,系统会选取最合适的图像展示在相应位置上
src图像文件的路径。如果src是一个相对 URL,则基本 URL 将是 manifest 的 URL
type提示图像的媒体类型。此字段的目的是允许用户代理快速忽略不支持的媒体类型的图像

lang

指定nameshort_name成员中的值的主要语言。该值是包含单个语言标记的字符串。

"lang": "en-US"

name

为应用程序提供一个人类可读的名称,例如在其他应用程序的列表中或作为图标的标签显示给用户。

"name": "Google I/O 2017"

orientation

定义所有 Web 应用程序顶级的默认方向 browsing contexts.

"orientation": "portrait-primary"

方向可以是以下值之一:

  • any
  • natural
  • landscape
  • landscape-primary
  • landscape-secondary
  • portrait
  • portrait-primary
  • portrait-secondary

prefer_related_applications

指定一个布尔值,提示用户代理向用户指示指定的相关应用程序(请参见下文)可用,并建议通过 Web 应用程序。只有当相关的本地应用程序确实提供了某些 Web 应用程序无法做到的事情时,才应该使用它。

"prefer_related_applications": false

备注: 如果省略,默认设置为 false

related_applications

指定一个“应用程序对象”数组,代表可由底层平台安装或可访问的本机应用程序 - 例如可通过 Google Play Store 获取的原生 Android 应用程序。这样的应用程序旨在替代提供类似或等同功能的 Web 应用程序 - 就像 Web 应用程序的本机应用程序版本一样。

"related_applications": [
  {
    "platform": "play",
    "url": "https://play.google.com/store/apps/details?id=com.example.app1",
    "id": "com.example.app1"
  }, {
    "platform": "itunes",
    "url": "https://itunes.apple.com/app/example-app1/id123456789"
  }]

应用程序对象可能包含以下值:

字段描述
platform可以找到应用程序的平台
url可以找到应用程序的 URL
id用于表示指定平台上的应用程序的 ID

scope

定义此 Web 应用程序的应用程序上下文的导航范围。这基本上限制了 manifest 可以查看的网页。如果用户在范围之外浏览应用程序,则返回到正常的网页。

如果scope是相对 URL,则基本 URL 将是 manifest 的 URL。

"scope": "/myapp/"

short_name

为应用程序提供简短易读的名称。这是为了在没有足够空间显示 Web 应用程序的全名时使用。

"short_name": "I/O 2017"

start_url

指定用户从设备启动应用程序时加载的 URL。如果以相对 URL 的形式给出,则基本 URL 将是 manifest 的 URL。

"start_url": "./?utm_source=web_app_manifest"

theme_color

定义应用程序的默认主题颜色。这有时会影响操作系统显示应用程序的方式(例如,在 Android 的任务切换器上,主题颜色包围应用程序)。

"theme_color": "aliceblue"

使用

创建好 manifest 文件后,下一步就是需要知道如何能让我们的 Web App 使用它——非常简单,只需要在 head 中添加一个 link 标签:

<!-- 在 index.html 中添加以下 meta 标签 -->
<link rel="manifest" href="/manifest.json">

这样,在 android 上我们使用 chrome 将应用添加到桌面,就会拥有文章开头处的 PWA 效果

兼容性

上面的一切看似美好,然而真的如此么?

到目前为止,我们的工作都非常顺利:创建 manifest.json,添加 meta 标签,然后把我们的 Web App 添加到桌面。然而,如果我们在 iPhone 上访问我们的站点,然后 “添加到主屏幕”,你会发现——一切都失效了

manifest 的兼容性

如果你看过Can I use上 manifest 的兼容性,那会令你更加头疼。别担心,在 iOS 与 Windows 上,我们有其他的方式

iOS(safari)中的处理方式

safari 虽然不支持 Web App Manifest,但是它有自己的一些 head 标签来定义相应的资源与展示形式:

属性说明
apple-touch-icon桌面图标,通过在head中添加<link rel="apple-touch-icon" href="your_icon.png">即可。其中还可以添加sizes属性,来指示系统使用在各类平台(iphone、ipad… )中使用最合适的图标
apple-mobile-web-app-title应用的标题。注意,这里需要使用 meta标签<meta name="apple-mobile-web-app-title" content="AppTitle">
apple-mobile-web-app-capable类似于manifest中的display的功能,通过设置为yes可以进入 standalone 模式,同样也是 meta 标签<meta name="apple-mobile-web-app-capable" content="yes">
apple-mobile-web-app-status-bar-style这会改变 iOS 移动设备的状态栏的样式,并且只有在 standalone 模式中才会有效果。<meta name="apple-mobile-web-app-status-bar-style" content="black">,不过在iPhoneX上black会导致状态栏不显示任何东西

下面是 learning-pwa 项目中的相关设置

<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="每日一言">
<link rel="apple-touch-icon" href="img/icons/book-256.png">

IE、Edge 中的处理方式

与 Safari 类似,IE 中也有自己的 meta 标签来指示相应的资源。其中比较重要的有:

属性说明
application-name指明了 app 的名称
msapplication-TileColor指明了 “tile” 的背景颜色
msapplication-xxxlogo不同大小的 “tile” 所使用的图标,包括这几种:msapplication-square70x70logo, msapplication-square150x150logo, msapplication-wide310x150logo, msapplication-square310x310logo

下面是 learning-pwa 项目中的相关设置,其中图标的设置为了方便就复用了已有的图标文件

<meta name="application-name" content="每日一言" />
<meta name="msapplication-TileColor" content="#222">
<meta name="msapplication-square70x70logo" content="img/icons/book-72.png" />
<meta name="msapplication-square150x150logo" content="img/icons/book-144.png" />
<meta name="msapplication-square310x310logo" content="img/icons/book-256.png" />

本章分支: manifest

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

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

相关文章

无监督聚类表征学习方法之对比学习(Contrastive Learning)——simclr方法

无监督聚类表征学习方法之对比学习(Contrastive Learning)——simclr方法 1.参考论文 《A Simple Framework for Contrastive Learning of Visual Representations》 2.无监督聚类表征学习方法 主要有几种&#xff1a; ①自动编码器(AutoEncoder,AE); ②变分自编码器(Variatio…

两款开源.NET工作流引擎 Elsa 与ccflow使用比较

相对java开源的工作流程引擎.net开源的工作流程引擎相对较少&#xff0c;这里整理两款.net开源工作流引擎&#xff0c;做一下对比使用。elsa示例代码:Githubd地址&#xff1a;https://github.com/zhenl/MyElsaccflow下载地址&#xff1a;https://gitee.com/opencc/ccflowCCFlow…

Java笔记021-异常-Exception

异常-Exception看个实际问题和一段代码运行下面的代码&#xff0c;看看有什么问题->引出异常和异常处理机制package com12.exception_;/*** author 甲柒* version 1.0* title Exception01* package com12.exception_* time 2023/1/9 14:38*/ public class Exception01 {publ…

Mask RCNN网络源码解读(Ⅳ) --- Mask R-CNN论文解读

目录 1.Mask R-CNN简介 2.Mask分支 3.Mask R-CNN损失 4Mask分支预测使用 1.Mask R-CNN简介 回顾我们之前所说的图像分类、目标检测、语义分割的内容&#xff1a; 我们来看一下实例分割和语义分割的差别&#xff1a; Mask R-CNN不仅能够同时进行目标检测与分割&#xff0c;…

查找算法之二分查找

目录 二分查找 算法实现 “双闭区间”实现 算法实现 python C 两种表示对比 大数越界处理 优点与缺点 二分查找 二分查找&#xff0c;利用数据的有序性&#xff0c;通过每轮缩小一半搜索区间来查找目标元素。 使用二分查找有两个前置条件&#xff1a; 要求输入数据…

如何在GitLab上传本地项目

上传前需准备&#xff1a;需要安装Git&#xff0c;点击进入官网下载&#xff1a;Git 在本地上传GitLab项目的步骤目录介绍&#xff1a; 一、配置SSH秘钥&#xff08;仅针对本机首次上传GitLab项目&#xff09; 二、上传项目 1、新建一个空文件夹&#xff0c;并在该文件夹下右键…

Deque

Deque&#xff1a; “double ended queue&#xff08;双端队列&#xff09;”的缩写&#xff0c;通常读为“deck”&#xff1b; Deque是一个线性集合&#xff0c;支持在两端插入和移除元素。 Deque有三种用途&#xff1a; 双端队列(两端都可进出) Deque< Integer> de…

机器学习实战教程(十三):树回归基础篇

一、前言本篇文章将会讲解CART算法的实现和树的剪枝方法&#xff0c;通过测试不同的数据集&#xff0c;学习CART算法和树剪枝技术。二、将CART&#xff08;Classification And Regression Trees&#xff09;算法用于回归在之前的文章&#xff0c;我们学习了决策树的原理和代码实…

成功上岸字节全靠这份Redis技术笔记,深入浅出值得一看

前言 正如标题所说&#xff0c;我现在已经如愿以偿地进了字节&#xff01;之前自己一直待在一个不大不小的外包公司&#xff0c;每天做着重复的层删改查工作。直到22年年底&#xff0c;自己通过朋友的介绍拿到了字节的面试机会&#xff0c;自己在家复习了3个月&#xff0c;成功…

decltype类型指示符

decltype类型指示符一、什么是decltype类型指示符二、typeid运算符三、使用decltype指示符四、decltype和引用五、decltype(auto)六、本章代码汇总一、什么是decltype类型指示符 有时会遇到这种情况&#xff1a;希望从表达式的类型推断出要定义的变量的类型&#xff0c;但是不…

超实用的实用Shell脚本

一、Dos 攻击防范&#xff08;自动屏蔽攻击 IP&#xff09; 代码&#xff1a; #!/bin/bash DATE$(date %d/%b/%Y:%H:%M) LOG_FILE/usr/local/nginx/logs/demo2.access.log ABNORMAL_IP$(tail -n5000 $LOG_FILE |grep $DATE |awk {a[$1]}END{for(i in a)if(a[i]>10)print…

Spring 学习笔记2

1.spring设置JDBC链接池 classpath:jdbc.properties是有多个连接池时的写法&#xff0c;一般都用这种 还有就是配置文件里不要直接使用username&#xff0c;会被覆盖 使用${}来从文件里读取属性 <beans xmlns"http://www.springframework.org/schema/beans"xmlns…

bitmap原理+性能优化实践

目录 背景 总体结构 从RoaringBitmp说起 3.1arraycontainer 1.3.2 bitmapcontainer 1.3.3 runcontainer 上源码 Roaring64NavigableMap RoaringBitmap RoaringArray 三种Container ArrayContainer BitmapContainer RunContainer 工作应用 需求 分析 能否多线…

ArcGIS基础实验操作100例--实验75气体扩散空间分析

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验75 气体扩散空间分析 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

MySQL常用基础 - 小白必看(二)

MySQL数据库基本操作 一、DDL 概念&#xff1a;是一个数据定义语言 该语言部分包括&#xff1a; 1、对数据库的常用操作 创建数据库&#xff1a; 1、create database 数据库名 (直接删除) 2、create database if not exists 数据库名 &#xff08;判断数据库是否存在&…

视频的水印怎样去掉?这些去水印的方法值得你试试看

喜欢视频剪辑的你会不会经常遇到这种情况&#xff1a;每次上网查找的视频素材&#xff0c;保存下来后总是带有一些水印&#xff0c;这些水印不仅不够美观&#xff0c;而且还会遮挡住视频的一些部分&#xff0c;实在是烦人。如果你遇到这种情况&#xff0c;会很想知道“给视频无…

86、【栈与队列】leetcode ——39. 滑动窗口最大值:单调队列+滑动窗口(C++版本)

题目描述 239. 滑动窗口最大值 一、单调队列滑动窗口方法 本题的特点是维护一个窗口&#xff0c;在窗口不断向前移动时&#xff0c;获取其中的最大值。由于窗口在向前移动过程中&#xff0c;元素存在着进入和出去的连续顺序&#xff0c;与FIFO的特点类似。 故可考虑用队列实…

【数据结构】初识数据结构,十分钟带你玩转算法复杂度

目录 &#x1f34a;前言&#x1f34a;&#xff1a; &#x1f95d;一、初识数据结构&#x1f95d;&#xff1a; 1.数据结构&#xff1a; 2.算法&#xff1a; &#x1f353;二、算法效率&#x1f353;&#xff1a; &#x1f348;三、算法复杂度&#x1f348;&#xff1a; 1.时…

4-1文件管理-文件系统基础

文章目录一.文件的基本概念二.文件的逻辑结构&#xff08;一&#xff09;无结构文件/流式文件&#xff08;二&#xff09;有结构文件1.顺序文件2.索引文件3.索引顺序文件4.直接文件/散列文件三.文件目录四.文件的物理结构/文件分配方式1.连续分配2.链接分配3.索引分配五.文件存…

数据结构与算法基础(王卓)(8)附:关于new的使用方法详解

part 1&#xff1a; C中new的用法&#xff08;不过就是&#xff09;如下&#xff08;几种用法&#xff09;&#xff1a; 1&#xff1a; new<数据类型> 分配&#xff1a; 指定类型的&#xff0c;大小为1的&#xff0c;内存空间&#xff1b; int *i new int;//注意&am…