想象你是一位小吃店老板。以前你的店没有固定门面,顾客每次都要先打开浏览器、输入网址,穿过满屏的广告和链接才能找到你的摊位,一不留神就去了隔壁竞品家。现在,你拿到了一张神奇的“数字营业执照”——Web App Manifest。有了它,浏览器这位“商场管理员”就会认可你是正式商户,允许你把招牌(应用图标)钉在顾客的手机桌面上。顾客抬手一点,店铺就以独立的门面瞬间打开,体验和原生 App 几乎一样。这张“执照”怎么填、招牌怎么钉、开门第一眼怎么惊艳,就是这篇文章要讲的故事。

岗位关联

对 AI 从业者而言,掌握 PWA 安装链路,等于给你的 AI 应用(聊天机器人、AIGC 工具、数据看板)免费配了一个“App 级入口”,能显著提升用户留存与转化率,是低成本获客的必修课。

目录
  1. 可视化演示
  2. 概念基座:一张“数字营业执照”
  3. 核心字段:七个格子的填写技巧
  4. 添加到主屏:把招牌钉上桌面
  5. 图标设计:打造一块扛得住裁剪的招牌
  6. 启动体验:开门瞬间的迎宾灯
  7. 工程实践:开店后的运维手册
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

演示PWA清单文件结构、浏览器安装流程及四种显示模式对比,直观展示Web应用如何添加到主屏变为原生体验。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Manifest清单结构 name/icons/display定义应用元数据 start_url/theme_color配置入口与主题 manifest={name,icons,display,start_url} PWA清单文件声明Web应用的原生化属性

概念基座:一张“数字营业执照”

你想在城里最好的商场租一个固定摊位,物业会先要求你出示营业执照:店名叫什么、招牌长什么样、主营什么业务。没有这张纸,你只能推着小车在商场门口流动叫卖,风吹日晒,客源全靠运气。网页应用也是一样——没有 Manifest 时,用户只能在浏览器里输入网址、穿过层层链接“碰运气”找你;有了 Manifest,浏览器这位“商场管理员”才会把你登记为正式商户,给你一个像样的门面。

Web App Manifest 本质上是一份 JSON 小文件,用键值对写下“这家应用”的身份与外观:叫什么名字、用什么图标、从哪个页面启动、以什么方式呈现。它不包含任何业务逻辑,纯粹是一张“门面登记表”。这张表虽然简单,却是 PWA 大厦的第一块砖。完整的 PWA 依赖三件套:Manifest 负责身份与安装资格,Service Worker 像一位“驻店店员”负责离线缓存与推送,HTTPS 则是商场的安全门禁。三者齐备,网页才真正获得 App 级的体验。

执照内容看似只有七个格子,却是浏览器判断“能不能给你固定摊位”的第一依据。接下来,我们逐格填写这份执照——每一格填错,都会让你的“小店”在顾客眼中掉价。

manifest=(name, short_name, icons, start_url, display, background_color, theme_color)\displaystyle \text{manifest} = \Big( \text{name},\ \text{short\_name},\ \text{icons},\ \text{start\_url},\ \text{display},\ \text{background\_color},\ \text{theme\_color} \Big)
通俗说明:这张“执照”就是七个关键信息的集合。浏览器这位管理员逐步核对,认全了才会考虑给你“固定摊位”。
  1. name 与 short\_name(店名与简称)name 是正式全名,用于安装提示和启动画面;short\_name 是桌面图标下方的小字招牌。两者都写自商店的第一栏。
    name, short_name\displaystyle \text{name},\ \text{short\_name}
  2. icons(招牌图样)一组不同尺寸的图标文件清单,供不同设备挑选合适的“招牌”摆上桌面。
    icons\displaystyle \text{icons}
  3. start\_url(正门地址)用户点击图标后走进的第一个页面,相当于店铺的正门位置。
    start_url\displaystyle \text{start\_url}
  4. display(营业模式)决定开店后是“独立门面”还是“缩在浏览器里”,取值有 fullscreen、standalone 等。
    display\displaystyle \text{display}
  5. 颜色对(装修配色)background\_color 是开门瞬间的迎宾底色,theme\_color 是窗口与状态栏的主色调。
    background_color, theme_color\displaystyle \text{background\_color},\ \text{theme\_color}

