我正在运行一个专属门户,目标受众仅为移动设备。我想在用户在CNA中进行身份验证后,为他打开一个"欢迎页面"。这个页面应该在(移动)Safari中打开,而不是在CNA中打开。因为它包含在有限的CNA环境中不起作用的交互式元素。
我以前在其他门户网站上看到过这种情况,但我不知道他们是如何做到的,即使经过长时间的研究,我也不知道如何做到。
我拥有的是:
- 专属门户/专属网络正在工作
- 连接的用户获得弹出窗口中显示的启动页面(CNA)
- 由于我不需要身份验证,因此此时它们已连接,右上角的按钮显示"确定">
我想要的是:
- 此启动页面上打开Safari窗口的链接或按钮
或
- 一些JavaScript、重定向,以及在CNA关闭时打开Safari窗口的其他内容
到目前为止,我发现任何东西都不起作用(例如,使用target="_system")。有人知道这些酒店和其他门户网站是如何做到的吗?
您不能使操作系统(OS X或iOS)打开Safari。当iOSX检测到围墙花园(圈养门户)时,它会启动CNA。就是。
CNA≠Safari。让我们试试<a href="..." target="_blank">test</a>
任何打开另一个CNA窗口的尝试都会失败。
让我们试试<a href="..." target="_system">test</a>
任何打开Safari的尝试都会失败(系统仅适用于iOS应用程序中的Safari、邮件和Safari网络视图)
对我来说:答案=不可能。
但我想知道:有没有人已经看到了这种现象。您是否曾看到在显示CNA窗口后自动启动的safari页面?
秘密是向iOS客户端发送一个HTML响应,其中包含一个仅包含单词"的<body>
元素;成功";。iOS CNA(Captive Network Assistant)希望http://www.apple.com/library/test/success.html将被退回。
例如:
<html>
<head>
<title>Success</title>
</head>
<body>
Success
</body>
</html>
您可以使用JavaScript:重定向iOS CNA窗口
<script type="text/javascript">
window.location.href = "yourdomain.com/welcome.html";
</script>
此外,您可以隐藏";成功;通过在<body>
标签上将正文文本更改为具有style
属性的白色。iOS CNA应用程序似乎并没有在寻找一个完全符合苹果success.html
的页面;似乎只是在寻找包含单词"的CCD_ 7元素;成功";。
我的用例
我使用的专属门户要求用户同意服务条款。移动设备将使用其CNA检测捕获门户,并使用捕获门户登录页面打开操作系统级浏览器窗口。
当用户点击";同意&"连接";,形式是CCD_ 8ed,其在捕获门户设备上执行其MAC的授权。
Web服务器返回我自己的success.html
和白色文本,JavaScript重定向到用户请求的URL(对于用户使用移动浏览器手动浏览网站的情况)或品牌欢迎页面。
TL;博士:
- 用户连接到专属门户
- 移动设备检测到捕获的入口
- 移动CNA加载专属门户登录页面
- 用户点击";同意&"连接";,向执行身份验证的Web服务器发出
POST
请求 - HTTP 302重定向是从指向我的Web服务器上的
success.html
的POST
URL返回的,该URL在<body>
元素之后包含JavScript重定向这会触发iOS CNA web视图来检测它是否已成功连接到网络 - CNA登录窗口重定向到我的品牌
welcome.html
- CNA网页浏览窗口在Android中自动关闭,或者用户可以点击";完成";在iOS CNA web视图窗口中关闭
iOS 11中引入了另一个错误,即CNA在Safari中打开链接后不会自行关闭。
请参阅此处的讨论:https://forums.developer.apple.com/thread/75498#221482
我通过以下操作使我的iOS 9.1设备在mikrotik环境中重定向:
将alogin.html页面(您的连接页面)更改为标题为connected和正文为connected,如下所示:
<html>
<head>
<title>Success</title>
</head>
<body>
Success
<script>
function addElement(absoluteurl)
{
var anchor = document.createElement('a');
anchor.href = absoluteurl;
window.document.body.insertBefore(anchor, window.document.body.firstChild);
setTimeout(function(){ anchor.click(); }, 1000);
// document.body.appendChild(elemDiv); // appends last of that element
}
addElement("http://www.google.com");
</script>
</body>
在更新的设备10.3.1上,这似乎不再有效,目前正在测试它的变体。https://forums.developer.apple.com/thread/75498
您需要确保锚点标记指向的是绝对URL,而不是相对URL。例如,你的链接应该是
<a href="http://yourdomain.com/home.html">Home</a>
如果链接是,则不会中断
<a href="/home.html">Home</a>
此外,请注意,只有当点击链接时互联网可用/用户已连接时,这才会起作用。在iOS CNA中,连接时右上角按钮将变为"完成"。因此,当CNA的状态为Done
时,点击一个绝对链接将关闭CNA,并在Safari中加载该链接。