# macOS 上的 Safari PWA（Dock 应用）

> Web 应用如何通过 Safari 的"添加到程序坞"在 macOS 上安装与运行——macOS Sonoma 与 Safari 17 带来了什么、manifest 如何塑造 Dock 应用、哪些可用（推送、通知），以及它与 iOS 的差异。

**一句话：** 自 **macOS Sonoma** 搭配 **Safari 17** 起，网站可通过**添加到程序坞**作为 web
应用加入 Dock。它随后在自己的独立窗口中启动——没有 Safari 工具栏——拥有自己的图标，并且
（对已安装的 Dock 应用）支持通知与 Web Push。web 应用 manifest 让你控制该 Dock 应用的外观
与行为。

## 安装如何进行

- **添加到程序坞。** 在 Safari 中打开站点后，选择**文件 → 添加到程序坞**（也可从共享菜单进入）。
  Safari 会创建一个独立的 web 应用并将其放入程序坞；它同时出现在启动台 / 应用程序中。
- **对任何站点都有效。** 无需 manifest 即可把站点加入程序坞——Safari 会推导出名称和图标。
  manifest 让你控制结果（见下）。
- **由用户发起。** 据 WebKit，由用户自行决定哪些成为 web 应用——他们自己发起"添加到程序坞"。

## manifest 如何塑造 Dock 应用

当存在 web 应用 manifest 时，Safari 用它来定制已安装的应用。据 WebKit 的 Safari 17 说明，
manifest 可设定应用的**显示模式**、**名称**、**主题色**与**起始 URL**——因此一份完整的
manifest 会产出一个带品牌、为目的而建的 Dock 应用，而非 Safari 推导出的快捷方式。

## 安装后哪些可用

- **独立窗口。** 应用在自己的窗口中打开，没有 Safari 工具栏，使用你的 manifest 身份。
- **Service worker。** Service worker 用于缓存与离线支持，受 WebKit 的生命周期与存储规则约束。
- **通知与 Web Push。** 已安装的 Mac web 应用支持 Notifications API 与 Web Push，因此能像原生
  Mac 应用那样再触达用户。
- **系统集成。** 应用表现得像 Mac 应用：拥有自己的 Dock 图标、应用切换器条目与窗口管理。

## macOS 与 iOS 有何不同

尽管二者都基于 WebKit，macOS 的 web 应用体验与 iOS 的"添加到主屏幕"不同：

- **入口。** macOS 在桌面使用**添加到程序坞**（文件/共享菜单）；iOS 在设备上使用**添加到
  主屏幕**。
- **形态。** macOS web 应用是可调整大小、具备完整窗口管理的桌面窗口；iOS 应用是全屏的移动
  界面。
- **共有的平台基础。** 二者都运行于 WebKit，因此应围绕其存储模型与特性集来规划，而非假设仅
  Chromium 拥有的能力。

## 存储与逐出

Mac web 应用使用 WebKit 的按源存储。当所有源的总存储用量超过整体配额时，WebKit 可能按源
逐出数据；被标记为持久的存储不受此逐出影响。把缓存的数据视为可能被移除：在启动时重新校验
并重新同步重要数据，并把真相源保留在你的服务器上。

## 实践建议

- **提供完整 manifest。** 给出 `name`、图标、`display`、主题色与 `start_url`，让 Dock 应用
  带品牌且为目的而建。
- **告诉用户如何安装。** 用户通过**文件 → 添加到程序坞**添加应用，因此一条指向该菜单的简短
  提示能帮助 macOS 访客发现它。
- **不要假设持久化。** 在要紧之处申请持久存储，并在启动时重新同步重要数据。
- **在真实 macOS 上测试。** 在实际的 Sonoma 或更新版本的 Safari 安装中，验证独立窗口行为、
  推送与图标。