核心字段:七个格子的填写技巧

执照的第一格是店名。name 是正式全名,写在执照最上方;short\_name 是桌面图标下的“小字”。这里有个常见的坑:如果简称太长,超出了桌面图标下方的空间,浏览器会直接截断成省略号,就像招牌上字太多挤成一团,顾客根本看不清你到底叫什么。所以简称最好控制在 12 个字符以内。

第二格是“正门地址” start\_url。用户点击图标后从这里进门,这个地址建议带点“小心机”——加上 ?source=manifest 之类的来源参数。这就像店门口装了一个计数器,你能清楚知道“这个招牌带来了多少客源”,方便做安装归因分析。第三格是营业模式 display,它决定店铺是“独立旗舰店”还是“商场里的开放柜台”,一共有四档:

选定营业模式后,再配上 background\_color 和 theme\_color 这对“装修色”,店铺外观就定稿了。接下来,就得请商场管理员来验收场地,决定是否允许你把招牌钉上顾客的桌面。

display∈{fullscreen, standalone, minimal-ui, browser}\displaystyle \text{display} \in \{ \texttt{fullscreen},\ \texttt{standalone},\ \texttt{minimal-ui},\ \texttt{browser} \}
通俗说明:这四档就是四种“门面装修方案”,从全封闭旗舰店到路边开放式柜台,沉浸感逐级递减,但兼容性逐级递增。
  1. fullscreen(全封闭旗舰店)应用占满整块屏幕,不显示任何浏览器控件,适合游戏和沉浸式工具。
    fullscreen\displaystyle \texttt{fullscreen}
  2. standalone(独立精品店)有独立窗口和返回按钮,但没有地址栏,是移动端“添加到主屏”最推荐的方案。
    standalone\displaystyle \texttt{standalone}
  3. minimal-ui(简约柜台)保留少量浏览器控件,兼容性较好,但视觉上的“App 感”略逊一筹。
    minimal-ui\displaystyle \texttt{minimal-ui}
  4. browser(路边摊模式)退化为普通浏览器标签页,没有任何 App 质感,但最稳定、最不会出问题。
    browser\displaystyle \texttt{browser}

添加到主屏:把招牌钉上桌面

执照填好了,但商场管理员不会主动给你安排展位。他会先在后台做一轮“入场检查”,四项全绿,才会在顾客逛街时试探性地问一句:“要不要把这家店加到你的桌面?”这个过程在技术圈叫 A2HS(Add to Home Screen),也就是我们常说的“添加到主屏”。

入场检查有四个硬性条件,少任何一项,用户就永远看不到安装按钮。另外,Chrome 还要求用户与页面有过真实交互(比如点击或滚动)后才弹提示,避免页面一打开就强推弹窗惹人烦。聪明的开发者会监听 beforeinstallprompt 事件,把默认横幅拦截下来,换成自己设计得更好看的引导卡片——这就像你提前跟管理员约好,在顾客心情最好的时候递上邀请函,而不是在他刚路过时硬塞传单。

四道检查全过,招牌才能上桌。但请注意:iOS Safari 没有 beforeinstallprompt 事件,用户只能通过分享菜单手动“添加到主屏”,体验上天然少了一道“官方邀请”。所以招牌本身的质量,往往决定了这次入驻的第一印象——下一节,我们就来打磨这块招牌。

