跳转到内容

iOS 与 Safari 上的 PWA

一句话: iOS 只能通过 Safari 手动的添加到主屏幕安装 PWA(没有 beforeinstallprompt,也没有安装横幅)。一旦添加,应用便以独立模式运行,拥有自己的 Service Worker;对于主屏幕应用还支持 Web Push 与角标。请按 WebKit 的能力集设计、 提供明确的安装说明,并在真机上测试。

  • 只能“添加到主屏幕”。 安装通过 Safari 的分享菜单 →添加到主屏幕 完成。没有 程序化安装:iOS 上不会触发 beforeinstallprompt,因此你无法触发或延迟原生提示。
  • Safari 是唯一入口。 只有 Safari 能安装主屏幕 Web 应用。iOS 上的第三方浏览器虽 经 WebKit 渲染,但历来无法创建主屏幕 PWA。
  • 浏览器不提供安装 UI。 没有地址栏安装按钮或横幅,不了解流程的用户无法自行发现。
  • 独立显示模式。 使用 display: standalone(或 fullscreen)时,应用以无浏览器 控件的方式打开——无地址栏——并采用 manifest 的 name、图标与主题色。
  • Service Worker。 Service Worker 可用于缓存、离线支持与后台抓取处理,受 WebKit 的生命周期与存储规则约束。
  • Web Push。 Web Push 与 Notifications API 仅对已添加到主屏幕的应用生效——在 Safari 标签页中打开的同一站点不生效。权限必须在已安装应用内由用户手势触发请求。
  • 角标。 App Badging API 可为拥有通知权限的已安装应用在主屏幕图标上设置计数角标。
  • 存储被回收。 浏览器管理的存储(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 硬件上验证。