转载自:http://blog.csdn.net/iefreer/article/details/8639856

2010年开始苹果清理了一批APP Store上的WIFI扫描软件, 缘由语焉不详.

这些WIFI扫描软件使用了苹果的私有函数apple80211.framework

尽管不能合法(指能通过App Store的审核)的获取WIFI列表, 不过我们还是可以获取到当前Wifi连接的信息,比如SSID.

SSID全称Service Set IDentifier, 即Wifi网络的公开名称.

苹果在IOS v4.1+版本上提供了公开的方法来获取该信息.

示范代码如下:

#import <SystemConfiguration/CaptiveNetwork.h>  - (id)fetchSSIDInfo
{  NSArray *ifs = (id)CNCopySupportedInterfaces();  NSLog(@"%s: Supported interfaces: %@", __func__, ifs);  id info = nil;  for (NSString *ifnam in ifs) {  info = (id)CNCopyCurrentNetworkInfo((CFStringRef)ifnam);  NSLog(@"%s: %@ => %@", __func__, ifnam, info);  if (info && [info count]) {  break;  }  [info release];  }  [ifs release];  return [info autorelease];
} 

对于ARC版本, 代码可简化如下:

- (id)fetchSSIDInfo {  NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();  NSLog(@"Supported interfaces: %@", ifs);  id info = nil;  for (NSString *ifnam in ifs) {  info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);  NSLog(@"%@ => %@", ifnam, info);  if (info && [info count]) { break; }  }  return info;
}

参考链接:
1.  http://stackoverflow.com/questions/5198716/iphone-get-ssid-without-private-library

2. http://answers.yahoo.com/question/index?qid=20100529040141AAKd8dO

以下内容转载自:http://00red.com/blog/2015/01/14/teacher-wifi-solution/

一、公共WIFI综述

现在很多公司都在做免费WIFI,车站、公交、地铁、餐厅,只要是人员密集流动的地方就有WIFI,免费WIFI从最初的网页认证方式也逐渐向客户端认证方式偏移。本文主要讨论IOS认证上网的解决方案。 IOS端WIFI应用的相关开发,主要存在以下问题

1.IOS系统WIFI相关的接口很少,大部分接口都是私有接口
2.在设备连接上WIFI,没有通过路由器认证前,如果关闭IOS自动弹出的Portal页面,Iphone的WIFI会自动断开
3.如何禁止IOS系统自动弹Portal页面
4.公共WIFI的名称确定及不确定时的处理办法
本文主要讨论在使用公开的API,即可以提交到App Store的应用。

二、基础信息获取

1.获取网卡IP

