iOS 与 Safari 上的 PWA
一句话: iOS 只能通过 Safari 手动的添加到主屏幕安装 PWA(没有
beforeinstallprompt,也没有安装横幅)。一旦添加,应用便以独立模式运行,拥有自己的
Service Worker;对于主屏幕应用还支持 Web Push 与角标。请按 WebKit 的能力集设计、
提供明确的安装说明,并在真机上测试。
安装如何进行
Section titled “安装如何进行”- 只能“添加到主屏幕”。 安装通过 Safari 的分享菜单 →添加到主屏幕 完成。没有
程序化安装:iOS 上不会触发
beforeinstallprompt,因此你无法触发或延迟原生提示。 - Safari 是唯一入口。 只有 Safari 能安装主屏幕 Web 应用。iOS 上的第三方浏览器虽 经 WebKit 渲染,但历来无法创建主屏幕 PWA。
- 浏览器不提供安装 UI。 没有地址栏安装按钮或横幅,不了解流程的用户无法自行发现。
安装后可用的能力
Section titled “安装后可用的能力”- 独立显示模式。 使用
display: standalone(或fullscreen)时,应用以无浏览器 控件的方式打开——无地址栏——并采用 manifest 的name、图标与主题色。 - Service Worker。 Service Worker 可用于缓存、离线支持与后台抓取处理,受 WebKit 的生命周期与存储规则约束。
- Web Push。 Web Push 与 Notifications API 仅对已添加到主屏幕的应用生效——在 Safari 标签页中打开的同一站点不生效。权限必须在已安装应用内由用户手势触发请求。
- 角标。 App Badging API 可为拥有通知权限的已安装应用在主屏幕图标上设置计数角标。
需要绕开的约束
Section titled “需要绕开的约束”- 存储被回收。 浏览器管理的存储(Cache Storage、IndexedDB)在长期未使用后可能被 回收。将缓存视为可丢弃,并在启动时重新抓取或同步关键数据;切勿假设本地数据永久存在。
- 没有安装提示或横幅。 浏览器不显示任何内容,发现完全依赖你自己的 UI。
- 硬件/API 面受限。 Chromium 上常见的部分能力(蓝牙、USB、NFC、环境传感器、持久 后台同步)在 WebKit 下不可用或受限。请进行特性检测并优雅降级。
- 各应用相互隔离。 每个主屏幕实例拥有独立的存储与会话,状态和登录不会与用于安装 的 Safari 标签页共享。
| 特性 | iOS / WebKit 支持 | 说明 |
|---|---|---|
| 添加到主屏幕 | 支持(手动) | 仅限 Safari 分享菜单;无程序化安装。 |
beforeinstallprompt |
不支持 | 事件从不触发;无法自定义安装提示。 |
| 安装横幅 / 地址栏按钮 | 不支持 | 需自行提供安装说明。 |
| 独立显示模式 | 支持 | display: standalone / fullscreen;无控件窗口。 |
| Service Worker | 支持 | 缓存与离线;受 WebKit 生命周期约束。 |
| Web Push 与通知 | 支持(仅主屏幕应用) | Safari 标签页不支持;需由用户手势请求。 |
| 应用角标 | 支持(已安装应用) | 需要通知权限。 |
| 持久存储保证 | 不支持 | 缓存/IndexedDB 在未使用后可能被回收。 |
| Web 蓝牙 / USB / NFC | 不支持 | WebKit 下不可用;请特性检测。 |
- 提供手动安装说明。 检测到 iOS Safari 时,展示一段简短带图的“点按分享,然后 添加到主屏幕”提示——平台不会替你弹出提示。
- 按 WebKit 能力集设计。 对每项能力做特性检测,为不支持的 API 提供回退,避免硬 依赖 WebKit 缺失的硬件 API。
- 将推送置于安装之后。 仅在已安装的主屏幕应用内、由用户手势触发时请求通知权限。
- 假设存储会消失。 启动时重新校验并同步重要数据;将权威数据源保留在服务器端。
- 在真机上测试。 独立模式行为、推送、角标与存储回收都与桌面模拟器不同——务必在 真实 iOS 硬件上验证。