# 三星 Internet 浏览器上的 PWA

> 三星 Internet 如何安装 PWA：Add shortcut on Home screen 菜单项、针对 standalone 或 fullscreen manifest 的 ambient badging 加号图标，以及 Samsung DeX 桌面。

三星 Internet 是 Galaxy 手机上基于 Chromium 的默认浏览器，安装 PWA 有两条路径：对任何网站都可用的手动菜单项 **Add shortcut on Home screen**，以及只对 manifest 请求 `standalone` 或 `fullscreen` 的网站出现的 ambient badging 加号图标。两者都来自三星自己的开发者文档；那份文档很薄，本条目只陈述其中记载的内容。

## 工作原理

三星的文档描述的是两个相互独立的安装信号，而不是一个，另有一个面向 DeX 的桌面变体。

### 从菜单手动添加

在 Android 版三星 Internet 中，用户打开浏览器菜单并选择 **Add shortcut on Home screen**（英文界面）。如果 manifest 声明了 `icons` 和 `short_name`，[Progressive Web Apps 页面](https://samsunginternet.github.io/docs/progressive-web-apps)写明所选图标会和所选短名称一起出现在主屏幕上。Web App Manifest 支持自三星 Internet 4 起提供，Service Worker 以及 Push 与 Notification API 也是从 4 开始支持。

### Ambient badging

[Ambient Badging 页面](https://samsunginternet.github.io/docs/ambient-badging)写明，浏览器会显示一个 "+" 符号表示网站可以安装，点按它会打开一个小菜单。列出的要求之一是 manifest 把 `display` 设为 `standalone` 或 `fullscreen`；保持默认 `browser` 显示的网站只有菜单项，没有徽标。Ambient badging 在三星 Internet 5.2 引入。

### Samsung DeX

同一组文档指出，在 Samsung DeX 上运行的三星 Internet 中，Web 应用可以添加到桌面，这让接驳显示器的 Galaxy 设备获得窗口化启动，而不是主屏幕图块。

### 安装事件

三星的文档没有提到 `beforeinstallprompt`。MDN 的[兼容性数据](https://developer.mozilla.org/en-US/docs/Web/API/BeforeInstallPromptEvent)列出三星 Internet 4.0 支持该事件，与其 Chromium 内核一致，因此为 Chrome 自定义安装按钮写的代码预期可以运行；依赖它之前先在 Galaxy 设备上测试，因为三星自己的界面无论如何都可能显示徽标。

## 示例

下面的 manifest 满足徽标的要求；脚本把徽标当作无法观测的事实，转而检测已安装状态。

### 一份符合加号图标要求的 manifest

对徽标来说只有 `display` 重要，但 `short_name` 和 `icons` 决定手动路径放到主屏幕上的是什么。

```json
{
  "name": "Field Notes",
  "short_name": "Notes",
  "start_url": "/",
  "display": "standalone",
  "icons": [{ "src": "/icon-512.png", "sizes": "512x512", "type": "image/png" }]
}
```

`short_name` 要短：三星文档把它称为主屏幕图标旁显示的标签，而 Android 启动器会截断过长的标签。

### 不信任 fullscreen 地检测已安装窗口

三星没有记载任何用于询问徽标是否正在显示的 API，页面只能得知自己已经以安装状态运行。`(display-mode: fullscreen)` 也会匹配调用了 Fullscreen API 的普通页面，所以这里只把 `standalone` 算作信号。

```js
function isRunningInstalled() {
  if (typeof window.matchMedia !== 'function') {
    return false; // 无法查询：当作普通标签页
  }
  return window.matchMedia('(display-mode: standalone)').matches;
}

if (!isRunningInstalled()) {
  // 指向浏览器菜单；没有文档记载的方式能从脚本打开它。
  document.getElementById('install-hint').hidden = false;
}
```

为了徽标而声明 `display: fullscreen` 的网站在这里仍应检测 `standalone`：MDN 的 [`display-mode`](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/display-mode) 页面写明，`fullscreen` 同样匹配由 Fullscreen API 置入全屏模式的页面。

## 实测行为

三星给两个入口起了不同的名字，而其中只有一个由 manifest 驱动。

:::observed
Android 版三星 Internet（英文界面）：浏览器菜单项标签为 "Add shortcut on Home screen"；manifest 把 `display` 设为 `standalone` 或 `fullscreen` 的网站还会额外显示一个 "+" 符号，点按后打开一个小型安装菜单，见三星的 [Progressive Web Apps](https://samsunginternet.github.io/docs/progressive-web-apps) 与 [Ambient Badging](https://samsunginternet.github.io/docs/ambient-badging) 页面（三星 Internet 5.2 及之后）。
:::

注册了 Service Worker 本身并不会为离线缓存任何内容；三星文档把它描述为一个可能从缓存返回响应的网络代理，离线行为只在 `fetch` 处理函数实现之后才出现。

## 仅限中文

国内厂商浏览器（华为、小米、OPPO、UC、QQ 浏览器）与微信内置 WebView 对安装、`standalone`、Service Worker 和 Web Push 的支持，与三星 Internet 并不一致，整理在[国内厂商浏览器兼容性矩阵](/zh/compatibility/cn-vendor-browsers/)中，只依据厂商文档。

## 另请参阅

- [Chrome 与 Android 上的 PWA](/zh/reference/platforms/chrome-android/)
- [安装提示](/zh/reference/installation/install-prompt/)
- [Service Worker 缓存策略](/zh/reference/service-worker/caching-strategies/)
- [国内厂商浏览器兼容性矩阵](/zh/compatibility/cn-vendor-browsers/)
- [Progressive Web Apps](https://samsunginternet.github.io/docs/progressive-web-apps)（samsunginternet.github.io）
- [Ambient Badging](https://samsunginternet.github.io/docs/ambient-badging)（samsunginternet.github.io）