在 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 给页面一套面板——以及它背后所有的目标。

参考来源