使用暂存自定义标签页为用户改善网络隐私保护

Android 开发者有时需要短暂的 Web 体验来满足其应用要求。临时自定义标签页是一种专用自定义标签页,可从应用内启动完全隔离的网络浏览器。这适用于不应将登录状态与浏览器同步或不应保留数据的网络会话(例如无痕式浏览模式)的身份验证策略。

默认情况下,自定义标签页会共享用户浏览器中的状态和功能。在暂时性自定义标签页中,Cookie、缓存的文件、历史记录、凭据和其他数据仅存在于会话实例的范围内。关闭自定义标签页 activity 后,系统会删除数据,且不会留下任何痕迹。

与自定义标签页一样,您可以使用操作和界面主题自定义暂时性自定义标签页。如果您已经在使用 Auth Tab 进行身份验证策略,则可以将暂时性浏览添加到启动 intent,为该流程增添一层隐私保护。

自 Chrome 130 起,即可使用短时性自定义标签页,只需一行代码即可实例化。对于无法使用该功能的用户,您可以验证是否启用了临时性浏览,并无缝集成后备替代方案。

启动短时会话

临时自定义标签页需要 AndroidX 浏览器库。AndroidX Browser 库可添加到项目的 build.gradle 文件的依赖项部分。这些 API 在 Alpha 版 build 中提供。将以下内容添加到 build 文件中:

dependencies {
    implementation 'androidx.browser:browser:1.9.0-alpha01'
}

如需创建短暂的浏览会话,请使用 CustomTabsIntent 中提供的自定义 setter:

// In your activity

String url = "https://developers.android.com";
CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder()
    .setEphemeralBrowsingEnabled(true)
    .build();

customTabsIntent.launchUrl(MainActivity.this, Uri.parse(url));

由于在标准 Chrome 自定义标签页实现中,临时浏览是由 intent extra 触发的,因此您可以像在典型自定义标签页中一样添加自定义内容。

// Add customizations

String url = "https://developers.android.com";
CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder()
    .setEphemeralBrowsingEnabled(true)
    .setUrlBarHidingEnabled(false)
    .setShareState(CustomTabsIntent.SHARE_STATE_OFF)
    .setCloseButton(BitmapFactory.decodeResource(getResources(), R.drawable.ic_back_arrow))
    .build();

customTabsIntent.launchUrl(MainActivity.this, Uri.parse(url));

对于使用 Auth Tab 的开发者,请将暂时性浏览设置器添加到 AuthTabIntent

// Add ephemeral browsing to Auth Tab

AuthTabIntent authTabIntent = new AuthTabIntent.Builder()
    .setEphemeralBrowsingEnabled(true)
    .build();
authTabIntent.launch(launcher, uri, redirectScheme);

部分自定义设置会在“临时”标签页中被修改或不可用:

  • 系统不会在暂存会话中记录历史记录。
  • 用户无法下载当前页面。
  • 长按链接以在新标签页中打开的功能已停用。
  • 使用菜单打开默认浏览器中的当前网页的选项会启动无痕模式浏览器窗口。

回退到之前的实现

并非所有用户设备都能够启动临时自定义标签页。如需处理这些情况,开发者可以使用 CustomTabsClient 查询底层浏览器,以确定是否支持暂时性浏览。这需要与 CustomTabsClient 建立服务连接。为此,请启动一个新的 CustomTabsServiceConnection 来访问成功绑定后提供的 CustomTabsClient

// in your activity

CustomTabsServiceConnection connection = new CustomTabsServiceConnection() {
    @Override
    public void onCustomTabsServiceConnected(@NonNull ComponentName name, @NonNull CustomTabsClient client) {

        CustomTabsSession session = client.newSession(null);
        try {
            if (session.isEphemeralBrowsingSupported(Bundle.EMPTY)) {
                // launch ephemeral tab
            } else {
                // fallback
            }
        } catch (RemoteException e) {
            // fallback
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName componentName) { }
};

CustomTabsClient.bindCustomTabsService(this, "com.android.chrome", connection);

如果应用面向的用户尚无权访问暂时性自定义标签页,则可以使用其他方法,例如停用缓存的 WebView。如需查看利用暂时性自定义标签页并回退到 WebView 的实现示例,请参阅 Android 浏览器辅助程序库。

其他资源