iOS WIFI

一、公共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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

+ (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. 获取网卡信息


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

- (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,以下为测试的域名:


1

2

3

4

5

6

www.appleiphonecell.com

captive.apple.com

www.itools.info

www.ibook.info

www.airport.us

www.thinkdifferent.us

对应的IP地址:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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,方法如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

- (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的办法来处理大部分需求。

时间: 2024-08-26 16:12:27

iOS WIFI的相关文章

Wifi 定位原理及 iOS Wifi 列表获取

Wifi 定位原理及 iOS Wifi 列表获取 对于大家来说,Wifi 应该是一个很熟悉的词了,我们每天都可能在使用 Wifi 热点.Wifi 除了能给我们提供热点之外同时还有定位的作用, 现在移动设备的对用户的隐私保护是越来越严格了,就如定位功能,必须要经过设备用户的授权才能使用 Location 给这台设备定位.这些严格的隐私政策对用户起到到保护作用,但对开发人员却是一种阻碍,在产品强需求的情况下用户是会授权的,如地图类应用,但是另外一些没有对定位强需求的产品,用户可能就不会给你授权了,这

iOS wifi上传文件

利用Wi-Fi从pc端上传文件到iOS设备上 首先,从Github下载cocoa-web-resource: pc浏览器运行的效果: 代码中如果不想端口为大家所熟知的,可以随机生产一个端口号,在代码的操作很简单,只要在CocoaWebResourceViewController.m文件中注释[httpServer setPort:8080];这一行代码,以后开启server就是一个随机的端口号. cocoa-web-resource能进行上传各种文件,美中不足的是当上传一个大一点的文件,在pc的

iOS开发中WiFi相关功能总结

1.Ping域名.Ping某IP 有时候可能会遇到ping 某个域名或者ip通不通,再做下一步操作.这里的ping与传统的做get或者post请求还是有很大区别的.比如我们连接了某个WiFi,测试ping www.baidu.com,如果能ping 通,基本可以断定可以上网了,但是如果我们做了一个get 请求(url 是www.baidu.com),路由器可能重定向这个WiFi内的某网页了,依然没有错误返回,就会误认为可以正常上网. 这里有关于ping命令的详细解释:百度百科Ping iOS中想

WiFi万能钥匙iOS版常见问题答疑

1.为什么重复安装描述文件,还是无法联网? WiFi万能钥匙iOS版通过安装描述文件来实现联网,一个描述文件只需安装一次,无需重复安装,如成功安装后没有成功联网,有可能是Mac地址被限,请换个显示蓝色钥匙的热点进行连接.连接新的蓝色钥匙热点,仍需安装此热点的描述文件. 2.安装描述文件时为什么需要输入密码? iOS设备要求在安装任何应用时,需要输入手机锁屏密码再次确认,请输入手机锁屏密码即可. 3.为什么描述文件显示未签名? 连接任何一个新的WiFi热点都需要安装描述文件,描述文件未签名不影响连

iOS客户端de公共WIFI解决方案

一.公共WIFI综述 现在很多公司都在做免费WIFI,车站.公交.地铁.餐厅,只要是人员密集流动的地方就有WIFI,免费WIFI从最初的网页认证方式也逐渐向客户端认证方式偏移.本文主要讨论iOS认证上网的解决方案. iOS端WIFI应用的相关开发,主要存在以下问题: iOS系统WIFI相关的接口很少,大部分接口都是私有接口 在设备连接上WIFI,没有通过路由器认证前,如果关闭iOS自动弹出的Portal页面,iPhone的WIFI会自动断开 如何禁止iOS系统自动弹Portal页面 公共WIFI

IOS客户端公共WIFI解决方案

一.公共WIFI综述 现在很多公司都在做免费WIFI,车站.公交.地铁.餐厅,只要是人员密集流动的地方就有WIFI,免费WIFI从最初的网页认证方式也逐渐向客户端认证方式偏移.本文主要讨论IOS认证上网的解决方案.IOS端WIFI应用的相关开发,主要存在以下问题 1.IOS系统WIFI相关的接口很少,大部分接口都是私有接口 2.在设备连接上WIFI,没有通过路由器认证前,如果关闭IOS自动弹出的Portal页面,Iphone的WIFI会自动断开 3.如何禁止IOS系统自动弹Portal页面 4.

【iOS与EV3混合机器人编程系列之四】iOS_WiFi_EV3_Library 剖析之中的一个:WiFi UDP和TCP

在上一篇文章中.我们通过编写EV3 Port Viewer项目实现了iOS监測EV3的实时端口数据. 程序最核心的部分就是我们的开源码库iOS_WiFi_EV3_Library. 那么,在本文中,我们将具体介绍我们这个库的编写.为了完毕这个库,本人參考了网上许多资料,主要包括EV3的源码,win版本号的代码库以及Monobrick相关以及网上的各种资料,在此就不一一列举了. 因为水平有限,本代码库还存在各种问题,望使用的读者见谅. 大家也能够在这个基础之上自己进行改造完好. 为了具体说明代码库的

iOS 获取 WiFi 列表

IOS 获取 WIFi列表有2016 /11 / 10 之后就不用申请权限了  Apple 官方邮件回复: Thank you for requesting information about the Network Extension framework. Please note that as of November 10, 2016 this process is not required for developers who wish to use App Proxy, Content

iOS中使用 Reachability 检测网络区分手机网络类型 WiFi 和2 3 4 G

如果你想在iOS程序中提供一仅在wifi网络下使用(Reeder),或者在没有网络状态下提供离线模式(Evernote).那么你会使用到Reachability来实现网络检测. 写本文的目的 了解Reachability都能做什么 检测3中网络环境 2G/3G wifi 无网络 如何使用通知 单个controller 多个controller 简单的功能: 仅在wifi下使用 Reachability简介 Reachablity 是一个iOS下检测,iOS设备网络环境用的库. 监视目标网络是否可