Installable=HTTPS∧Manifest∧Icons∧ServiceWorker\displaystyle \text{Installable} = \text{HTTPS} \wedge \text{Manifest} \wedge \text{Icons} \wedge \text{ServiceWorker}
通俗说明:四个条件就像“消防、卫生、工商、税务”四道检查,全部绿灯才能验收入驻;缺一道,顾客就永远看不到“添加到主屏”这个按钮。
  1. HTTPS(安全门禁)只有 https:// 或 localhost 地址才被信任,这与 Service Worker 的可用范围一致,是安全底线。
    HTTPS\displaystyle \text{HTTPS}
  2. Manifest(执照在档)存在非空且语法正确的 manifest,并且包含 name、icons、start\_url、display 等关键字段。
    Manifest\displaystyle \text{Manifest}
  3. Icons(招牌齐备)至少提供 192px 和 512px 两种规格的图标,否则桌面图标与启动画面都无法生成。
    Icons\displaystyle \text{Icons}
  4. ServiceWorker(店员在岗)注册了可用的 Service Worker,保证断网时仍能开门营业,这是“安装”的实质要求。
    ServiceWorker\displaystyle \text{ServiceWorker}

图标设计:打造一块扛得住裁剪的招牌

招牌是顾客对店铺的第一印象。Manifest 里的 icons 数组就是“招牌图样清单”,每个元素是一个图标条目,像一张设计稿的标注卡,写清了图样文件、尺码、材质和用途。同时,现代系统普遍支持 maskable(可蒙版)图标,系统会把图标裁成圆形或圆角矩形,就像商场统一招牌规格、把方形的设计稿剪成圆形挂起来一样。

多尺寸适配是另一个关键点:Android 的启动画面需要 512px 版本,桌面图标常用 192px,浏览器标签页要 32px 的 favicon。清单里放三到五个尺寸就够,多放无益反而增加下载负担。而 maskable 的“安全区”概念尤其重要——四周 10% 的区域会被蒙版裁掉,相当于 T 恤印刷的“出血区”,关键图案必须放在中心 80% 以内,否则就会被“领口和袖口”切掉。

招牌搞定后,我们来布置店门打开的第一眼。AI 时代,用图像生成模型批量产出多尺寸、带安全区的图标已经是常规操作——我们稍后在 Python 演示里会写一个“招牌质检员”。

icons[i]={src, sizes, type, purpose},safe=0.8×min⁡(w, h)\displaystyle \text{icons}[i] = \{ \text{src},\ \text{sizes},\ \text{type},\ \text{purpose} \},\qquad \text{safe} = 0.8 \times \min(\text{w},\ \text{h})
通俗说明:maskable 就像印 T 恤——图案必须留白边,否则会被裁剪边缘吃掉;中心 80% 才是绝对安全区。
  1. src(图样文件)图标的 URL 路径,如果填相对路径,是相对 manifest 文件所在位置解析的。
    src\displaystyle \text{src}
  2. sizes(尺码表)用 “192x192“ 声明像素尺寸,多个尺寸用空格分隔;sizes 写 ”any” 表示矢量图。
    sizes\displaystyle \text{sizes}
  3. type(材质说明)图标的 MIME 类型,如 image/png、image/svg+xml,方便浏览器预判能否解码。
    type\displaystyle \text{type}
  4. purpose(用途标签)any 表示通用,maskable 表示接受蒙版裁剪,也可以写 "any maskable" 让系统自行选择。
    purpose\displaystyle \text{purpose}
  5. safe(安全区)maskable 图标下,关键内容必须落在中心 80% 区域内,即四周各留 10% 的出血区。
    safe=0.8×min⁡(w, h)\displaystyle \text{safe} = 0.8 \times \min(\text{w},\ \text{h})

启动体验:开门瞬间的迎宾灯

顾客点下桌面图标的那一刻,页面还没来得及渲染,屏幕上会出现一个短暂的“启动画面”。很多开发者误以为那是一张提前做好的图片,其实它是系统用 manifest 里的三样素材现场拼装出来的——就像酒店门童在你推门的瞬间点亮迎宾灯,灯光、招牌、店名三个元素瞬间组成第一印象。

这三个素材缺一不可:背景色要尽量贴近页面实际背景,这样从启动画面到页面渲染的过渡才不会“闪一下白屏”;图标要选 512px 的大图,放大后依然清晰;名称用完整的 name 而不是简称,显得正式。由于启动画面是现场拼装的,想改它只需改 manifest 字段,但也正因为如此,它受缓存周期影响,改了不能立刻看到效果。

