WebView 不是浏览器——界面、权限、数据模型全不同
界面层
浏览器(Chrome、Firefox)是完整产品:地址栏、标签页、书签、历史记录、下载管理器、扩展市场、设置页……WebView 是可嵌入组件:没有地址栏、没有设置页、甚至没有返回按钮——界面全由宿主 App 控制。
这也是为什么:你在一个 App 里点网页内的"返回",不一定是返回上一个网页,有可能是退出了整个 App 的内嵌页——这完全取决于 App 开发者有没有在 Activity 的 onBackPressed 里先让 WebView 走 goBack()。
权限模型差异
| 场景 | 浏览器怎么处理 | WebView 怎么处理 |
|---|---|---|
| 定位请求 | 浏览器自己弹授权框,用户在浏览器层面决定 | 宿主 App 必须实现 WebChromeClient.onPermissionRequest,自己弹框、自己做持久化 |
| 相机 / 麦克风 | 同上 | 同上,App 全权负责 |
| 文件上传 | <input type=file> 由浏览器弹出文件选择器 | App 实现 WebChromeClient.onShowFileChooser |
| 混合内容(HTTPS 加载 HTTP 资源) | Chrome 有独立设置项 | WebSettings.setMixedContentMode 控制 |
数据模型
浏览器维护一个用户级的数据仓库:CookieJar、LocalStorage、IndexedDB、Service Worker 注册……所有访问过的网站共用一套。
WebView的数据是进程隔离的——每个 WebView 实例(严格说是每个渲染进程)独立管理自己的数据目录。更进一步:
- 同一个 App 里的两个 WebView 可以用相同的 Cookie 吗?默认可以,因为在同一进程
- 跨 App 呢?绝对不行,数据完全不共享
- 跨 WebView 类型呢?Chrome 和 Android System WebView 的数据目录完全独立
默认安全策略不同
WebView 默认是保守的:
- JavaScript 默认 关闭(Chrome 默认开启)
- File 协议访问默认关闭
- 第三方 Cookie 在较老版本上可能不生效
- 混合内容策略可能比 Chrome 更严格
App 开发者需要主动 setJavaScriptEnabled(true),否则很多现代网页直接白屏。
更新节奏
| 维度 | 浏览器 | WebView |
|---|---|---|
| 谁更新 | 用户手动 / 浏览器自动更新 | Google Play 商店静默推送,用户看不到 |
| 能不能不更 | 可以,用户有选择权 | 不行——Google 会强制推送安全补丁 |
| 更新频率 | 功能更新 2~3 月一次,安全月更 | 安全月更,功能随 Chromium 大版本 |
所以当你发现"Chrome 里某功能正常,但 App 里的内嵌网页不正常",第一反应应该是——WebView 版本落后了,而不是 App 代码有问题。
→ 返回 核心原理首页