为你的App增加WIFI认证检测,让用户体验更加丝滑
前言
前段时间在上海坐地铁时连接了花生地铁WIFI,打开QQ音乐开始听歌,QQ音乐居然给了我一个"WIFI认证提醒"的弹窗,点击认证就跳转到了花生地铁WIFI的认证页,之后顺利联网成功,体验非常爽。作为一名iOS开发,不禁思考这个是怎么做到的呢?忘记WIFI重新连接后,打开手机里各个应用轮番测试一遍,发现QQ音乐、QQ、QQ空间三个应用都做了比较好的WIFI认证提示:
而其它的大应用如微信、手淘、支付宝、钉钉、美团、点评、爱奇艺、百度地图等则都没有给出认证提醒,而是提示我检查网络设置等,说明许多App都没重视到这个细节,而其实现在这种场景还是很多的,比如花生地铁WIFI、i-Shanghai、i-hangzhou、alibaba-guest和其它许多公共场所的WIFI,还是有必要做一个优化~
关于Captive Portal
经过一番调研,这种需认证才能使用的WIFI,使用的是Captive Portal机制,中文通常译作“强制主页”或“强制登录门户”,一个Captive Portal是一个Web登录页面,通常由网络运营商或网关在用户能够正常访问互联网之前拦截用户的请求并将一个强制登录或认证主页呈现(通常是通过浏览器)给用户。该页面可能要求用户输入认证信息、支付、接受某些条款或者其他用户授权等,随后用户才能被授权访问互联网。该技术广泛用于移动和个人宽带服务,包括有线电视、商业WiFi、家庭热点等,也可用于访问企业和住宅区有线网络。详细可参看wiki:https://en.wikipedia.org/wiki/Captive_portal
大多数需认证WIFI实现Captive Portal是通过HTTP重定向的方式,也有一些是通过DNS劫持或ICMP重定向的方式。
如何检测Captive Portal
iOS和Android系统其实早就实现了Captive Portal的检测机制,只是有一些WIFI会绕过这样机制。就需要我们额外再做一次检测了。
详细可参看:
关于Apple的Captive Network Assistant
Bypasses Apple Captive Network Assistant Login in iOS 7
根据Captive Portal的实现方式和特点,我们有以下两种常用检测方法:( 欢迎补充~ )
1. 判断网页的host是否完全变了
由于连接了需认证WIFI后,通过浏览器访问任何网页都会得到Captive Portal页面,所以对于iOS应用,一个比较简单的检测方法是用WKWebView加载某一个网页,在decidePolicyForNavigationAction代理方法里,拿到navigationAction.request.URL看host是不是完全变了,如果完全变了即可判断当前WIFI需要认证。
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { decisionHandler(WKNavigationActionPolicyAllow); self.trueUrl = navigationAction.request.URL; if (self.openTestMode) { // 测试用 这个url是上海花生地铁wifi的认证页,连上上海花生地铁wifi后,未认证时访问所有网页都会被重定向到该地址 self.trueUrl= [NSURL URLWithString:@"http://portal.wifi8.com/wifiapp"]; } if ([self.trueUrl.host containsString:@"baidu.com"]) { if (_networkCheckComplection) { _networkCheckComplection(NO); _networkCheckComplection = nil; } } else { // 网页被重定向到了self.trueUrl,wifi需要认证 if (_networkCheckComplection) { _networkCheckComplection(YES); _networkCheckComplection = nil; } if (_needAlert) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"WI-FI认证提醒" message:@"检测到当前WI-FI需要认证才能使用,请尝试去认证网络" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"认证", nil]; [alert show]; _needAlert = NO; } } }
Android端的检测也可以采用这样的方式,具体可参看google的文档:https://developer.android.com/reference/java/net/HttpURLConnection.html ,其中提到的判断机制如下:
有一点需要注意的是,判断host完全相等不是特别合适,比如在WKWebView里访问http://www.baidu.com ,可能会被重定向到http://m.baidu.com ,这样则不属于WIFI需要认证的情况。
2. 访问特定网页,判断HTTP状态码
也可以通过判断HTTP状态码的方式来检测Captive Portal。比如访问google提供的一个空白网页http://clients1.google.com/generate_204 ,如果返回的HTTP状态码是204,则可判断当前网络无需认证,否则需要提醒用户认证网络。
详细可参看:
关于Android的captive portal
检测Captive Portal的iOS版Demo
基于判断host的方式,我写了一个检测Captive Portal的小Demo放在了github,其中用于Captive Portal检测的工具类是CaptivePortalCheck,没有任何外部依赖,即拿即用,欢迎尝试~
文中内容如有不对,欢迎指正~
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
一行代码,让你的应用中UIScrollView的滑动与侧滑返回并存
侧滑返回是iOS系统的一个很贴心的功能,特别是在大屏手机上,单手操作的时候去按左上角的返回键特别不方便。当我在使用一个APP的时候,如果控制器不能侧滑返回,我会觉得这个APP十分不友好...这款产品在我心中的印象分也会有所降低...侧滑返回本身是系统自带的效果,无须开发者处理的。但是,一旦给控制器加了leftBarButtonItem,系统侧滑手势居然失效了(苹果你这样真的好吗...),要重新支持侧滑返回,可以做以下处理: 一、让应用支持侧滑返回 导入FDFullscreenPopGesture库,pod安装一下即可,安装后无须再加任何代码,应用所有页面都将支持全屏侧滑。github地址:https://github.com/forkingdog/FDFullscreenPopGesture 。如果你或者你们产品不喜欢全屏侧滑,还是喜欢在屏幕左边缘处才触发侧滑,那可以看看第二种方式: 写一个UINavigationController的子类,设置导航控制器的代理为自己,实现下面这个代理方法: - (void)navigationController:(UINavigationCont...
- 下一篇
阿里数据iOS端线上错误定位方案演进过程
背景 新版本发布到线上后,随着用户的陆续升级,由于代码bug、接口报错、用户网络问题、脏数据等原因,会陆续收到一些问题反馈。我们开发拿到的信息,可能是复现步骤的描述、错误时的截图等,如何快速定位问题,是我们每一个开发需要思考的。阿里数据iOS端的线上错误定位方案,大致经历了如下三个步骤: 纯人工排查 这是最苦逼的阶段。拿到干瘪的问题描述后,我们的第一招是去复现这个问题,首先从表里跑一遍sql取到用户的操作系统、APP版本信息,然后模拟用户的操作系统、APP版本、网络状态(设置-开发者-Network Link Conditioner)、操作路径、权限状态等去试图复现,如果复现成功就大功告成可以开始修复,如果不行就再试几次... APP上线前一般已经经过比较完整的测试,很容易复现的bug不多见,很可能我们难以复现用户反馈的这个错误。此时第二招是开始分析代码,根据错误结果对着代码开始倒推错误前经历了什么,试图找出不合适的处理逻辑、不够健壮的代码或不按预期返回数据的接口,此法效率低耗时不可控,甚至可能无法推断出最终原因。 如果能拿到出错的设备且在用户手机上容易复现,那就有兜底方案了,我们阿里...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果