在 WIFI 的应用场景中,有个很典型的应用,叫做 Captive Portal,也叫Captive Web Portal(CWP)大致流程是:1. 用户的移动设备(例如)接入 WIFI2. 打开任意网页3. 得到一个类似 Login 的页面,需要用户填写一些信息,然后提交4. 认证通过后,允许自由访问网络,否则无法上网电信、移动等运营商经常会推出一些市区里的 WIFI,很多用的就是这种方式还有像机场等地有个典型的应用,就是杭州的 ihangzhouiOS,还有 Mac OS,都有个功能,当接入无线网络后,会自动检测网络是否通如果不通,则会自动弹出一个页面,让用户去登录Apple 把这种功能叫做 Captive Network Assistant(CNA)其原理如下:1. 发送一个 HTTP/1.0 的请求到 2. 接收一个回应,如果回应跟它预计的结果一致,那么认为网络是通的,就不会自动弹出页面同时,状态栏的 WIFI 图标出现流程结束否则,进入下一步3. 如果收到的回应不是它想要的那个,它就认为有 CWP 存在4. 如果有 CWP 存在,iOS 就会自动打开一个页面,在这个页面中再请求一次 HTTP/1.1。
5. 然后就可以打开 Login 页面了在第 2 步中,如果有 CWP 存在,收到的回应通常是一个 Login 页面,这个和第5 步收到的结果应该是一样的如果网络能,则可以收到下面的回应SuccessSuccess只是第 2 步中,iOS 是如何判断的,不得而知不过只要保证收到上面的响应,则一定能通那么,第 2 步中如果没有收到响应,或是收到了非 HTTP 200 的响应又会如何呢?根据我的测试,如果没收到响应,依然会弹出一个窗口不过,这不是一种正常的 CWP 状态非 HTTP 200 的情况,我只试了 HTTP 302 重定向在这种情况下,iOS 不会自动弹出 Login 页面在上面的 5 步中,得到了一个 Login 页面,然后又会发生什么呢?用户拿到 Login 页面后,应该填写一些信息,并且提交iOS 会在用户提交后,立即发一边第 1 步中的请求,再次检测网络如果此时网络还是不通,iOS 会自动断开当前的 SSID不过这个行为好像有点不稳定,具体就不细说了网络通了后,在 iOS 上基本有 2 个现象一是右上角的“取消”按钮变成”完成“,或是自动关闭这个窗口,行为似乎不太一致最关键的是顶端状态栏WIFI 图标的出现。
从现象上看,只要 WIFI 图标不出来,iOS 就不允许有流外出(部分特殊的除外) 副作用 **********iOS 的这种行为,其实没给用户多少方便,却会带来不少麻烦我记得在 iOS 4 时,还可以选择是否启用 auto-login不过 iOS 6 已经没有这个选项了理论上讲,这个功能最麻烦的就是要保证你所在的网络可以访问 iOS 就无法连接了题外话】在 iOS 5 以前,只有 open 的 SSID 才会发 test 请求open 的SSID 指的是没有 802.1X 或 PSK 认证的)而从 iOS 6 开始,连上非 open 的网络也会发这个 test 了所以,在这种内网的情况下,需要防火墙开放 的访问,或是WIFI AP 可以支持避开 CNA 的检测我一直没在网上找到关于 CNA 的判断标准,不知道 Apple 搞这么个东西干吗 测试结果 **********写完此文,心里一直痒痒的,想知道第 2 步究竟是怎么判断的于是立即动手测试我发现,只要响应页面中,的值是 Success,大小写敏感,就可以欺骗iOS 了测了 iOS 6.0 和 Mac OS 10.7,结果都一样这下我心里释怀了。
不知道新版本会不会有变化该死的苹果。