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/AbortError que 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ãoWebViewRuntime próprio do host
navigator.share no AndroidInexistenteFolha nativa
Comporta de gesto/contexto seguro iOSFácil de errarTratado nativamente
Navegadores integrados (WeChat, etc.)Folha removidaFolha nativa
Compartilhar arquivosEstreito, com canShareFolha nativa + arquivos
RecursoSó copiar-linkAlvos reais
ConsistênciaPor motorUniforme

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