webview 中文文档 下载 App

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 实例(严格说是每个渲染进程)独立管理自己的数据目录。更进一步:

默认安全策略不同

WebView 默认是保守的:

App 开发者需要主动 setJavaScriptEnabled(true),否则很多现代网页直接白屏。

更新节奏

维度浏览器WebView
谁更新用户手动 / 浏览器自动更新Google Play 商店静默推送,用户看不到
能不能不更可以,用户有选择权不行——Google 会强制推送安全补丁
更新频率功能更新 2~3 月一次,安全月更安全月更,功能随 Chromium 大版本

所以当你发现"Chrome 里某功能正常,但 App 里的内嵌网页不正常",第一反应应该是——WebView 版本落后了,而不是 App 代码有问题。

→ 返回 核心原理首页