是否可以检测到 Android 强制门户浏览器?

Is it possible to detect the Android captive portal browser?

我有一个强制门户,从 Android 5.0+ Lollipop 开始,它在 Android 的强制门户浏览器而不是设备的默认浏览器中启动。

我需要以某种方式检测它们是否在强制门户浏览器中(与常规网络浏览器相对),如果是,则显示不同的内容。

是否有可能通过检查用户代理或通过 Javascript 来检测它们是否在强制门户浏览器 window 中?我查看了我的 Android 5.1 设备上的用户代理,但我看不出有任何区别:

强制门户浏览器:

Mozilla/5.0 (Linux; Android 5.1; Elite 5 Build/LMY47D) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Mobile Safari/537.36

常规 GOOGLE CHROME:

Mozilla/5.0 (Linux; Android 5.1; Elite 5 Build/LMY47D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.94 Mobile Safari/537.36

版本号略有不同,但这在 Android/Chrome 版本之间似乎不一致,不是确定浏览器类型的可靠方法。

还有其他检测方法吗?提前致谢。

您可以使用 Modernizr 检测是否存在 Fetch API 或本地存储功能,这两种功能都存在于常规 Google Chrome 和 Firefox 等中但在强制门户浏览器中不可用。

我正在测试的 Pixel 设备现在通过了这两项测试 -

try {

    const test = 'test';
    
    localStorage.setItem(test, test);
    localStorage.removeItem(test);
    sessionStorage.setItem(test, test);
    sessionStorage.removeItem(test);
    alert("We're in a chrome instance!")
} catch(e) {
    alert("We're inside a Captive Portal!")
}

运行 Android 10 - Pixel XL 和常规 Pixel

对于许多其他设备 - 上面的 localStorage 测试工作正常 - 我们进入一个 catch 块并确定我们不在一个完整的 Chrome tab/Android 默认浏览器选项卡中,但是Android 似乎已经改变了它运行强制门户的方式。

我刚刚在 Android 中发现了一种简单的查找强制门户的技术,https://developer.chrome.com/docs/multidevice/user-agent。按照此说明操作,android 中的所有强制门户都是 webview,并且它们在 useragent 上具有“版本”。