On Android System WebView the Web Share API simply does not exist: navigator.share is undefined. On iOS it exists only behind a user gesture, a secure context, and a feature policy that embedded browsers routinely strip. The page cannot open the OS share sheet, so the share button either errors out or silently falls back to a copy-link. A host-owned runtime exposes a real native share bridge — one sheet, every engine, every embedded browser.

navigator.share is missing, not just unsupported

The Web Share API works in Chrome, Edge, Safari, and Samsung Browser. It does not work in Android System WebView. MDN's browser-compatibility table is explicit: under "WebView Android" the Web Share API is No. A Tauri plugin notes the same blunt fact — "The Web Share API (navigator.share) is not supported in Android WebView, even though it's Chromium-based." So a share button built to the spec does nothing: if (navigator.share) is false, the handler never runs, and the feature is invisible.

iOS is supported but gated hard

On iOS, WKWebView supports Web Share from iOS 14 — but only when every condition holds. The call must sit inside a user-activation handler such as a click; awaiting any fetch or analytics call before share() runs discards the activation and the call rejects with NotAllowedError. It requires a secure context (https — http:// and most file:// origins expose no API at all). Inside an iframe it needs allow="share". And built-in browsers — WeChat, TikTok, Instagram — frequently do not implement the sheet or strip the permission policy, so the same code that works in Safari fails there.

What breaks when the sheet is gone

  • The button does nothing. On Android WebView navigator.share is undefined; the click is a no-op.
  • Silent failure. iOS rejects outside a gesture or secure context with NotAllowedError/AbortError the page is not even told to expect.
  • Copy-link is the only fallback. Losing the OS share sheet means losing every social target, messenger, and AirDrop — a degraded experience users notice.
  • Embedded browsers diverge. WeChat/TikTok/Instagram silently skip the sheet while Safari works, so QA in Safari hides the real-world break.
  • File sharing is narrower still. canShare({ files }) returns false on engines that cannot share files at all, forcing yet another branch.

The runtime fix

A host-owned runtime owns the share intent. The host registers a native share bridge and opens the real OS share sheet — UIActivityViewController on iOS, Intent.ACTION_SEND with Intent.createChooser() on Android — carrying title, text, URL, and files across every engine and every embedded browser. The page calls one uniform bridge; the runtime decides how to present it. One share surface, everywhere.

DimensionWebViewHost-owned runtime
Android navigator.shareUndefinedNative sheet
iOS gesture/secure gateEasy to missHandled natively
Embedded browsers (WeChat, etc.)Sheet strippedNative sheet
File sharingNarrow, canShare gatedNative sheet + files
FallbackCopy-link onlyReal targets
ConsistencyPer-engineUniform

A native app opens the OS share sheet on every phone. A stock WebView opens it on almost none. A runtime gives the page one sheet — and every target behind it.

Sources