iOS Wifi 列表获取

iOS 上获取 Wifi 列表其实有很大限制,在 iOS 9 以前是不能获取Wifi列表的,只能获取当前连接的 Wifi 信息,也就表示只有连接了 Wifi 才能确定位置。
Apple 在 iOS 9 以后,提供了获取Wifi列表的API,但是获取Wifi列表是有门槛的,主要步骤有:


  1. 向 Apple 申请开发 Network Extension 权限
  2. 申请包含 Network Extension 的描述文件
  3. 配置 Info.plist
  4. 配置 entitlements
  5. iOS 获取 Wifi 列表代码实现
  6. 获取Wifi列表回调

向 Apple 申请开发 Network Extension 权限

首先要先写封邮件给 [email protected] ,问苹果要开发 Network Extension 的权限。 苹果收到邮件后会自动回复邮件,在 https://developer.apple.com/contact/network-extension/ 里面填写申请表格,内容包括:

Organization:               

Company / Product URL:             

What's your product's target market?              

What's your company's primary function?             

Describe your application and how it will use the Network Extension framework.            

What type of entitlement are you requesting?                     

...

申请后大概两周左右能收到 Aplle的 确认信,如:

Hi, 

Thanks for your interest in the Network Extension APIs.

We added a new template containing the Network Extension entitlements to your team.

......

申请包含 Network Extension 的描述文件

选择包含 Network Extension 的描述文件,后点击下载,下载完成双击描述文件。

xcode中开启Network Extensions权限

iOS Wifi 列表获取_第1张图片

配置 entitlements

xxx.entitlements(xxx是项目名称) 里添加 Key-Value: com.apple.developer.networking.HotspotHelper -> YES,没有此文件需要先创建一个:
在这里插入图片描述

iOS 获取 Wifi 列表代码实现

#import <NetworkExtension/NetworkExtension.h>
- (void)getWifiList {

    if (![[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) {return;}
    dispatch_queue_t queue = dispatch_queue_create("com.leopardpan.HotspotHelper", 0);
    [NEHotspotHelper registerWithOptions:nil queue:queue handler: ^(NEHotspotHelperCommand * cmd) {
        if(cmd.commandType == kNEHotspotHelperCommandTypeFilterScanList) {
            for (NEHotspotNetwork* network  in cmd.networkList) {
                NSLog(@"network.SSID = %@",network.SSID);
            }
        }
    }];
}

kNEHotspotHelperCommandTypeFilterScanList: 表示扫描到 Wifi 列表信息。

NEHotspotNetwork 里有如下信息:


SSID:Wifi 名称
BSSID:站点的 MAC 地址
signalStrength: Wifi信号强度,该值在0.0-1.0之间
secure:网络是否安全 (不需要密码的 Wifi,该值为 false)
autoJoined: 设备是否自动连接该 Wifi,目前测试自动连接以前连过的 Wifi 的也为 false 。
justJoined:网络是否刚刚加入
chosenHelper:HotspotHelper是否为网络的所选助手


获取Wifi列表回调

当你把上面的代码写完,并成功运行项目后,发现并没有Wifi列表的回调。因为你还没刷新Wifi列表,你需要:

打开手机系统设置 -> WLAN -> 系统 Wifi 列表加载出来时,上面代码部分才会回调,才能获取到 Wifi 列表。
这个时候你就能看到控制台源源不断的Log。

注意事项

1、获取Wifi列表功能由于是需要申请后台权限,所以能后台激活App(应用程序),而且激活后App的进程能存活几个小时。
2、整个获取Wifi列表不需要App用户授权,也就是在App用户无感知下获取设备的Wifi列表信息,使用时请正当使用。
3、Wifi列表获取 NetworkExtension 是 iOS 9以后才出的,目前 iOS 9 已经覆盖很广了。

你可能感兴趣的:(iOS)