# Firefox 上的 PWA

> Firefox 上的安装：Firefox 143 起 Windows 支持任务栏 Web 应用，Android 版可按清单安装，但没有 beforeinstallprompt。如何编写不依赖安装提示的安装流程。

**一句话：** Firefox 143（2025-09-16 发布）起，Windows 用户可以把网站固定到任务栏并以
简化窗口作为 Web 应用运行；Firefox for Android 支持从清单安装 PWA；但两者都不会触发
`beforeinstallprompt`，安装流程代码不能假设提示一定存在。

## 在 Firefox 上"安装"具体指什么

根据 Firefox 143 发行说明，Windows 上的 Firefox 现在"支持把网站作为 Web 应用直接固定到
任务栏运行"——从任务栏启动的简化窗口，并保留用户已安装的附加组件。发行说明同时指出，
该功能"目前不适用于从 Microsoft Store 安装的 Firefox"。页面内没有安装图标，清单本身也
无法产生这个窗口；固定操作由用户在 Firefox 自己的界面中完成。macOS 与 Linux 上的桌面
Firefox 仍然没有清单驱动的安装流程。根据 MDN 的 `BeforeInstallPromptEvent` 页面，该接口
是非标准的，主要由基于 Chromium 的浏览器实现，因此任何版本的 Firefox 都不会触发它。

## 特性检测与回退

提供"安装应用"按钮的代码不能假设这些安装 API 一定存在：

```html
<button id="install-button" hidden>安装应用</button>
<p id="install-instructions" hidden>
  当前浏览器不支持从本页一键安装。可以收藏此页，或直接把它当作普通标签页使用——
  有些浏览器会在自己的菜单里提供"添加到主屏幕"选项，但并非所有浏览器都有。
</p>

<script>
  let deferredPrompt = null;
  const installButton = document.getElementById('install-button');
  const installInstructions = document.getElementById('install-instructions');

  function showManualInstallInstructions() {
    installInstructions.hidden = false;
  }

  if (!('onbeforeinstallprompt' in window)) {
    // 此处不受支持（例如桌面 Firefox，或 Safari）：该事件永远不会触发，因此转而
    // 引导用户使用手动替代方案，而不是展示一个失效的安装按钮。
    showManualInstallInstructions();
  } else {
    window.addEventListener('beforeinstallprompt', (event) => {
      event.preventDefault();
      deferredPrompt = event;
      installButton.hidden = false;
    });

    installButton.addEventListener('click', async () => {
      if (!deferredPrompt) return;
      deferredPrompt.prompt();
      deferredPrompt = null;
    });
  }
</script>
```

上面的回退文案刻意没有断言每个这样的浏览器都
有自己的"安装"菜单项：根据 MDN，桌面 Firefox 不支持从清单安装 PWA，因此诚实的指引
是"当作普通标签页使用，或收藏它"。相比之下，Firefox for Android 与 Chrome、Edge、
Opera 和三星 Internet 一起，被归为支持从清单安装 PWA 的浏览器。

## 支持情况

根据 MDN，Firefox for Android 支持从清单安装 PWA，与 Android 上的 Chrome、Edge、
Opera 和三星 Internet 一样。桌面端，Windows 上的 Firefox 143 及之后版本提供任务栏
Web 应用（发行说明，2025-09-16）；macOS 与 Linux 上的 Firefox 没有清单驱动的安装流程，
这使它成为主流桌面引擎中的例外——基于 Chromium 的桌面浏览器都支持从清单安装。

## 实用清单

- [ ] 永远不要把核心功能挂在"安装成功"这个前提上——桌面 Firefox 用户必须能够以普通
      标签页的形式完整使用该应用。
- [ ] 用特性检测判断 `beforeinstallprompt` 是否受支持，而不是假设每个浏览器都会触发
      它；不受支持时转向手动说明分支。
- [ ] 不要假设应用其余功能依赖于安装——把核心体验设计为首先能作为普通浏览器标签页
      使用。
- [ ] 不要无条件展示"安装"按钮；只在 `beforeinstallprompt` 确实触发后才显示它，或者
      在 Firefox 上替换为特定浏览器的指引。
- [ ] 定期复核这一结论——Mozilla 的浏览器功能集会独立于本条目未描述的底层 Web 规范
      而发生变化。

## 相关参考

- [iOS 与 Safari 上的 PWA](/zh/reference/platforms/ios-safari/) —— 另一个拥有自身
  安装流程约束、且与 Chromium 不同的平台。
- [Chrome 与 Android 上的 PWA](/zh/reference/platforms/chrome-android/) —— 本条目的
  回退代码在 Firefox 上所规避的、由 `beforeinstallprompt` 驱动的安装流程。