【问题标题】:Captive Wifi Popup: Click a link to open SafariCaptive Wifi Popup:单击链接以打开 Safari
【发布时间】:2014-06-10 11:38:43
【问题描述】:

我们在使用 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,并强制 Safari 打开目标欢迎页面(我希望我的用户所在的位置,具体取决于他连接到的天线)。

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

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

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

【问题讨论】:

  • 如果我错了,请纠正我,但我认为这根本不可能。通常,由于浏览器操作而允许打开的唯一应用程序是邮件或默认浏览器。否则,人们可能会仅仅因为他们访问了一个网页就随机地强迫其他人打开应用程序。
  • @user3570787 我想知道我是否见过它。我的目标是一样的,但是……我已经看到它起作用了吗?我认为没有。

标签: ios macos wifi mobile-safari captivenetwork


【解决方案1】:

EDIT :此解决方案在 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 内导航)。

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

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

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

【讨论】:

  • 通过在 CNA 页面中插入 1 秒延迟来实现自动 Safari 打开。然后它使用 click() 单击 A 元素,并在 Safari 中打开。 URL 是绝对的,目标未设置(不适用于 _blank)。没有延迟 wispr 可能会收到预期的响应,但链接会在无限循环中导航到 CNA。值得注意的是,如果我插入延迟,则第二个 wispr 请求会在可以预测链接导航之前出现,因此导航到链接并不是真正的触发器。
  • 看看你自己:github.com/sebpiq/FreedomPortal/blob/master/freedomportal/…我已经实现了这个确切的过程,它就像一个魅力
  • 延迟 1 秒后,这里的情况也很好:bitbucket.org/snippets/OCTAGRAM/dBq6z
  • 不适用于 iOS 10.3。验证后单击链接后不再关闭俘虏。
  • @sebpiq 我刚刚在我正在编写的 freebd 强制门户中使用具有最新 11 beta 的 iphone 6 对其进行了测试,并且它有效。顺便说一句,+1
【解决方案2】:

摘自 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');
});

【讨论】:

  • 我有一个类似的问题,我尝试使用带有 target="_system" 的链接,但它们在 CNA 中打开,而不是在 Safari 中。有人搞定这个工作吗?我已经看到它在热点工作,所以它是可能的。
  • 这是一个错误的答案,对不起。那是行不通的。
  • 为什么这个无效的时候是最上面的?
  • 在 iOS 9 CNA 中 _system 和 _blank 都不会触发 Safari。只需留在 CNA。
  • 有人找到解决方案了吗?
【解决方案3】:

Javascript 不能在 CNA 中完全工作,出于安全原因它被禁用。 target="_system" 是 safari 功能,而不是 CNA 功能。 ==> 简单地说,_system 在 CNA 中失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多