另一种 App 网页加载方式
很多 App 都会有加载网页的场景
一般有如下几种方式:
- 跳转
外部浏览器
打开(简单粗暴,一行代码,但是业务形态割裂,我们自己的 App 会进入后台) - 内嵌
WebView/WKWebView
实现(页面交互逻辑可控,细节可定制,为主流方式,但缺点是性能以及兼容问题,同时也无法与外部浏览器共享 cookies 等数据) - Android
Custom Tabs
/iOSSFSafariViewController
🎉
Android Custom Tabs
基于 Intent 调用,依赖手机里 Chrome 浏览器(或基于 Chromium 内核的浏览器)实现,不同版本可能会有差异。
早在 2015 年 Google 就发布了对应的 support
依赖库,后在 2018 年迁移到了 AndroidX,更名为 browser
。目前国外的主流 App 都实现了该功能,例如 X、Telegram 等,而国内却寥寥无几。
iOS 平台也提供了类似的解决方案:SFSafariViewController
WKWebView 是 WebKit 框架的一部分,SFSafariViewController
是 SafariServices 框架的一部分,可让用户直接在应用内浏览网页,享受与在 Safari 中相同的网页浏览体验 - 包括密码自动填充、阅读器和安全浏览等功能,而无需离开我们的应用。
开始使用
- 添加依赖
dependencies {
implementation 'androidx.browser:browser:1.8.0'
}
- 判断手机系统是否支持
手机需要安装 Chrome 45 或以上版本,并且设为默认浏览器,实测 Edge 浏览器也支持
如果条件都不满足,则跳转其他外部浏览器打开
String packageName = CustomTabsClient.getPackageName(context, Collections.emptyList());
if (packageName == null) {
// not supported
}
Intent activityIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com"));
PackageManager packageManager = context.getPackageManager();
List<ResolveInfo> viewIntentHandlers = packageManager.queryIntentActivities(activityIntent, 0);
String packageName = CustomTabsClient.getPackageName(context, viewIntentHandlers, true);
if (packageName == null) {
// not supported
}
- AndroidManifest.xml 处理包可见性(Android 11 及以上)
<queries>
<intent>
<action android:name=
"android.support.customtabs.action.CustomTabsService" />
</intent>
</queries>
- 发起调用
String url = "https://developers.android.com";
CustomTabsIntent intent = new CustomTabsIntent.Builder().build();
intent.launchUrl(MainActivity.this, Uri.parse(url));
详细特性
- 支持定制部分 UI
- 支持预热和预加载
- 支持最小化(画中画)
- 支持 ToolBar 自定义按钮
- 支持指定高度打开
- 支持设置进入和退出动画
- 支持传递 HTTP headers 等
优点
- Custom Tabs 提供了一致的浏览体验,与 Chrome 浏览器的外观和功能保持一致,用户在使用时感到熟悉和舒适。
- 由于使用 Chrome 浏览器,Custom Tabs 在性能上通常优于 WebView,能够更快地加载网页。
- Custom Tabs 在安全性上更强,利用 Chrome 的安全功能,例如对恶意软件的防护和强大的隐私设置。
- 可以利用浏览器的所有功能,包括自动填充、书签和跨设备的同步,使得用户能够享受到更全面的浏览体验。
- 与 WebView 相比,Custom Tabs 不需要开发者维护网页内容的呈现,减少了开发和维护的工作量。
- 开发者可以对 Custom Tabs 进行一些定制,比如修改颜色和添加自定义菜单,增强品牌识别度。
缺点
- 开发者对 Custom Tabs 的控制相对有限,无法像使用 WebView 那样对网页的行为和外观进行全面控制。
- Custom Tabs 依赖于用户的 Chrome 浏览器或其他支持 Custom Tabs 的浏览器。如果用户没有安装支持的浏览器,可能会导致体验不佳。
- 某些特定的 WebView 功能可能无法在 Custom Tabs 中使用,例如与 JavaScript 的深度交互。
最佳实践场景
- 展示类:隐私协议、用户协议等
- 互动类:论坛、帮助手册、视频教程等
参考资料
- https://developer.chrome.com/docs/android/custom-tabs
- https://www.chromium.org/Home/
- https://developer.apple.com/news/?id=trjs0tcd