在开放网络上,页面调用 navigator.geolocation.getCurrentPosition() 就能拿到坐标——门店查找、反欺诈校验、本地化内容都靠它。在 WebView 里,同样的调用会静默失败。Android 默认关闭地理定位 API,且只有在宿主接好回调、授予运行时权限、并用 HTTPS 提供页面时才能工作;iOS 则把每次请求都交给应用必须实现的 WKUIDelegate 方法。宿主自有 runtime 桥接原生定位——一次调用,在每个引擎上都解析到设备 GPS。
Android:定位默认关闭,需宿主逐项开启
Android 的 WebSettings.setGeolocationEnabled() 默认值就是 false。开启它只是四个前置条件中的第一步:应用必须持有 ACCESS_FINE_LOCATION / ACCESS_COARSE_LOCATION 权限,必须实现 WebChromeClient.onGeolocationPermissionsShowPrompt() 并调用 callback.invoke(origin, true, false),必须在 Android 6.0+ 上运行时申请危险权限,且页面必须走 HTTPS(或 localhost)。漏掉任何一项,getCurrentPosition() 就会返回 PERMISSION_DENIED——更糟的是,有时连回调都没有,直接失败。华为 EMUI、小米 MIUI 等厂商 ROM 还有后台定位限制,即使权限已授予,WebView 也可能拿不到服务句柄。
iOS:每次请求都经由应用转发
在 WKWebView 中,地理定位完全委托给应用,通过 WKUIDelegate.webView(_:requestGeolocationPermissionFor:initiatedByFrame:decisionHandler:) 方法处理。如果应用从不实现该方法,请求直接"死掉"——没有弹窗,也无法修复。Apple 还要求 Info.plist 中配置 NSLocationWhenInUseUsageDescription(需要后台时还要 Always 版本),并且应用应在网页内容发起请求前,通过 CLLocationManager 主动申请原生授权。在页面加载时、或没有用户直接手势的情况下调用定位,会被拦截或反复弹窗。没有"按钮触发"的流程,用户会看到令人困惑的重复弹窗,或静默失败。
定位丢失会带来什么
- KYC 位置核验失败。 券商、交易所开户需要证明"用户在允许的法域",读不到坐标,合规开户就被卡住。
- 网点、ATM、代理点查找全黑。 "找最近的营业厅"什么都返回不了,因为页面始终拿不到定位。
- 地理围栏合规失效。 依赖位置的地域限售产品、营销同意规则会静默误判。
- 反欺诈信号变弱。 位置是重要风险信号;失去它,更多真实用户会被误判拒付。
runtime 解法
宿主自有 runtime 桥接定位层。页面调用统一的 runtime.getLocation(options),由宿主通过平台原生提供方解析:Android 用 FusedLocationProvider / LocationManager,iOS 用 CLLocationManager。权限、精度、超时都由原生处理,并返回一个页面可信赖的坐标。一次集成,每个引擎通用,最终拿到的是真实坐标。
| 维度 | WebView | 宿主自有 runtime |
|---|---|---|
| Android 默认 | 地理定位 API 关闭(setGeolocationEnabled=false) | 原生提供方,始终可用 |
| 权限流程 | 宿主回调 + 运行时授权 + HTTPS | 一次 runtime.getLocation() |
| iOS 路径 | WKUIDelegate 方法,否则失效 | 原生 CLLocationManager |
| 失败表现 | 静默 PERMISSION_DENIED / 无回调 | 明确、可观测的错误 |
| KYC / 围栏 | 失效 | 可用 |
| 一致性 | 因引擎而异 | 统一 |
原生应用能在每台设备上读取设备 GPS;裸 WebView 几乎在每台设备上都不行。runtime 给页面一次定位调用——以及一个可以据此行动的坐标。
参考来源
- Android WebSettings — setGeolocationEnabled — WebView 中地理定位默认关闭;启用需应用权限、WebChromeClient 回调与 HTTPS。
- Android WebChromeClient — onGeolocationPermissionsShowPrompt — 宿主必须实现该回调并调用以授权或拒绝。
- Apple Developer — WKUIDelegate requestGeolocationPermissionFor — WKWebView 将地理定位委托给应用;缺该方法请求即失败。
- Apple Developer — CLLocationManager — 应用必须在网页发起请求前申请的 iOS 原生定位授权。
- WebApp2App — iOS WebView 按钮触发式地理定位 — WKWebView 需要用户手势与单一原生权限层;加载时调用会被拦截或重复弹窗。