iOS客户端公共WIFI解决方案.doc
文本预览下载声明
一、公共WIFI综述现在很多公司都在做免费WIFI,车站、公交、地铁、餐厅,只要是人员密集流动的地方就有WIFI,免费WIFI从最初的网页认证方式也逐渐向客户端认证方式偏移。本文主要讨论iOS认证上网的解决方案。
iOS端WIFI应用的相关开发,主要存在以下问题:
iOS系统WIFI相关的接口很少,大部分接口都是私有接口
在设备连接上WIFI,没有通过路由器认证前,如果关闭iOS自动弹出的Portal页面,iPhone的WIFI会自动断开
如何禁止iOS系统自动弹Portal页面
公共WIFI的名称确定及不确定时的处理办法
本文主要讨论在使用公开的API,即可以提交到App Store的应用。
二、基础信息获取1. 获取网卡IP
+(NSString*)localIPAddress{NSString*localIP=nil;structifaddrs*addrs;if(getifaddrs(addrs)==0){conststructifaddrs*cursor=addrs;while(cursor!=NULL){if(cursor-ifa_addr-sa_family==AF_INET(cursor-ifa_flagsIFF_LOOPBACK)==0){NSString*name=[NSStringstringWithUTF8String:cursor-ifa_name];if([nameisEqualToString:@”en0”])//Wi-Fiadapter{localIP=[NSStringstringWithUTF8String:inet_ntoa(((structsockaddr_in*)cursor-ifa_addr)-sin_addr)];break;}}cursor=cursor-ifa_next;}freeifaddrs(addrs);}returnlocalIP;}2. 获取网卡信息
-(NSDictionary*)getWIFIDic{CFArrayRefmyArray=CNCopySupportedInterfaces();if(myArray!=nil){CFDictionaryRefmyDict=CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(myArray,0));if(myDict!=nil){NSDictionary*dic=(NSDictionary*)CFBridgingRelease(myDict);returndic;}}returnnil;}-(NSString*)getBSSID{NSDictionary*dic=[selfgetWIFIDic];if(dic==nil){returnnil;}returndic[@”BSSID”];}-(NSString*)getSSID{NSDictionary*dic=[selfgetWIFIDic];if(dic==nil){returnnil;}returndic[@”SSID”];}**注意事项**
在实际测试时,获取网卡信息**getWIFIDic**方法,在部分路由器上耗时很长(10秒以上),如果直接放在主线程中,会导致界面卡死。在认证相关的应用中,会根据网卡上的BSSID(例如:以特定3d:e6:c3开头的即为本公司架设网络)来判断是否属于本公司的路由。SSID、BSSID若为应用启动时必须获取的信息(我们公司的应用,就是这种),这个时候怎样处理呢?
放在异步线程,获取到网卡信息再初使化界面,这种方法依然会导致在某些路由器下初次打开界面超长时间的等待,我们的处理方法是,如果3秒内能够获取到相应的配置信息,直接根据配置信息初使化界面,在超过3秒时,给予默认的假WIFI信息,初使化界面。异步线程获取到真实的配置信息后,再重新更新界面。
三、认证过程中的棘手问题1. Portal禁止弹出与WIFI自动关闭的问题
正常情况,用户使用iPhone手机连接带www.airport.uswww.thinkdifferent.us对应的IP地址:
81090900517944989将以上所有IP加到路由器的白名单中,即可解决iPhone断开WIFI的问题,但是同时也不自动弹出Portal页面了,用户打开浏览器才会重定向到Portal页面。
2. WIFI名确定解决方法
如果公司部署的公共WIFI名确定的情况,就比较简单了,不需要配置上述白名单也可以保证WIFI不断开,具体办法是,在程序启动时,向iOS系统注册SSID,方法如下:
-(void)registerNetwork:(NSString*)ssid{NSString*values[]={ssid};CFArrayRefarrayRe
显示全部