25

我们在使用 iOS 设备(ipad、iphone 等)的网络上遇到问题:连接到 SSID 后,iphone / ipad 立即打开 Captive Network Assistant (CNA) - 它就像一个没有导航按钮等的缩小浏览器- 显示我们的欢迎页面(准备好让用户在网络中验证他的 MAC 以给他互联网)。这个 CNA 是 iOS 的一个函数,并且自动发生。

我在这个论坛上环顾四周,如何让用户通过单击链接(在 CNA 中时)打开他的 Safari 浏览器,从而让他离开 CNA 并进入 Safari(我希望他在那里)。

我搜索了诸如“如何设置在 safari 中打开的链接”之类的短语,但我得到了关于人们使用 phonegap 做这样的事情的结果......
一位用户谈到了使用 window.open(myURL, '_system') 但是我不知道这是否解决了我的问题。

基本上我的计划是: - 让我的欢迎页面(用户连接到我的 SSID 后显示的页面)检测用户设备的浏览器类型。我的欢迎页面托管在我的控制器的围墙花园中的一个站点上,因此每个设备都可以看到该欢迎页面(无论它们是否具有完整的互联网访问权限)。- 如果用户有 iOS 设备,CNA 浏览器会自动打开。我的控制器检测到设备有一个 CNA 浏览器并加载一个带有消息的简单页面(如):“单击此处开始导航” - 在接下来的几秒钟内(当用户正在消化消息时),我的控制器为用户提供MAC 完全互联网访问 - 当用户在 CNA 浏览器中单击该链接时,CNA 关闭然后打开 Safari,

我真的希望一切都有意义...

我在这个论坛中找到了关于 CNA 浏览器的链接: Bypasses Apple Captive Network Assistant Login in iOS 7

但它谈到让用户从一开始就打开 Safari(禁用 CNA 功能),“希望”用户打开 Safari(而不是直接进入他的一个应用程序)。我更喜欢用户必须“单击以继续”,这会使 Safari 打开并且他会看到我的欢迎页面。

4

3 回答 3

5

编辑:此解决方案在 iOS 10.3 之后不起作用。不确定这是功能还是错误:https ://forums.developer.apple.com/thread/75498

EDIT2:显然它可以在 iOS 11 上再次运行


如果您可以控制强制门户服务器,则有一种简单的方法可以做到这一点。

当连接到 wifi 网络时,iOS 设备会向一组预定义的 url ( http://www.apple.com/library/test/success.html, ...) 发送 GET 请求,以查看是否存在 Internet 连接(wispr 请求)。iOS 设备期待答案<HTML><HEAD><TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML>。如果请求成功,但答案不同(例如您的强制门户页面),则会触发 CNA 打开。

在这个阶段,CNA 认为你没有连接,并会Cancel在顶部显示一个按钮。无论您做什么,每个链接都将在 CNA 内打开,而不是在 Safari 窗口中打开。CNA 已完成,以便您可以让您的用户完成登录过程。为了查看登录过程是否完成并最终建立连接,iOS 设备会不时发送另一个 wispr 请求。这种情况每 40 秒发生一次,或者每当发出 HTTP 请求时发生(在 CNA 内导航)。

当您的服务器最终Success响应 wispr 请求时,CNA 将标记为connected,顶部的按钮将变为Done。在这个阶段,任何指向外部 url 的链接都会关闭 CNA 并在 Safari 中打开 :)

总而言之,您可以通过以下连接步骤实现您想要的:

  1. 服务器使用您的 CNA 页面回答初始 wispr 请求。
  2. 该页面在 CNA 中打开。在该页面中,有一些 JavaScript 会立即触发 CNA 内的导航,例如:<script>window.location.reload(true)</script>这将触发 iOS 设备立即发送另一个 wispr 请求
  3. 服务器用 回答第二个 wispr 请求<HTML><HEAD><TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML>,这将触发 CNA 标记为已连接
  4. 让您的 CNA 页面显示指向外部 url 的链接
于 2016-11-12T09:44:14.987 回答
3

摘自 Ryan 在How can I open an external link in Safari not the app's UIWebView?

要将特定链接切换到 Safari,只需将 target="_system" 添加到链接中,如

<a href="http://www.domain.com/" target="_system">Link Text</a>

或者要捕获 javascript 中具有 target="_blank" 的所有链接,包括 jQuery 并使用 '_system' 参数将它们传递给 window.open。这将适用于 iOS 和 Android。

$(document).on('click', 'a[target="_blank"]', function(ev) {
  var url;

  ev.preventDefault();
  url = $(this).attr('href');
  window.open(url, '_system');
});
于 2014-12-05T02:02:55.680 回答
3

Javascript 在 CNA 中不能完全工作,出于安全原因它被禁用。target="_system" 是一项Safari功能,而不是 CNA 功能。==> 简而言之,_system 在 CNA 中失败。

于 2015-07-08T12:21:05.193 回答