7

我正在运行一个强制门户,目标受众仅为移动设备。在 CNA 中通过身份验证,我想向用户打开一个“欢迎页面” 。此页面应在(移动)Safari 中打开,而不是在 CNA 中打开,因为它包含在有限的 CNA 环境中不起作用的交互式元素。

我以前在其他门户网站上看到过这个工作,但我不知道他们是如何做到的,即使经过长时间的研究也无法弄清楚是如何做到的。

所拥有的是:

  • 强制门户/强制网络正在运行
  • 连接的用户在弹出窗口 (CNA) 中显示启动页面
  • 由于我不需要身份验证,因此它们此时已连接,并且右上角的按钮显示“确定”

想要的是:

  • 此启动页面上用于打开 Safari 窗口的链接或按钮

或者

  • 一些 JavaScript、重定向,以及在 CNA 关闭时打开 Safari 窗口的任何其他内容。

到目前为止,我没有发现任何东西(例如提到使用 target="_system")。有谁知道这些酒店和其他门户网站是如何设法做到的,做到了吗?

4

5 回答 5

5

您无法使操作系统(OS X 或 iOS)打开 Safari。当iOSX检测到有围墙的花园(强制门户)时,它会启动 CNA。那是。

CNA≠Safari。让我们尝试<a href="..." target="_blank">test</a> 打开另一个 CNA 窗口的任何尝试都失败了。

让我们尝试<a href="..." target="_system">test</a> 任何打开 Safari 的尝试都失败(_system 仅适用于 iOS 应用程序中的 Safari、邮件和 Safari 网络视图)

对我来说:回答 = 不可能。

但我想知道:有没有人已经看到过这种现象。您是否见过在显示 CNA 窗口后自动启动的 safari 页面?

于 2015-07-13T12:43:45.323 回答
3

iOS 11 中引入了另一个错误,即 CNA 在 Safari 中打开链接后不会自行关闭。

参考这里的讨论:https ://forums.developer.apple.com/thread/75498#221482

于 2017-09-22T09:12:06.420 回答
2

秘诀是向 iOS 客户端发送一个 HTML 响应,其中的 BODY 元素只包含单词“Success”。iOS CNA 期望返回类似http://www.apple.com/library/test/success.html的内容。

例如:成功成功

您可以使用 javascript 重定向 iOS CNA 窗口:

<script type="text/javascript">
    window.location.href = "yourdomain.com/welcome.html";
</script>

此外,您可以通过在 BODY 标记上使用 STYLE 属性将正文文本更改为白色来隐藏“成功”消息。iOS CNA 应用程序似乎并没有寻找完全符合Apple 的success.html 的页面。它似乎在寻找包含“成功”一词的 BODY 元素。

我的用例

我使用的强制门户要求用户同意服务条款。移动设备将使用其 CNA(强制网络助手)检测强制门户,并使用强制门户登录页面打开操作系统级浏览器窗口。

当用户单击“同意并连接”时,会发布一个表单,该表单在强制网络门户设备上执行他们的 MAC 授权。

网络服务器返回我自己的带有白色文本的 success.html,并且 javascript 重定向到用户请求的 URL(对于用户使用其移动浏览器手动浏览网站的情况)或品牌欢迎页面

TL;博士:

  1. 用户连接到强制门户

  2. 移动设备检测到强制门户

  3. 移动 CNA 加载强制门户登录页面

  4. 用户单击“同意并连接”,向我的执行身份验证的网络服务器发出 POST 请求

  5. HTTP 302 重定向从指向我的网络服务器上的 success.html 的 POST URL 返回,其中包含 BODY 元素后的 javscript 重定向这会触发 iOS CNA Web 视图以检测它已成功连接到网络

  6. CNA 登录窗口被重定向到我的品牌welcome.html

  7. CNA webview 窗口在 Android 中自动关闭,或者用户可以在 iOS CNA webview 窗口上单击“完成”将其关闭

于 2015-05-15T03:35:18.307 回答
2

通过执行以下操作,我设法让我的 iOS 9.1 设​​备在 mikrotik 环境中重定向:

将 alogin.html 页面(您的已连接页面)更改为已连接的标题和已连接的正文,如下所示:

<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

于 2017-06-01T10:01:25.600 回答
1

您需要确保锚标记指向绝对 URL 而不是相对 URL。例如,您的链接应该是

<a href="http://yourdomain.com/home.html">Home</a>

如果链接是,它不会中断

<a href="/home.html">Home</a>

另请注意,这仅在互联网可用/单击链接时连接用户时才有效。在 iOS CNA 中,连接后右上角的按钮将变为“完成”。因此,当 CNA 的状态为时,基本上单击绝对链接Done将关闭 CNA 并在 Safari 中加载该链接。

于 2016-07-19T15:30:29.990 回答