我们在网络上遇到iOS设备问题(ipads,iphone等):连接到SSID后,iphone / ipad立即打开强制网络助手(CNA) - 它就像一个没有导航按钮等的缩小浏览器 - 显示我们的欢迎页面(准备让用户在网络中验证他的MAC以给他上网) . 这个CNA是iOS的功能,自动发生 .
我在这个论坛上四处寻找如何让用户通过点击链接(在CNA中)打开他的Safari浏览器,从而将他从CNA发送到Safari(这是我希望他的地方) .
我搜索了一些短语,例如:"How to set a link to open in safari",但我得到的结果是关于使用phonegap进行这类事情的人...
一位用户谈到使用window.open(myURL,'_system'),但我不知道这是否解决了我的问题 .
基本上我的计划是: - 让我的欢迎页面(用户连接到我的SSID后显示的页面)检测用户设备的浏览器类型 . 我的欢迎页面托管在我的控制器的Walled Garden中的一个站点,因此每个设备都可以看到欢迎页面(无论他们是否具有完全的互联网访问权限) . - 如果用户有iOS设备,则CNA浏览器会自动打开 . 我的控制器检测到设备有一个CNA浏览器,并加载一个带有消息的简单页面(如):“点击此处开始导航” - 在接下来的几秒钟内(当用户消化消息时),我的控制器给用户MAC完全互联网访问 - 当用户在CNA浏览器中点击该链接时,CNA关闭然后打开Safari,并强制Safari打开目标欢迎页面(我希望我的用户在哪里,具体取决于他所使用的天线)连接的) .
我真的希望一切都有道理......
我在这个论坛找到了关于CNA浏览器的链接:Bypasses Apple Captive Network Assistant Login in iOS 7
但它会让用户从一开始就打开Safari(禁用CNA功能),“希望”用户打开Safari(而不是直接转到他的某个应用程序) . 我更喜欢用户必须“点击继续”,这使Safari打开,他看到我的欢迎页面 .
3 回答
摘自Ryan的答案 How can I open an external link in Safari not the app's UIWebView?
要将特定链接切换到Safari,只需将target =“_ system”添加到链接中,如
或者要捕获javascript中包含target =“_ blank”的所有链接,请包含jQuery并使用'_system'参数将它们传递给window.open . 这适用于iOS和Android .
Javascript在CNA中无法完全运行,出于安全原因它被禁用 . target = "_system"是 safari 功能,而不是CNA功能 . ==>简单地说,_system在CNA中失败了 .
EDIT :此解决方案没有't work after iOS 10.3. Not sure if that' s功能或错误: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后,您可以让用户完成登录过程 . 为了查看登录过程是否完成以及最终 Build 连接,iOS设备现在将发送另一个wispr请求 . 这种情况每40秒发生一次,或者每当发出HTTP请求时(CNA内导航) .当您的服务器最终回复
Success
到wispr请求时,CNA将标记为connected
,顶部的按钮将变为Done
. 在此阶段,任何外部URL链接将关闭CNA并在Safari中打开:)总而言之,您可以通过以下连接步骤实现您的目标:
服务器使用您的CNA页面回答初始wispr请求 .
页面在CNA中打开 . 在该页面中,有一些JavaScript会立即触发CNA内的导航,例如:
<script>window.location.reload(true)</script>
这将触发iOS设备立即发送另一个wispr请求服务器用
<HTML><HEAD><TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML>
回答第二个wispr请求,这将触发CNA标记为已连接让您的CNA页面显示指向外部网址的链接