# N+1 安装问题：同一个 PWA、多份互相独立的安装

> 安装 PWA 为何与用来安装它的浏览器绑定，导致同一个 PWA 可能在设备上被不同浏览器分别安装为互相独立、数据隔离的多份实例——以及为什么只有执行安装的那个浏览器才知道已安装状态。

**一句话：** 安装 PWA 与用来安装它的浏览器绑定，所以用第二个浏览器安装同一个 PWA 会创建一份独立的
新副本，而不是复用第一份安装。

## 安装被限定在执行安装的浏览器内

浏览器安装的 PWA 会一直专属于该浏览器——用来安装 PWA 的浏览器，也就是运行该 PWA 的浏览器。这意味
着同一个 PWA 可以从不同的浏览器分别安装，这两份已安装的应用会作为两个互不共享任何数据的独立实例。

## 安装状态不会跨浏览器感知

执行安装的浏览器知道该 PWA 已被安装，但其他浏览器无法获知这个安装状态。例如，如果用 Microsoft
Edge 安装了某个 PWA，之后再访问该网站时 Edge 会提示打开这个 PWA，而 Chrome 由于不知道 Edge 那边
的安装，会继续提示安装该应用。如果之后再用 Chrome 也安装一次，设备上就会出现该 PWA 的两份独立
副本。

## 每份安装的存储互相隔离

当同一个 PWA 的多个实例同时打开时，从不同浏览器安装的实例之间不会共享数据——每个浏览器安装的
副本都保有自己独立的存储。

## 卸载同样是与浏览器绑定的

类似地，卸载 PWA 所用的方法取决于当初是用哪个浏览器安装的（例如通过 `edge://apps` 或
`chrome://apps`），因此移除某个浏览器的副本，并不会移除同一 PWA 在另一浏览器中的副本。

## 不同平台上的重复安装行为并不相同

再次安装是会产生重复应用还是复用已有应用，除了取决于是否切换浏览器之外，也取决于平台：

- 在 iOS/iPadOS 上，同一个 PWA 可以被多次安装；每一次安装都拥有各自独立的存储，并被当作不同的
  应用对待。
- 在桌面端，同一个浏览器无法把同一个 PWA 安装两次。
- 在 Android 上，基于快捷方式的安装即使用同一个浏览器也可以创建多次；这种情况下，所有这些安装都
  指向同一个已安装实例，并使用同一份存储。相比之下，基于 WebAPK 的安装无法被安装两次。

## 实用清单

- [ ] 不要假设在一个浏览器中安装了 PWA，就会阻止（或被另一个浏览器感知到）该设备上另一个浏览器
      弹出的安装提示。
- [ ] 不要假设从不同浏览器安装的同一个 PWA 副本之间会共享数据——每份副本的存储都是隔离的。
- [ ] 引导用户使用与其安装来源浏览器匹配的卸载入口（例如 `edge://apps`、`chrome://apps`）。