跳转到内容

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

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

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

Section titled “安装被限定在执行安装的浏览器内”

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

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

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

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

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

Section titled “不同平台上的重复安装行为并不相同”

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

  • 在 iOS/iPadOS 上,同一个 PWA 可以被多次安装;每一次安装都拥有各自独立的存储,并被当作不同的 应用对待。
  • 在桌面端,同一个浏览器无法把同一个 PWA 安装两次。
  • 在 Android 上,基于快捷方式的安装即使用同一个浏览器也可以创建多次;这种情况下,所有这些安装都 指向同一个已安装实例,并使用同一份存储。相比之下,基于 WebAPK 的安装无法被安装两次。
  • 不要假设在一个浏览器中安装了 PWA,就会阻止(或被另一个浏览器感知到)该设备上另一个浏览器 弹出的安装提示。
  • 不要假设从不同浏览器安装的同一个 PWA 副本之间会共享数据——每份副本的存储都是隔离的。
  • 引导用户使用与其安装来源浏览器匹配的卸载入口(例如 edge://appschrome://apps)。