在 Android System WebView 里,Web Share API 根本不存在:navigator.share 是 undefined。在 iOS 上它只存在于用户手势、安全上下文、以及嵌入式浏览器常常被剥离的特性策略背后。页面打不开系统分享面板,分享按钮要么报错,要么悄无声息地退化成复制链接。宿主自有 runtime 暴露真正的原生分享桥——一套面板、所有引擎、所有嵌入式浏览器。
navigator.share 不是「不支持」,而是「不存在」
Web Share API 在 Chrome、Edge、Safari、Samsung Browser 都能用。但在 Android System WebView 里不能用。MDN 的浏览器兼容性表格写得很直白:在「WebView Android」一栏,Web Share API 标注为不支持。一个 Tauri 插件也确认了同样的事实——「即使基于 Chromium,Android WebView 也不支持 Web Share API(navigator.share)」。所以按规范写的分享按钮什么都不做:if (navigator.share) 为假,处理函数从不执行,功能直接隐形。
iOS 能用,但门槛很高
在 iOS 上,WKWebView 从 iOS 14 起支持 Web Share——但只有在每个条件都满足时才行。调用必须位于用户激活的处理函数内(如 click);在 share() 之前 await 任何 fetch 或埋点调用都会丢掉激活状态,调用以 NotAllowedError 被拒。它要求安全上下文(https——http:// 以及大多数 file:// 来源根本不暴露该 API)。在 iframe 内还需要 allow="share"。而微信、抖音、Instagram 这类内置浏览器常常不实现分享面板,或剥离特性策略,于是 Safari 里能跑的代码在这里失败。
面板消失后哪些东西会坏
- 按钮毫无反应。 在 Android WebView 上
navigator.share是undefined,点击就是个空操作。 - 悄无声息地失败。 iOS 在缺少手势或安全上下文时以
NotAllowedError/AbortError拒绝,而页面根本没被提醒要预期这些错误。 - 复制链接成了唯一的退路。 失去系统分享面板,意味着失去每一个社交目标、 messengers、AirDrop——这是用户能感知到的降级体验。
- 嵌入式浏览器各不相同。 微信/抖音/Instagram 静默跳过面板,而 Safari 正常,所以在 Safari 里做 QA 会掩盖真实故障。
- 文件分享更窄。
canShare({ files })在不支持文件分享的引擎上返回 false,又逼出一条分支。
runtime 的解法
宿主自有 runtime 掌握分享意图。宿主注册一个原生分享桥,打开真正的系统分享面板——iOS 用 UIActivityViewController,Android 用 Intent.ACTION_SEND 配合 Intent.createChooser()——把标题、文本、URL 和文件在所有引擎、所有嵌入式浏览器间统一传递。页面调用一个统一的桥;runtime 决定如何呈现。一个分享界面,处处可用。
| 维度 | WebView | 宿主自有 runtime |
|---|---|---|
Android 的 navigator.share | 不存在 | 原生面板 |
| iOS 手势 / 安全上下文门槛 | 极易踩空 | 原生层处理 |
| 嵌入式浏览器(微信等) | 面板被剥离 | 原生面板 |
| 文件分享 | 很窄、受 canShare 限制 | 原生面板 + 文件 |
| 退路 | 仅复制链接 | 真实目标 |
| 一致性 | 因引擎而异 | 统一 |
原生 App 在每台手机上都能打开系统分享面板;而普通 WebView 在几乎任何一台上都打不开。runtime 给页面一套面板——以及它背后所有的目标。
参考来源
- MDN — Web Share API — 兼容性表格中「WebView Android:不支持」明确标注了 navigator.share。
- web.dev — Web Share API — 限制分享的用户激活、安全上下文与 canShare 规则。
- OpenPWA — Web Share API 参考 — NotAllowedError / InvalidStateError 的成因与复制链接降级方案。
- Apple — 在 WKWebView 中实现 Web Share — iOS WebView 支持与手势 / 安全上下文约束。
- Tauri 插件 — 为何 Android WebView 缺少 navigator.share — 维护者确认该 API 在 Android System WebView 中缺位(尽管基于 Chromium)。