+ (NSString *)localIPAddress
{NSString *localIP = nil;struct ifaddrs *addrs;if (getifaddrs(&addrs)==0) {const struct ifaddrs *cursor = addrs;while (cursor != NULL) {if (cursor->ifa_addr->sa_family == AF_INET && (cursor->ifa_flags & IFF_LOOPBACK) == 0){NSString *name = [NSString stringWithUTF8String:cursor->ifa_name];if ([name isEqualToString:@"en0"]) // Wi-Fi adapter{localIP = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)cursor->ifa_addr)->sin_addr)];break;}}cursor = cursor->ifa_next;}freeifaddrs(addrs);}return localIP;
}

2.获取网卡信息

- (NSDictionary *)getWIFIDic
{CFArrayRef myArray = CNCopySupportedInterfaces();if (myArray != nil) {CFDictionaryRef myDict = CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(myArray, 0));if (myDict != nil) {NSDictionary *dic = (NSDictionary*)CFBridgingRelease(myDict);return dic;}}return nil;
}- (NSString *)getBSSID
{NSDictionary *dic = [self getWIFIDic];if (dic == nil) {return nil;}return dic[@"BSSID"];
}- (NSString *)getSSID
{NSDictionary *dic = [self getWIFIDic];if (dic == nil) {return nil;}return dic[@"SSID"];
}

注意事项

在实际测试时,获取网卡信息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,以下为测试的域名:

www.appleiphonecell.com
captive.apple.com
www.itools.info
www.ibook.info
www.airport.us
www.thinkdifferent.us

对应的IP地址:

23.207.103.91
23.33.54.18
23.44.167.91
23.67.183.91
96.7.103.91
23.42.71.91
23.34.105.211
23.59.167.91
23.42.184.50
23.47.232.190
23.77.23.91
23.194.87.91
23.61.91.190
23.218.12.50
23.2.38.95
23.46.135.91
172.225.213.179
218.205.66.94
23.64.251.249
23.58.250.189

将以上所有IP加到路由器的白名单中,即可解决Iphone断开WIFI的问题,但是同时也不自动弹出Portal页面了,用户打开浏览器才会重定向到Portal页面。

2、WIFI名确定解决方法

如果公司部署的公共WIFI名确定的情况,就比较简单了,不需要配置上述白名单也可以保证WIFI不断开,具体办法是,在程序启动时,向IOS系统注册SSID,方法如下:

- (void)registerNetwork:(NSString *)ssid
{NSString *values[] = {ssid};CFArrayRef arrayRef = CFArrayCreate(kCFAllocatorDefault,(void *)values,(CFIndex)1, &kCFTypeArrayCallBacks);if( CNSetSupportedSSIDs(arrayRef)) {NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();CNMarkPortalOnline((__bridge CFStringRef)(ifs[0]));NSLog(@"%@", ifs);}}

四、总结

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

iOS WIFI 相关相关推荐

  1. WiFiDemon – iOS WiFi RCE 0-Day漏洞利用

    近日,ZecOps安全研究人员发现了iOS WiFi命名漏洞的零交互攻击利用方式,可以用来远程劫持iPhone设备. Wi-Fi-Demon Wifid 是处理与WiFi连接相关的协议的系统daemo ...

  2. ios实现wifi搜索连接_Wifi 定位原理及 iOS Wifi 列表获取

    Wifi 定位原理及 iOS Wifi 列表获取 对于大家来说,Wifi 应该是一个很熟悉的词了,我们每天都可能在使用 Wifi 热点.Wifi 除了能给我们提供热点之外同时还有定位的作用, 现在移动 ...

  3. WiFi相关基础概念

    转自:https://blog.csdn.net/lbaihao/article/details/73250798 一.WiFi相关基础概念 1.什么是wifi 我们看一下百度百科是如何定义的: Wi ...

  4. Android控制WIFI相关操作

    Android控制WIFI相关操作 在XML文件中添加权限: <uses-permission android:name="android.permission.ACCESS_WIFI ...

  5. iOS wifi认证

    wifi认证存在的问题:在设备连接上wifi,没有通过路由器认证前,如果关闭自动弹出的Portal页面,wifi会自动断开. 解决方案:可通过以下两个方法来禁止系统自动弹Portal页面来解决wifi ...

  6. android 控制wifi模块,Android 控制wifi 相关操作实例

    Android 控制WIFI相关操作 WIFI的全称是Wireless Fidelity,又称802.11b标准,是一种高速的无线通信协议,传输速度可以达到11Mb/s. 实际上,对WIFI并不需要过 ...

  7. iOS wifi 路由器 连接

    iOS wifi 路由器 连接 (3年前的代码,现在已经忘记啥意思了) 目的: 让智能家居设备 连接指定的wifi 原理:在路由器的 管理页面模拟登录... // // WifiSelectViewC ...

  8. Android WiFi 相关

    因公司业务需求 进行WiFi相关的开发,包括WiFi的打开关闭,WiFi监听,自定义弹窗输入密码连接.断开WiFi,保存密码等: 按照以往的方式 ,首先百度 ,cv代码,结果各种报错 : 先介绍下本地 ...

  9. 疯狂iOS 讲义(上) Objective-C 2.0与iPhone/iPad应用开发基础(国内首部iOS 7相关著作,小伙伴们,学好iPhone/iPad应用开发,我们一起做土豪吧)

    疯狂iOS 讲义(上) Objective-C 2.0与iPhone/iPad应用开发基础(国内首部iOS 7相关著作,小伙伴们,学好iPhone/iPad应用开发,我们一起做土豪吧) 李刚 编 IS ...

最新文章

  1. 取消水晶报表的数据库登录框 分享
  2. 基于单目图像无监督学习的深度图生成
  3. 会话跟踪技术Cookieless
  4. 安卓的短信记录导入苹果_安卓换苹果手机后怎么转移便签数据?
  5. metric learning
  6. HTML5程序开发范例宝典 完整版 (韩旭等著) 中文pdf扫描版
  7. 多重信号辅助音频分离,让你在嘈杂环境也能指哪听哪儿
  8. 在Spring中使用JDBCJobStore配置Quartz
  9. oracle sql为null值,在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办
  10. NBear.Mapping使用教程(5):实体对象与NameValueCollection,Dicitonary以及NBear.Mapping性能
  11. ASP.NET 2.0 中 Web 事件
  12. IBM SPSS Amos下载与安装
  13. 计算机表格入门2013,Access2013从入门到精通
  14. Win11更新后电脑没有声音,声卡驱动失效,卸载重装依然无效
  15. 华为荣耀手机 (HUAWEI Honor V9) USB 调试 - ADB 调试
  16. 游戏音效制作中难or不难?
  17. python开三次方_用python计算三次方根
  18. 尼日利亚通货膨胀加剧和MogaFX外汇短缺加剧贬值投机
  19. eclipse默认指向WebContent目录修改为webRoot 设置说明
  20. 12操作系统面临的安全威胁安全脆弱性基本概念

热门文章

  1. 硬盘和显卡的访问与控制
  2. 从零开始学习信号完整性--7-SI分析仿真
  3. AUTOCAD——弧长标注命令、半径标注命令
  4. 大数据征信成撬动消费金融的支点?
  5. datasources数据源自动配置
  6. hexo图片展示-blog图床迁移至七牛云
  7. 互联网晚报 | 07月02日 星期六 | ​​​北京健康宝核酸检测天数计算规则调整;​上海鼓励用人单位吸纳失业3个月及以上人员...
  8. RuntimeError: Trying to backward through the graph a second time (or directly access saved tensors a
  9. SPSS数据文件读取
  10. USB Type-C 转音频+快充方案简介