是否有可能检测到Android的强制门户浏览器?

6

我有一个被囚禁的门户网站,自从Android 5.0+ Lollipop版本以来,它会在Android的囚禁门户浏览器中启动,而不是设备的默认浏览器。

我需要通过某种方式检测是否在囚禁门户浏览器中(而不是普通的网页浏览器),如果是,则显示不同的内容。

通过检查用户代理或通过Javascript,是否可能检测它们是否在囚禁门户浏览器窗口内?我已经查看了我的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版本中似乎不一致,并且不能可靠地确定浏览器类型。

还有其他方法可以检测它吗?提前感谢。

3个回答

3
你可以使用 Modernizr 来检测 Fetch API 或本地存储功能是否存在,这两个功能在常规的 Google Chrome 和 Firefox 等浏览器中都存在,但在受限制的门户网页浏览器中不可用。

1
我正在检测Fetch和localstorage,它可以工作,但是不再适用于像三星S7这样的新手机。 - devwannabe
@devwannabe:localstorage似乎仍然是一个有效的测试(在被控制的浏览器中不存在,在Chrome、Firefox和Opera中存在)。我同意'fetch'现在出现在被控制的门户网站浏览器中。另一个选择是csspseudotransitions,但我不会使用它作为渲染特性。 - Davide Alberani
我正在使用以下代码:var isCNA = !(Modernizr.pagevisibility && Modernizr.sessionstorage && Modernizr.localstorage && Modernizr.hashchange)。直到现在都没有问题。它适用于Android 5+和iOS。 - Diego Andrade
似乎不再起作用了... 至少在Android 7.1上是这样。 - xOneca
请注意,iOS中的私密浏览也禁用了localStorage(曾经)。 https://gist.github.com/paulirish/5558557 - arminrosu

1
我现在正在测试的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选项卡/Android默认浏览器选项卡中,但是Android似乎已经改变了它运行捕获门户的方式。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接