- Carregar a mesma página que você usaria num navegador, com o Web SDK montado pelo CDN ou com o iframe próprio. Nada nessa página muda por rodar numa WebView.
- Carregar o embed direto e receber os eventos em código nativo, pela ponte descrita abaixo. Sem iframe, sem Web SDK, sem JavaScript seu.
A ponte nativa
O app injetawindow.LegitimuzNative na página antes de o embed rodar. A presença do objeto é o
próprio sinal de confiança: diferente do iframe, não há handshake de origem nem buffer. Detectado o
objeto, o embed para de usar postMessage de iframe e passa a falar com o seu host.
O contrato que o seu app precisa expor:
O que chega no seu postMessage
Cada mensagem é uma string JSON com o mesmo envelope:
Descarte qualquer mensagem cujo
source não seja legitimuz ou cuja version não seja 1.
Na ponte nativa o payload de cancelamento traz
session_id, em snake_case. O Web SDK entrega
sessionId para código web; nativo recebe o nome do protocolo, sem tradução.O que você manda de volta
Um comando, hoje:handle.destroy() do Web SDK.
Montar a WKWebView
O essencial da configuração, em Swift:embedURL é a sdkUrl que o seu backend recebeu de entry.url — veja
criar verificações.
Ao desmontar, execute o destroy e remova o handler, nesta ordem:
Por que a permissão não vem sozinha
Um navegador pede câmera, microfone e localização ao usuário quando a página chamagetUserMedia ou
navigator.geolocation. Uma WebView embutida no seu app não pede: por padrão, ela nega em silêncio,
mesmo a página declarando a permissão corretamente — o que o Web SDK já faz no iframe que ele cria
(allow="camera; microphone; geolocation; fullscreen; accelerometer; gyroscope", ver
segurança). Sem o passo nativo abaixo, a captura e a
coleta de localização falham sem nenhum erro que a sua página consiga tratar.
iOS — WKWebView
Declare os três textos de uso noInfo.plist e implemente o delegado que autoriza câmera e
microfone:
Info.plist
requestMediaCapturePermissionFor existe a partir do iOS 15 e cobre câmera e microfone. Sem o
delegado, a WKWebView recusa a concessão por padrão, mesmo com as chaves do Info.plist
presentes. getUserMedia em si só funciona em WKWebView de app de terceiro a partir do iOS 14.3;
abaixo disso a API não existe na página.
Android — WebView
Declare as permissões noAndroidManifest.xml, peça a permissão em tempo de execução ao usuário
(Android 6.0+ exige isso independentemente da WebView) e conceda no WebChromeClient. Câmera e
microfone passam por onPermissionRequest; geolocalização é um método separado,
onGeolocationPermissionsShowPrompt, e precisa da própria configuração ligada no WebSettings:
AndroidManifest.xml
setGeolocationEnabled(true),
onGeolocationPermissionsShowPrompt nunca dispara.
Framework híbrido (React Native, Flutter e afins)
O mecanismo por baixo é o mesmo dos dois itens acima — o wrapper só decide como ele expõe isso. Confira na documentação da versão do wrapper que você usa como conceder a permissão de mídia da WebView nos dois sistemas; nem toda versão cobre iOS e Android da mesma forma. No iOS,getUserMedia não funciona quando a página é servida por um esquema de URL customizado em
vez de https:// ou http://localhost — é limitação da própria WKWebView, não do wrapper.
Confirme qual esquema a versão do seu wrapper usa antes de depurar a permissão.
O que acontece se eu não implementar o passo nativo
O que acontece se eu não implementar o passo nativo
A falha muda por plataforma e por capacidade, e vale saber qual é qual antes de abrir um chamado:
- Android, câmera sem
onPermissionRequest: erro imediato (NotAllowedError) — o default doWebChromeClienté negar. - Android, geolocalização sem
onGeolocationPermissionsShowPrompt: nenhum erro. O callback nunca é chamado, e a chamada trava até otimeoutque a página passar — ou para sempre, se ela não passar nenhum. - iOS, câmera sem o delegado: a
WKWebViewmostra o prompt do próprio sistema e funciona sem código nenhum, contanto que a chave doInfo.plistesteja presente. - iOS, geolocalização sem a chave do
Info.plist: o mesmo travamento silencioso do Android, por um motivo diferente (veja o aviso acima).
Iframe próprio
Se a página que a WebView abre não carrega o Web SDK, veja o que muda no tratamento de eventos.