En la web abierta, una página llama a navigator.geolocation.getCurrentPosition() y obtiene coordenadas — para buscadores de tiendas, verificación antifraude y contenido localizado. Dentro de un WebView, la misma llamada falla en silencio. En Android la API de geolocalización está desactivada por defecto y solo funciona si el host conecta un callback, concede permiso en tiempo de ejecución y sirve la página por HTTPS. En iOS cada petición pasa por un método WKUIDelegate que la app debe implementar. Un runtime propiedad del host conecta la ubicación nativa — una llamada que resuelve al GPS del dispositivo en cada motor.
Android: la geolocalización está apagada hasta que el host la enciende
WebSettings.setGeolocationEnabled() de Android es false por defecto. Habilitarlo es solo el primero de cuatro requisitos: la app debe tener ACCESS_FINE_LOCATION / ACCESS_COARSE_LOCATION, debe implementar WebChromeClient.onGeolocationPermissionsShowPrompt() y llamar callback.invoke(origin, true, false), debe solicitar el permiso peligroso en tiempo de ejecución en Android 6.0+, y la página debe servirse por HTTPS (o localhost). Falte uno y getCurrentPosition() devuelve PERMISSION_DENIED — o, peor, falla sin ninguna callback. Las ROM de fabricante (EMUI, MIUI) añaden restricciones de ubicación en segundo plano que pueden dejar al WebView sin obtener un manejador del servicio aunque se haya concedido el permiso.
iOS: cada petición pasa por la app
En WKWebView, la geolocalización se delega totalmente a la app vía WKUIDelegate.webView(_:requestGeolocationPermissionFor:initiatedByFrame:decisionHandler:). Si la app nunca implementa ese método, la petición simplemente muere — sin aviso, sin arreglo. Apple también exige NSLocationWhenInUseUsageDescription (y la variante Always si hace falta) en Info.plist, y la app debe solicitar autorización nativa mediante CLLocationManager antes de que el contenido web lo pida. Una página que llama a geolocalización al cargar, o sin un gesto directo del usuario, se bloquea o vuelve a preguntar. Sin un flujo disparado por botón, los usuarios ven avisos duplicados confusos o un fallo silencioso.
Qué se rompe cuando se pierde la posición
- Fallan las verificaciones KYC de ubicación. La incorporación de brokers y exchanges que prueba "el usuario está en una jurisdicción permitida" no puede leer coordenadas, y la onboarding conforme se estanca.
- Buscadores de sucursales, cajeros y agentes se apagan. "Encuentra la oficina más cercana" no devuelve nada porque la página nunca obtiene una posición.
- Se rompen las geovallas de cumplimiento. Los productos por región y las reglas de consentimiento de marketing que dependen de la ubicación fallan en silencio.
- Se debilitan las señales antifraude. La ubicación es una señal de riesgo clave; perderla empuja a más usuarios legítimos a rechazos falsos.
La solución del runtime
Un runtime propiedad del host conecta la capa de ubicación. La página llama a una API uniforme — runtime.getLocation(options) — y el host la resuelve mediante el proveedor nativo de la plataforma: FusedLocationProvider / LocationManager en Android, CLLocationManager en iOS. Permiso, precisión y tiempo de espera se gestionan de forma nativa y se devuelven como una coordenada en la que la página puede confiar. Una integración, cada motor, una posición real al final.
| Dimensión | WebView | Runtime propiedad del host |
|---|---|---|
| Valor por defecto Android | API de geolocalización apagada (setGeolocationEnabled=false) | Proveedor nativo, siempre activo |
| Flujo de permisos | Callback del host + concesión en runtime + HTTPS | Un runtime.getLocation() |
| Ruta en iOS | Método WKUIDelegate, o muere | CLLocationManager nativo |
| Modo de fallo | PERMISSION_DENIED silencioso / sin callback | Error explícito y observable |
| KYC / geovalla | Se rompe | Funciona |
| Consistencia | Por motor | Uniforme |
Una app nativa lee el GPS del dispositivo en cada dispositivo. Un WebView estándar apenas en ninguno. Un runtime da a la página una llamada de ubicación — y una coordenada con la que actuar.
Fuentes
- Android WebSettings — setGeolocationEnabled — la geolocalización está desactivada por defecto en WebView; habilitarla requiere permiso de app, callback de WebChromeClient y HTTPS.
- Android WebChromeClient — onGeolocationPermissionsShowPrompt — el host debe implementar este callback e invocarlo para conceder o denegar.
- Apple Developer — WKUIDelegate requestGeolocationPermissionFor — WKWebView delega la geolocalización a la app; sin este método la petición falla.
- Apple Developer — CLLocationManager — autorización de ubicación nativa de iOS que la app debe solicitar antes de que el contenido web pregunte.
- WebApp2App — Geolocalización disparada por botón en WebView iOS — WKWebView requiere un gesto del usuario y una sola capa de permisos nativa; las llamadas al cargar se bloquean o repiten avisos.