强制无线弹出窗口:单击链接以打开Safari

时间:2014-04-24 23:18:05

标签: ios macos wifi mobile-safari captivenetwork

我们在网络上遇到iOS设备问题(ipads,iphone等):连接到SSID后,iphone / ipad立即打开强制网络助手(CNA) - 它就像一个缩小版的浏览器导航按钮等 - 显示我们的欢迎页面(准备好让用户在网络中验证他的MAC以给他上网)。这个CNA是iOS的功能,会自动发生。

我在这个论坛上四处寻找如何通过点击链接(在CNA中)让用户打开他的Safari浏览器,从而将他从CNA发送到Safari(这是我希望他在哪里) )。

我搜索了一些短语,例如:“如何设置在safari中打开的链接”,但我得到的结果是关于使用phonegap进行此类操作的人... 一位用户谈到了使用 window.open(myURL,'_ system`) 但我不知道这是否解决了我的问题。

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

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

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

但它说明了用户从一开始就打开Safari(禁用CNA功能),“希望”用户打开Safari(而不是直接转到他的某个应用程序)。我更喜欢用户必须“点击继续”,这使Safari打开,他看到我的欢迎页面。

3 个答案:

答案 0 :(得分: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 =&#34; _blank&#34;的所有链接,请包含jQuery并使用&#39; _system&#39;将它们传递给window.open。 PARAM。这适用于iOS和Android。

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

  ev.preventDefault();
  url = $(this).attr('href');
  window.open(url, '_system');
});

答案 1 :(得分:3)

Javascript在CNA中无法完全运行,出于安​​全原因,它已被禁用。 target =“_ system”是 safari 功能,而不是CNA功能。 ==&GT;简而言之,_system在CNA中失败。

答案 2 :(得分:3)

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

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

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

当连接到wifi网络时,iOS设备会向一堆预定义的网址(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。在此阶段,任何指向外部网址的链接都将关闭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页面显示指向外部网址的链接