我们的iOS设备(ipad、iphones等)网络出现问题:连接到SSID后,iphone/ipad会立即打开Captive network Assistant(CNA)-这就像一个没有导航按钮等的缩小浏览器-它会显示我们的欢迎页面(用户可以在网络中验证其MAC,以便访问互联网)。这个CNA是iOS的一个功能,它是自动发生的。
我在这个论坛上四处寻找如何让用户通过点击链接(在CNA中)打开他的Safari浏览器,从而将他从CNA发送到Safari(我希望他在那里)。
我搜索了一些短语,比如:"如何设置在狩猎中打开的链接",但我得到了关于人们使用phonegap做这种事情的结果
一位用户谈到使用window.open(myURL,'_system')但我不知道这是否能解决我的问题。
基本上,我的计划是:-让我的欢迎页面(用户连接到我的SSID后显示的页面)检测用户设备的浏览器类型。我的欢迎页面托管在我控制器的Walled Garden中的一个网站上,所以每个设备都可以看到欢迎页面(无论他们是否可以完全访问互联网)。-如果用户拥有iOS设备,CNA浏览器会自动打开。我的控制器检测到设备有CNA浏览器,并加载一个简单的页面,其中包含消息(如):"单击此处开始导航"-在接下来的几秒钟里(当用户正在消化消息时),我的控制器为用户的MAC提供了完全的互联网访问权限-当用户在CNA浏览器中单击该链接时,CNA会关闭然后打开Safari,并强制Safari打开目的地欢迎页面(我希望我的用户在哪里,取决于他连接的天线)。
我真的希望一切都有意义。。。
我在这个论坛上找到了关于CNA浏览器的链接:绕过iOS 7 中的Apple Captive网络助理登录
但它谈到了让用户从一开始就打开Safari(禁用CNA功能),"希望"用户打开Safari,而不是直接转到他的一个应用程序)。我更喜欢用户必须"点击继续",这样Safari就会打开,他会看到我的欢迎页面。
编辑:此解决方案在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请求,以查看是否存在互联网连接(wispr请求)。iOS设备需要答案<HTML><HEAD><TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML>
。如果请求成功,但答案不同(例如您的专属门户页面),则会触发CNA打开。
在这个阶段,CNA认为您没有连接,并将在顶部显示一个Cancel
按钮。无论你做什么,每个链接都会在CNA中打开,而不是在Safari窗口中打开。CNA是为了让你的用户通过登录过程。为了查看登录过程是否完成,连接是否最终建立,iOS设备将不时发送另一个wispr请求。这种情况每40秒发生一次,或者每当发出HTTP请求时(CNA中的导航)。
当您的服务器最终对一个请求响应Success
时,CNA将标记为connected
,顶部的按钮将变为Done
。在这个阶段,任何指向外部url的链接都将关闭CNA并在Safari中打开:)
总之,您可以通过以下连接步骤实现您想要的:
- 服务器用您的CNA页面回答最初的请求
- 页面在CNA中打开。在该页面中,有一些JavaScript可以立即触发CNA中的导航,例如:
<script>window.location.reload(true)</script>
,这将触发iOS设备立即发送另一个请求 - 服务器用
<HTML><HEAD><TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML>
回答第二个请求,这将触发CNA标记为已连接 - 让您的CNA页面显示指向外部url的链接
摘自Ryan在我如何在Safari中打开外部链接而不是应用程序';s的UIWebView
要将特定链接切换到Safari,只需在链接中添加target="_system",如中所示
<a href="http://www.domain.com/" target="_system">Link Text</a>
或者,要捕获javascript中target="_blank"的所有链接,请包含jQuery并将其传递给window.open,并使用'_system'参数。这将适用于iOS和Android。
$(document).on('click', 'a[target="_blank"]', function(ev) {
var url;
ev.preventDefault();
url = $(this).attr('href');
window.open(url, '_system');
});
Javascript在CNA中不能完全工作,出于安全原因,它被禁用。target="_system"是safari功能,而不是CNA功能。===>短暂地,_系统在CNA中失败。