No Android System WebView a Web Share API simplesmente não existe: navigator.share é undefined. No iOS ela existe apenas atrás de um gesto do usuário, de um contexto seguro e de uma política de recursos que os navegadores integrados costumam remover. A página não consegue abrir a folha de compartilhamento do sistema, então o botão ou falha ou cai silenciosamente no copiar-link. Um runtime próprio do host expõe uma ponte de compartilhamento nativa real: uma folha, todos os motores, todos os navegadores integrados.
navigator.share não está ausente, é inexistente
A Web Share API funciona no Chrome, Edge, Safari e Samsung Browser. Mas não no Android System WebView. A tabela de compatibilidade da MDN é explícita: em «WebView Android» a Web Share API está marcada como Não. Um plugin do Tauri confirma o mesmo — «A Web Share API (navigator.share) não é suportada no Android WebView, mesmo sendo baseada em Chromium». Assim, um botão de compartilhar feito à especificação não faz nada: if (navigator.share) é falso, o manipulador nunca executa e o recurso fica invisível.
iOS é suportado, mas com muitas condições
No iOS, o WKWebView suporta Web Share a partir do iOS 14 — mas só quando todas as condições valem. A chamada deve estar dentro de um manipulador de ativação do usuário como um click; aguardar qualquer fetch ou analytics antes de share() descarta a ativação e a chamada é rejeitada com NotAllowedError. Exige um contexto seguro (https — http:// e a maioria das origens file:// não expõem a API). Dentro de um iframe precisa de allow="share". E os navegadores integrados — WeChat, TikTok, Instagram — frequentemente não implementam a folha ou removem a política de permissões, então o mesmo código que funciona no Safari falha ali.
O que quebra quando a folha some
- O botão não faz nada. No Android WebView
navigator.shareéundefined; o clique é uma não-operação. - Falha silenciosa. O iOS rejeita fora de um gesto ou contexto seguro com
NotAllowedError/AbortErrorque a página nem espera. - Copiar-link é o único recurso. Perder a folha do sistema significa perder cada rede social, mensageiro e AirDrop — uma experiência degradada que o usuário percebe.
- Navegadores integrados divergem. WeChat/TikTok/Instagram pulam a folha em silêncio enquanto o Safari funciona, então testar no Safari esconde a falha real.
- Compartilhar arquivos é ainda mais estreito.
canShare({ files })retorna falso em motores que não conseguem compartilhar arquivos, forçando outro ramo.
A solução do runtime
Um runtime próprio do host controla a intenção de compartilhamento. O host registra uma ponte de compartilhamento nativa e abre a folha real do sistema — UIActivityViewController no iOS, Intent.ACTION_SEND com Intent.createChooser() no Android — levando título, texto, URL e arquivos em todos os motores e navegadores integrados. A página chama uma ponte uniforme; o runtime decide como apresentá-la. Uma superfície de compartilhamento, em todo lugar.
| Dimensão | WebView | Runtime próprio do host |
|---|---|---|
navigator.share no Android | Inexistente | Folha nativa |
| Comporta de gesto/contexto seguro iOS | Fácil de errar | Tratado nativamente |
| Navegadores integrados (WeChat, etc.) | Folha removida | Folha nativa |
| Compartilhar arquivos | Estreito, com canShare | Folha nativa + arquivos |
| Recurso | Só copiar-link | Alvos reais |
| Consistência | Por motor | Uniforme |
Um app nativo abre a folha do sistema em cada telefone. Um WebView comum em quase nenhum. Um runtime dá à página uma folha — e todos os alvos atrás dela.
Fontes
- MDN — Web Share API — a tabela de compatibilidade que marca «WebView Android: Não» para
navigator.share. - web.dev — Web Share API — as regras de ativação do usuário, contexto seguro e
canShareque condicionam o compartilhamento. - OpenPWA — Referência da Web Share API — por que surgem
NotAllowedError/InvalidStateErrore como retroceder ao copiar-link. - Apple — Web Share no WKWebView — o suporte no iOS WebView e as restrições de gesto/contexto seguro.
- Plugin Tauri — por que o Android WebView não tem navigator.share — um mantenedor confirma que a API está ausente no Android System WebView mesmo sendo baseada em Chromium.