设为首页 收藏本站
查看: 1098|回复: 0

[经验分享] iOS客户端de公共WIFI解决方案

[复制链接]

尚未签到

发表于 2015-10-1 08:19:47 | 显示全部楼层 |阅读模式
一、公共WIFI综述
  现在很多公司都在做免费WIFI,车站、公交、地铁、餐厅,只要是人员密集流动的地方就有WIFI,免费WIFI从最初的网页认证方式也逐渐向客户端认证方式偏移。本文主要讨论iOS认证上网的解决方案。
  iOS端WIFI应用的相关开发,主要存在以下问题:


  •   iOS系统WIFI相关的接口很少,大部分接口都是私有接口

  •   在设备连接上WIFI,没有通过路由器认证前,如果关闭iOS自动弹出的Portal页面,iPhone的WIFI会自动断开

  •   如何禁止iOS系统自动弹Portal页面

  •   公共WIFI的名称确定及不确定时的处理办法

  本文主要讨论在使用公开的API,即可以提交到App Store的应用。

二、基础信息获取
  1. 获取网卡IP







1 + (NSString *)localIPAddress
2 {
3     NSString *localIP = nil;
4     struct ifaddrs *addrs;
5     if (getifaddrs(&addrs)==0) {
6         const struct ifaddrs *cursor = addrs;
7         while (cursor != NULL) {
8             if (cursor->ifa_addr->sa_family == AF_INET && (cursor->ifa_flags & IFF_LOOPBACK) == 0)
9             {
10                 NSString *name = [NSString stringWithUTF8String:cursor->ifa_name];
11                 if ([name isEqualToString:@"en0"]) // Wi-Fi adapter
12                 {
13                     localIP = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)cursor->ifa_addr)->sin_addr)];
14                     break;
15                 }
16             }
17             cursor = cursor->ifa_next;
18         }
19         freeifaddrs(addrs);
20     }
21     return localIP;
22 }
  
  2. 获取网卡信息







1 - (NSDictionary *)getWIFIDic
2 {
3     CFArrayRef myArray = CNCopySupportedInterfaces();
4     if (myArray != nil) {
5         CFDictionaryRef myDict = CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(myArray, 0));
6         if (myDict != nil) {
7             NSDictionary *dic = (NSDictionary*)CFBridgingRelease(myDict);
8             return dic;
9         }
10     }
11     return nil;
12 }
13  
14 - (NSString *)getBSSID
15 {
16     NSDictionary *dic = [self getWIFIDic];
17     if (dic == nil) {
18         return nil;
19     }
20     return dic[@"BSSID"];
21 }
22  
23 - (NSString *)getSSID
24 {
25     NSDictionary *dic = [self getWIFIDic];
26     if (dic == nil) {
27         return nil;
28     }
29     return dic[@"SSID"];
30 }
  
  **注意事项**
  在实际测试时,获取网卡信息**getWIFIDic**方法,在部分路由器上耗时很长(10秒以上),如果直接放在主线程中,会导致界面卡死。在认证相关的应用中,会根据网卡上的BSSID(例如:以特定3d:e6:c3开头的即为本公司架设网络)来判断是否属于本公司的路由。SSID、BSSID若为应用启动时必须获取的信息(我们公司的应用,就是这种),这个时候怎样处理呢?
  放在异步线程,获取到网卡信息再初使化界面,这种方法依然会导致在某些路由器下初次打开界面超长时间的等待,我们的处理方法是,如果3秒内能够获取到相应的配置信息,直接根据配置信息初使化界面,在超过3秒时,给予默认的假WIFI信息,初使化界面。异步线程获取到真实的配置信息后,再重新更新界面。

三、认证过程中的棘手问题
  1. Portal禁止弹出与WIFI自动关闭的问题
  正常情况,用户使用iPhone手机连接带有Portal认证的路由器,在连接成功后,iOS系统会在已有列表中随机选择连接指定的网址(例如:www.itools.info)以测试当前路由器是否需要Portal认证。在需要Portal认证的网络,系统会弹出Portal页面,这个时候,如果用关掉portal页面,或者直接切换到其它应用,WIFI网络会直接自动断开(根本不给客户端认证机会^_^)。
  我们的解决办法是路由器白名单,让路由器放行所有Portal测试的IP,以下为测试的域名:







1 www.appleiphonecell.com
2 captive.apple.com
3 www.itools.info
4 www.ibook.info
5 www.airport.us
6 www.thinkdifferent.us
  
  对应的IP地址:







1 23.207.103.91
2 23.33.54.18
3 23.44.167.91
4 23.67.183.91
5 96.7.103.91
6 23.42.71.91
7 23.34.105.211
8 23.59.167.91
9 23.42.184.50
10 23.47.232.190
11 23.77.23.91
12 23.194.87.91
13 23.61.91.190
14 23.218.12.50
15 23.2.38.95
16 23.46.135.91
17 172.225.213.179
18 218.205.66.94
19 23.64.251.249
20 23.58.250.189
  
  将以上所有IP加到路由器的白名单中,即可解决iPhone断开WIFI的问题,但是同时也不自动弹出Portal页面了,用户打开浏览器才会重定向到Portal页面。
  2. WIFI名确定解决方法
  如果公司部署的公共WIFI名确定的情况,就比较简单了,不需要配置上述白名单也可以保证WIFI不断开,具体办法是,在程序启动时,向iOS系统注册SSID,方法如下:







1 - (void)registerNetwork:(NSString *)ssid
2 {
3     NSString *values[] = {ssid};
4     CFArrayRef arrayRef = CFArrayCreate(kCFAllocatorDefault,(void *)values,
5                                         (CFIndex)1, &kCFTypeArrayCallBacks);
6     if( CNSetSupportedSSIDs(arrayRef)) {
7         NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
8         CNMarkPortalOnline((__bridge CFStringRef)(ifs[0]));
9         NSLog(@"%@", ifs);
10     }
11  
12  
13 }
  

四、总结
  苹果对于WIFI这块公开的API非常少,在开发公共WIFI应用时会遇到各种问题,上面是在使用非私有API的一些解决方案,如果大家有更优的办法,欢迎留言分享。如果公司有企业账号可以通过调用私有API的办法来处理大部分需求。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-121119-1-1.html 上篇帖子: 转:关于使用OpenNetCF完成windows mobile上的wifi通信 下篇帖子: Windows7 下设置电脑做手机 WIFI 热点
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表