在开放网络上,页面调用 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 给页面一次定位调用——以及一个可以据此行动的坐标。

参考来源