启动体验是店铺的“黄金三秒”,决定了用户是否愿意留下来。不过也要认清现实:即使体验再接近原生 App,已安装的 PWA 本质仍是“快捷入口加离线能力”,推送、内存占用等与原生应用仍有差距。产品预期摆正了,接下来才是日常运营——执照的更新与维护。

Splash=background_color⊕icon512⊕name\displaystyle \text{Splash} = \text{background\_color} \oplus \text{icon}_{512} \oplus \text{name}
通俗说明:启动画面是一道拼盘菜——迎宾底色、512 大招牌照、正式店名,三样素材由系统现场拼装,不用你单独准备图片。
  1. background\_color(迎宾底色)在 CSS 加载之前就生效,保证启动瞬间不白屏,颜色应尽量接近页面背景色。
    background_color\displaystyle \text{background\_color}
  2. icon\_512(招牌大图)启动画面正中央的图标,Android 规范要求使用 512px 版本以保证清晰度。
    icon512\displaystyle \text{icon}_{512}
  3. name(正式店名)图标下方的应用名称,使用完整 name 字段,而非 truncated 的简称。
    name\displaystyle \text{name}

工程实践:开店后的运维手册

店铺开张后,执照不是一劳永逸的。部署 manifest 时,用一行 <link rel="manifest" href="/manifest.json"> 把它挂到页面上,文件可以放在站点根目录或 CDN;上线前用 Lighthouse 的 PWA 审计做一轮“体检”,就像请第三方质检员来店里打分。

在多品牌、多站点的场景下,manifest 通常由构建脚本或后端动态生成,同一套模板注入不同品牌的名称与配色。AI 时代还有一个新玩法:用大语言模型(LLM)对 manifest 做合规审查,检查字段完整性、图标是否齐备、display 取值是否合法——相当于给执照审核配了一位“AI 监理”,把人工 Review 的漏检率降下来。更新策略同样值得重视:浏览器对 manifest 有约 24 小时的缓存窗口,也就是说,改完执照后最迟一天内会生效,但已经钉在用户桌面上的旧招牌不会自动更换。

从办执照、填字段、钉招牌、装迎宾灯,到日常运维,一条完整的“店铺入驻”链路已经打通。现在,轮到 AI 从业者思考:如何把这条路真正用到自己的产品里,让 AI 应用也拥有一扇随时可敲的门。

