如何使用不同的组件在 Android 应用中呈现 Web 内容。
Android 平台已经存在十多年了,从一开始就对 Web 提供了强大的支持。它随附 WebView,这是一个组件,可让开发者在自己的 Android 应用中使用 Web 内容。不仅如此,Android 还允许开发者将自己的浏览器引擎引入该平台,从而促进竞争和创新。
开发者可以通过多种方式在 Android 应用中添加 Web 内容。WebView 通常用于呈现广告、作为与 Android 界面元素搭配使用的布局组件,或用于打包 HTML 5 游戏。借助自定义标签页,开发者可以构建应用内浏览器,并为第三方 Web 内容提供流畅的导航体验;借助可信 Web 活动,开发者可以在 Android 应用中使用其可下载的渐进式 Web 应用 (PWA)。
Android 版 WebView
借助 WebView,开发者可以在 Android 应用中使用新型 HTML、CSS 和 JavaScript,并允许将内容打包在 APK 中或托管在互联网上。WebView 是 Android 最灵活、最强大的组件之一,可用于将 Web 内容包含在 Android 应用中的大多数用例,从为 AdMob 等广告服务提供支持,到构建和发布使用 WebGL 等现代 API 的完整 HTML5 游戏。
不过,如果用于创建应用内浏览器或在 Android 应用中添加 PWA,WebView 就缺少 Web 平台的安全性、功能和特性。
应用内浏览器方面的挑战
随着时间的推移,越来越多的开发者在构建浏览器体验时会将第三方内容纳入其 Android 应用中,目的是为用户在浏览第三方网站时打造更顺畅的体验。这些体验后来被称为“应用内浏览器”。
WebView 对现代 Web 技术栈提供广泛支持,并支持许多现代 Web API,例如 WebGL。但 WebView 主要是一种 Web 界面工具包。它不支持 Web 平台的所有功能,也无法支持。如果某个 API 已经有操作系统级替代方案(例如 Web Bluetooth),或者需要实现浏览器界面(例如推送通知),则可能不受支持。随着网站平台不断发展并添加更多仅适用于 Android 应用的功能,这种差距将会进一步扩大。由于应用开发者无法控制打开第三方内容时使用哪些功能,因此 WebView 不适合用作应用内浏览器或用于打开渐进式 Web 应用。即使 WebView 实现了对所有 Web 平台功能的支持,开发者仍需要为权限或推送通知等功能编写代码并实现自己的界面,这使得很难为用户实现一致性。
将 WebView 用作应用内浏览器的安全注意事项
WebView 可让嵌入应用完全访问呈现的内容,包括 Cookie 和 DOM。这些功能功能强大,需要用户高度信任。
由于 WebView 不适合作为构建浏览器的框架,因此缺少现代浏览器提供的安全功能。
多进程架构和网站隔离
浏览器在渲染和执行不可信内容时,会采取安全措施。为了确保用户在浏览可能不可信甚至恶意的内容时保持安全,现代浏览器会采用多进程架构和网站隔离等技术。
如果没有多进程架构,网页导致的崩溃可能会导致整个浏览器应用崩溃,或者攻击者可能会利用漏洞控制整个设备。网站隔离功能可额外增强安全性,使不可信网站更难以访问和窃取其他网站的信息。
在 Android 8.0 Oreo 之前,WebView 呈现程序使用与嵌入应用相同的进程。在较新版本的操作系统上,如果设备足够强大,渲染程序会在其他进程中运行。不过,所有页面及其所运行的 WebView 实例之间仍共享一个进程,因此无法完全实现网站隔离。
对于呈现其自有且可信内容的应用,缺少多进程架构和网站隔离并不是问题,但对于运行不可信第三方内容的应用(例如应用内浏览器),则可能会成为问题,并会使用户面临 Meltdown 和 Spectre 等漏洞的威胁,这些漏洞可能会被用于窃取 Cookie、银行详细信息、个人信息等。
安全界面指示器
向用户提供良好的安全指标也很重要,浏览器在这方面投入了大量精力,并且一直在不断发展。不过,WebView 缺少用于检查网站连接是否安全的 API,这使得应用开发者无法构建可信的安全指示器。例如,缺少此类 API 可能会导致地址栏中显示的网址与向用户显示的网页不一致,即使通过安全的 HTTPS 连接也是如此。
开发者可以选择的另一种方法是在其应用中嵌入浏览器引擎。除了导致应用大小增加之外,这种方法还很复杂且耗时。
将自定义标签页用作应用内浏览器的解决方案
自定义标签页在 Chrome 45 中引入,可让开发者在应用中使用用户默认浏览器中的标签页。自定义标签页最初由 Chrome 推出,因此也称为“Chrome 自定义标签页”。目前,它是一个 Android API,大多数热门浏览器都支持自定义标签页,包括 Chrome、Firefox、Edge 和 Samsung Internet,因此更适合直接称其为“自定义标签页”。
自定义标签页可帮助开发者将 Web 内容无缝集成到其应用体验中。它们还允许开发者自定义显示网页内容的 activity,例如自定义工具栏颜色、操作按钮、转换动画等。
它们还提供之前使用 WebView 或嵌入浏览器引擎时无法提供的功能。由于应用内浏览器由用户的浏览器提供支持,因此自定义标签页会与浏览器共享存储空间,因此用户每次启动已安装的应用之一的应用内浏览会话时,都无需重新登录其喜爱的网站。
与 WebView 不同,自定义标签页支持其所依托的浏览器支持的所有 Web 平台功能和 API。
使用 Trusted Web Activity 打开渐进式 Web 应用
渐进式 Web 应用将许多行为和功能(以前仅适用于平台专用应用)引入到 Web 中。随着类似应用的行为的引入,开发者希望在 Android 上重复使用这些体验的愿望也越来越强烈,并开始寻求将 PWA 集成到其应用中的方法。
自定义标签页支持所有现代 Web 功能和 API,但由于其主要用于打开第三方内容,因此顶部有一个工具栏,用于告知用户他们正在访问哪个网址,以及显示网站是否安全的锁形图标。打开应用自己的体验时,工具栏可防止应用给人感觉是与操作系统集成的。
Trusted Web Activity 在 Chrome 72 中推出,可让开发者在 Android 应用中使用其 PWA。其协议与 Custom Tabs 协议类似,但引入了一些 API,可让开发者通过 Digital Asset Links 验证他们是否同时控制 Android 应用和要打开的网址,并在两者均为 true 时移除网址栏。
他们还引入了一些 API,用于在打开 PWA 时创建启动画面或将 Web 通知委托给 Android 代码处理。我们很快就会推出更多功能,例如对 Play 结算服务的支持。
由于在 Trusted Web Activity 中打开的网址应为 PWA,并且具有一组行为和性能特征,因此 Trusted Web Activity 为在其中打开的 PWA 引入了质量标准。
当前解决方案的局限性
开发者反馈显示,他们需要自定义标签页的平台兼容性与 WebView 的灵活性相结合,以便他们能够访问 DOM 或将 JavaScript 注入应用内浏览器。
Custom Tabs 实际上是由用户的浏览器呈现的标签页,可以具有自定义界面,也可以完全没有界面。这意味着,浏览器需要遵守用户对浏览器的隐私和安全预期,因此无法提供某些功能。
Google 的 Web on Android 团队正在研究替代方案,并尝试各种解决方案来解决这些用例。敬请关注详情!
摘要
当应用需要在 Android 应用中使用 HTML、CSS 和 JavaScript,但不使用现代 Web 上提供的更高级功能和特性(例如推送通知、Web Bluetooth 等)时,WebView 非常有用。不建议在打开专为现代 Web 平台设计的内容时使用此功能,因为内容可能不会以开发者预期的方式显示。不建议使用 WebView 创建应用内浏览器。另一方面,WebView 在展示第一方 Web 内容方面可发挥出色作用。
当开发者希望在 Android 应用中全屏呈现自己的渐进式 Web 应用时,应使用 Trusted Web Activity。它可以用作应用中的唯一 activity,也可以与其他 Android activity 搭配使用。
自定义标签页是打开专为 Web 平台(也称为应用内浏览器)设计的第三方内容的推荐方式。