manifestt={cache,t−t0<24 hfetch,t−t0≥24 h\displaystyle \text{manifest}_t = \begin{cases} \text{cache}, & t - t_0 < 24\,\text{h} \\ \text{fetch}, & t - t_0 \ge 24\,\text{h} \end{cases}
通俗说明:商场管理员每 24 小时才去工商局重新核对一次执照;即便执照更新了,已经贴在桌面上的旧招牌也要用户“撕掉重贴”才能换新。
  1. cache 分支(读缓存)浏览器在 24 小时内优先使用缓存的 manifest,避免频繁请求,节省流量。
    cache,t−t0<24 h\displaystyle \text{cache},\quad t - t_0 < 24\,\text{h}
  2. fetch 分支(重新拉取)超过 24 小时或用户重启浏览器后,浏览器会重新请求 manifest 文件。
    fetch,t−t0≥24 h\displaystyle \text{fetch},\quad t - t_0 \ge 24\,\text{h}
  3. reinstall(换新招牌)用户需要移除旧入口并再次执行“添加到主屏”,新图标和新名称才会出现在桌面。
    reinstall⇒iconnew, namenew\displaystyle \text{reinstall} \Rightarrow \text{icon}_{\text{new}},\ \text{name}_{\text{new}}

AI 应用场景

智能安装引导:让 AI 决定何时递上“邀请函”

阶段:用户行为分析与交互优化

解决的问题:浏览器默认的 beforeinstallprompt 弹窗时机不可控,页面一打开就弹窗容易被打断,弹得太晚用户又已经离开。AI 通过埋点数据(停留时长、滚动深度、点击热区)实时预测用户意图,把“添加到主屏”的邀请递到用户最有粘性的那一刻,就像店长看顾客逛得开心时才递上会员卡。

具体案例:某 AIGC 绘图工具页,用户连续生成三张图后,模型判断其处于高粘性状态,此时触发定制的“加桌面”引导卡片,安装率提升 40%,次日留存提高 12%。

AI 批量生成 maskable 多尺寸图标

阶段:素材生成(AIGC 图像生成)

解决的问题:手工为 192px、512px、maskable 等规格各出一版图标耗时费力,且非设计出身的开发者容易踩安全区红线。AI 一次生成主视觉,再自动推导预留 20% 出血区的安全版本,输出全套多尺寸图标,直接塞进 manifest 的 icons 数组。

具体案例:某运营团队用 AI 为品牌活动页生成四套不同节日主题的图标,通过动态 manifest 在节日当天“换招牌”,活动页安装率提升 20%,视觉焕新成本几乎为零。

LLM 驱动的 Manifest 合规审查

阶段:代码质量审查与 CI 集成

解决的问题:人工 Review manifest 容易漏检——缺 512 图标、display 写错、start\_url 指向外域、maskable 安全区不足。LLM 结合规则库自动审查配置并给出修复建议,像给执照审核配了一位不知疲倦的“AI 监理”。

具体案例:某中大型前端团队在 CI 流水线中加入 LLM 审查任务,PR 提交 manifest 变更时自动输出“缺少 maskable 图标”“short\_name 超长”等警告,配置类 bug 减少 70%。

Python 演示

python42 行
import json # 营业执照必填栏:少一项都拿不到固定摊位REQUIRED_FIELDS = ["name", "short_name", "start_url", "display", "icons"] def validate_manifest(manifest):    report = {}    for field in REQUIRED_FIELDS:        report[field] = field in manifest and bool(manifest[field])    icons = manifest.get("icons", [])    sizes = [i.get("sizes", "") for i in icons]    report["icon_192"] = any(s.startswith("192") for s in sizes)    report["icon_512"] = any(s.startswith("512") for s in sizes)    report["https"] = manifest.get("start_url", "").startswith("https://")    report["display_ok"] = manifest.get("display") in ("standalone", "fullscreen", "minimal-ui")    return report def install_check(report):    missing = [k for k, v in report.items() if not v]    return len(missing) == 0, missing def main():    sample_manifest = {        "name": "Todo PWA",        "short_name": "Todo",        "start_url": "https://todo.example.com/?source=manifest",        "display": "standalone",        "background_color": "#ffffff",        "theme_color": "#818CF8",        "icons": [            {"src": "/icons/icon-192.png", "sizes": "192x192", "type": "image/png"},            {"src": "/icons/icon-512.png", "sizes": "512x512", "type": "image/png"}        ]    }    report = validate_manifest(sample_manifest)    ok, missing = install_check(report)    for key in sorted(report):        print(f"{key:>10} : {'OK' if report[key] else 'MISSING'}")    print("INSTALLABLE" if ok else "NOT_INSTALLABLE -> " + ",".join(missing)) if __name__ == "__main__":    main()
目的:实现一个“数字营业执照质检员”,逐项核对 manifest 的必填字段、图标规格与 HTTPS 门禁,最终输出该应用是否满足“添加到主屏”的安装条件。
  1. REQUIRED_FIELDS = [...]定义“执照必填栏”,这些字段缺一不可。
  2. report[field] = field in manifest and bool(manifest[field])逐格核对:字段既要存在,又不能是空值。
  3. sizes = [i.get("sizes", "") for i in icons]从图标清单里抽出所有尺码,准备做规格检查。
  4. report["icon_192"] = any(s.startswith("192") for s in sizes)确认至少有一块 192px 的招牌,满足桌面图标需求。
  5. report["https"] = manifest.get("start_url", "").startswith("https://")安全门禁检查,非 HTTPS 一律不给入驻资格。
  6. report["display_ok"] = manifest.get("display") in (...)营业模式必须取合法四档之一,乱填会直接判不合格。
  7. missing = [k for k, v in report.items() if not v]收集所有不合格项,方便定位“缺哪道检查”。
  8. print(f"{key:>10} : {'OK' if report[key] else 'MISSING'}")打印格式化质检单,一眼看清哪里亮红灯。
  9. if __name__ == "__main__":提供可执行入口,命令行直接运行即出报告。

常见误区

误区“我在页面里放了一个 manifest.json,我的网站就已经是 PWA 了,应该断网也能打开吧?”这是很多初学者配置完 manifest 后的第一反应。

正解manifest 只是“营业执照”,它决定应用的身份与外观,让浏览器认识你;但离线的能力来自 Service Worker——那位“驻店店员”。没有店员,店面再漂亮,顾客断网时依然进不了门。两者配合,才叫完整的 PWA。

为何常见:大家看到“添加到主屏”后应用像原生 App 一样有独立图标,就容易误以为整个网页已经被“下载”到手机里了。

误区“添加到主屏之后,页面内容应该被完整保存到手机里了吧?那跟原生 App 还有什么区别?”

正解默认情况下,A2HS 只是在桌面创建一个快捷入口,页面仍然按需联网加载。只有配合 Service Worker 做预缓存,才能实现离线秒开。它像在桌面贴了一张直达电梯卡,而不是把整层商场搬进你的手机。

为何常见:因为安装后的图标、启动画面、独立窗口太像原生应用,人们自然产生了“整个应用都在本地”的错觉。

误区“反正我有一张 1024px 的大 Logo,填到 manifest 里,系统自己会缩放,不用管什么尺寸和 maskable。”

正解系统会按蒙版把图标裁成圆形或圆角矩形,边缘的图案会被直接切掉,大图也救不了。正确做法是提供 192px 与 512px 等多个尺寸,并把关键内容放在中心 80% 的安全区内。

为何常见:桌面和网页常见的图标展示都是完整方形,开发者很难意识到移动系统会主动做蒙版裁剪。

误区“我把 display 设为 fullscreen,iPhone 上打开也应该全屏无地址栏吧?”

正解iOS Safari 对 display 字段的支持非常有限,会忽略 fullscreen 并按浏览器模式处理。跨平台最稳妥的取值是 standalone,并且一定要在真机上实测各系统的表现,不能只看安卓的效果。

为何常见:开发者习惯在 Chrome 桌面模拟器里调试通过就以为万事大吉,忽略了 iOS 的差异化实现。

误区“我把 manifest 里的图标和名称改了,刷新一下页面,用户桌面上应该马上看到新图标吧?”

正解浏览器对 manifest 有约 24 小时的缓存窗口,改完不会立即生效;更重要的是,已经“添加到主屏”的旧入口不会自动替换,需要用户手动移除后重新添加。想加速可以改文件名或加版本参数。

为何常见:开发者习惯本地改代码即时刷新验证,忘记浏览器缓存和“安装入口已固化”这两个现实约束。

面试题

Q1. 在 PWA 中,Web App Manifest 文件本质上是——

单选题 · easy

  • A.一份描述应用身份与外观的 JSON 文件← 正确答案
  • B.一段负责缓存网页资源的 JavaScript
  • C.一张用于加密用户数据的证书文件
  • D.一套编译原生 App 的工程代码

答案:A。Manifest 是 JSON 格式的“数字营业执照”,只描述身份与外观,不含逻辑代码;缓存资源靠 Service Worker,加密靠 HTTPS 证书,编译原生代码更与它无关。

Q2. 想让应用以独立窗口启动并隐藏地址栏,display 应设为——

单选题 · easy

  • A.fullscreen 全屏沉浸模式
  • B.standalone 独立窗口模式← 正确答案
  • C.minimal-ui 简约控件模式
  • D.browser 普通标签页模式

答案:B。standalone 正是“独立精品店”模式,有独立窗口和返回按钮但没有地址栏,是移动端添加到主屏的最推荐方案;fullscreen 连返回按钮都藏起来,browser 则退化为普通标签页。

Q3. 下列哪一项不属于“添加到主屏”的必要条件?

单选题 · mid

  • A.站点必须启用 HTTPS 加密协议
  • B.提供 192 与 512 像素的图标
  • C.注册可用的 Service Worker
  • D.必须上传到各大应用商店← 正确答案

答案:D。A2HS 的四道检查是 HTTPS、Manifest、Icons、ServiceWorker,跟应用商店毫无关系——PWA 最大的卖点之一就是“免商店安装”,用户直接在浏览器里完成添加。

Q4. 关于 beforeinstallprompt 事件,下列说法正确的有——

多选题 · mid

  • A.它可自定义安装弹窗的时机← 正确答案
  • B.它可延迟触发便于引导用户← 正确答案
  • C.它在所有浏览器都必然触发
  • D.它触发后即可调用 prompt 弹窗← 正确答案

答案:ABD。beforeinstallprompt 允许开发者拦截默认横幅、自定义时机,这就像与管理员约好递邀请函的时机;它并非所有浏览器都触发,iOS Safari 就没有该事件,只能走分享菜单。

Q5. maskable 图标的安全区应占图标尺寸的——

单选题 · mid

  • A.约百分之六十的中心区域
  • B.约百分之七十的中心区域
  • C.约百分之八十的中心区域← 正确答案
  • D.约百分之九十的中心区域

答案:C。安全区是中心 80%,即四周各留 10% 的出血区。就像印 T 恤要留白边,否则图案会被领口袖口裁掉;若把安全区设得过大或过小,图标关键内容都可能在蒙版裁剪中受损。

Q6. 桌面图标下方显示的应用短名由哪个字段控制?

单选题 · easy

  • A.桌面短名由 short_name 控制← 正确答案
  • B.桌面短名由 name 字段控制
  • C.桌面短名由 start_url 控制
  • D.桌面短名由 theme_color 控制

答案:A。short\_name 是“简称”,专门用于桌面图标下方这种空间有限的场景;name 是完整名称,用于安装提示和启动画面,两者是执照上的“店名”与“小字招牌”关系。

Q7. PWA 启动画面由哪些素材拼装而成?

多选题 · hard

  • A.背景色使用 background_color← 正确答案
  • B.启动画面居中的 512 图标← 正确答案
  • C.下方显示完整的应用名称← 正确答案
  • D.用户最近访问的网页截图

答案:ABC。启动画面是系统用 background\_color、512px 图标、name 三样素材现场拼装出来的“迎宾灯”,不需要单独准备图片,更不会使用用户的浏览截图,所以截图选项是错误的。

Q8. 修改 manifest 后,已添加主屏的旧用户为何看不到新图标?

单选题 · hard

  • A.浏览器缓存清单约二十四小时← 正确答案
  • B.图标被系统安全策略锁定
  • C.服务器拒绝了新的请求
  • D.新图标必须重新编译上线

答案:A。浏览器对 manifest 有约 24 小时的缓存窗口,类似商场管理员定期核对执照;即便执照更新,已钉在桌面的旧招牌也不会自动换新,需要用户移除后重新添加到主屏。

Q9. 关于 start_url 的工程实践,正确的有——

多选题 · mid

  • A.建议添加来源参数便于统计← 正确答案
  • B.必须指向站内 HTTPS 页面← 正确答案
  • C.可填写其他域名的地址
  • D.应指向应用核心首页← 正确答案

答案:ABD。start\_url 是“正门地址”,应指向站内核心首页,且必须与 manifest 同源(不能跨域),站内的 HTTPS 页面是底线;加上 ?source=manifest 这类参数可以统计安装来源,属于推荐实践。

Q10. 在 iOS Safari 中添加到主屏的特点是——

单选题 · hard

  • A.支持通过自定义事件触发弹窗
  • B.通过分享菜单手动添加主屏← 正确答案
  • C.无需任何图标即可完成安装
  • D.启动画面完全由截图生成

答案:B。iOS Safari 不支持 beforeinstallprompt 事件,用户必须通过分享菜单里的“添加到主屏”手动操作,这是它与 Android 最大的差异;同时启动画面同样由 manifest 素材拼装,图标也是安装的必要条件。