iOS 利用 NEHotspotHelper 获取 WiFi 列表

原创 2017年03月09日 20:54:28

iOS 9 发布之后,苹果推出了 NetworkExtension,利用这个框架可以实现很多和网络相关的操作。本文主要介绍怎样使用其中的 NEHotspotHelper 进行设备 WiFi 列表的获取。

Demo 地址:https://github.com/EyreFree/EFNEHotspotHelperDemo

一. 注意事项

  1. 首先,NEHotspotHelper 只在 iOS 9 及以上版本得到支持,之前版本的 iOS 并不支持该功能;
  2. 然后,你需要有一个开发者账号;
  3. 最后,该框架目前还没有大规模开放使用,所以需要向苹果发送申请并且审核通过才能够获得使用该框架的权限,大致内容就是描述一下你需要使用该框架的原因之类的,然后我是用的英文进行描述(感谢百度以及谷歌翻译),不过据说中文也行。提交申请后大概一周内会收到反馈邮件,申请地址为: https://developer.apple.com/contact/network-extension/

二. 创建 App ID

打开苹果开发者中心,登陆然后找到 App IDs 选项,点击右上角按钮创建一个 App ID 用于接下来创建 Provisioning Profile,地址为: https://developer.apple.com/account/ios/identifier/bundle/ ,如图所示:

创建 App ID

首先,填写 Name 以及 Bundle ID,这里统一填写为 EFNEHotspotHelperDemo,如图所示:

填写 Name

填写 Bundle ID

接下来这一步注意需要勾选 Wireless Accessory Configuration 这一选项,如图所示:

勾选 Wireless Accessory Configuration

然后观察到如图所示状态表明已成功打开:

状态显示

在 App IDs 列表中查看刚创建完成的 App ID:

App IDs 列表

三. 创建 Provisioning Profile

找到 Provisioning Profiles 选项,点击右上角按钮创建一个 Provisioning Profile 用于接下来创建示例工程,地址为: https://developer.apple.com/account/ios/profile/ ,如图所示:

创建 Provisioning Profile

首先选择 Profile 类型,这里我选择的是 iOS App Development,可以根据自己的具体需要自由选择:

选择 Profile 类型

接下来选择我们在第二步创建好的 App ID,如图所示:

选择 App ID

然后选择证书和设备,全选即可:

选择证书

选择设备

在额外权限这一步需要选中我们申请到的 Network Extension 权限,可以看到其中包含我们需要使用的 NEHotspotHelper 权限,如图所示:

选中 Network Extension 权限

填写完 Profile Name 之后,即可成功创建我们需要的 Profile:

填写 Profile Name

点击 Download 将它下载到本地:

下载 Profile

双击打开,即可将 Profile 添加到本机:

添加 Profile

可以到 XCode 的账户设置里查看已安装的 Profile,若未安装成功可以尝试点击 Action 中的 Download 按钮重新下载:

查看已安装的 Profile

四. 创建工程

接下来我们创建一个示例工程,演示如何获取 WiFi 列表。首先,将 Bundle ID 改为之前设置的 EFNEHotspotHelperDemo:

修改 Bundle ID

然后在 Info.plist 中添加后台模式权限数组:

添加后台模式代码

代码如下:

<key>UIBackgroundModes</key>
<array>
    <string>network-authentication</string>
</array>

添加完成后可以在 Target -> Capabilities 中看到后台模式已处于开启状态:

后台模式已开启

接下来在 Capabilities 找到 Wireless Accessory Configuration 并将其打开:

打开 Wireless Accessory Configuration

在工程中找到后缀为 {工程名}.entitlements 的文件 EFNEHotspotHelperDemo.entitlements,在其中加入 HotspotHelper 权限代码:

添加 HotspotHelper 权限代码

代码如下:

<key>com.apple.developer.networking.HotspotHelper</key>
<true/>

好了,到这里已经完成了各种乱七八糟的配置工作,可以尝试进行 Build。如果没有提示错误信息的话,接下来就可以愉快地使用 HotspotHelper 了;如果有问题的话,请检查之前的步骤是否都已正确完成或者根据错误信息修改具体项目。

五. 核心代码

首先,在需要使用 HotspotHelper 的地方添加头文件引用,这里以 Objective-C 代码为例:

#import <NetworkExtension/NetworkExtension.h>

然后使用如下代码即可将 WiFi 列表信息打印到 XCode 控制台,注意:这里需要打开系统 设置 中的 无线局域网 页面才可以触发回调:

- (void)scanWifiInfos{
    NSLog(@"1.Start");

    NSMutableDictionary* options = [[NSMutableDictionary alloc] init];
    [options setObject:@"EFNEHotspotHelperDemo" forKey: kNEHotspotHelperOptionDisplayName];
    dispatch_queue_t queue = dispatch_queue_create("EFNEHotspotHelperDemo", NULL);

    NSLog(@"2.Try");
    BOOL returnType = [NEHotspotHelper registerWithOptions: options queue: queue handler: ^(NEHotspotHelperCommand * cmd) {

        NSLog(@"4.Finish");
        NEHotspotNetwork* network;
        if (cmd.commandType == kNEHotspotHelperCommandTypeEvaluate || cmd.commandType == kNEHotspotHelperCommandTypeFilterScanList) {
            // 遍历 WiFi 列表,打印基本信息
            for (network in cmd.networkList) {
                NSString* wifiInfoString = [[NSString alloc] initWithFormat: @"---------------------------\nSSID: %@\nMac地址: %@\n信号强度: %f\nCommandType:%ld\n---------------------------\n\n", network.SSID, network.BSSID, network.signalStrength, (long)cmd.commandType];
                NSLog(@"%@", wifiInfoString);

                // 检测到指定 WiFi 可设定密码直接连接
                if ([network.SSID isEqualToString: @"测试 WiFi"]) {
                    [network setConfidence: kNEHotspotHelperConfidenceHigh];
                    [network setPassword: @"123456789"];
                    NEHotspotHelperResponse *response = [cmd createResponse: kNEHotspotHelperResultSuccess];
                    NSLog(@"Response CMD: %@", response);
                    [response setNetworkList: @[network]];
                    [response setNetwork: network];
                    [response deliver];
                }
            }
        }
    }];

    // 注册成功 returnType 会返回一个 Yes 值,否则 No
    NSLog(@"3.Result: %@", returnType == YES ? @"Yes" : @"No");
}

六. 演示

唔,Demo 运行效果如下,点击 Open WiFi Setting 按钮可直接打开 无线局域网 页面:

运行效果

具体可尝试下载 Demo 并完成相应配置后体验:https://github.com/EyreFree/EFNEHotspotHelperDemo

七. 备注

参考以下资料完成本 Demo,在此表示感谢:

IOS NetworkExtension 框架使用笔记
iOS NEHotspotHelper使用
iOS-NetworkExtension-NEHotspotHelper
API Reference - NetworkExtension


本文链接:http://www.jianshu.com/p/14da35d0b74b

ios9 获取app 获取wifi列表,wifi添加副标题

使用之前先到这里看申请方法https://forums.developer.apple.com/message/30657#30657,申请成功后就可以使用这个框架NetworkExtension ...
  • huangmindong
  • huangmindong
  • 2016年06月03日 16:15
  • 7112

iOS 获取系统wifi列表,wifi信号强度,并给wifi设置密码,标签(副标题)

最近公司社区项目中要用到或者社区周围WiFi列表以及信号强度,好多网友说实现不了讨论区相关资源:APP跳转 及iOS10跳转在设置页面Wifi 定位原理及 iOS Wifi 列表获取iOS 获取系统w...
  • ws1352864983
  • ws1352864983
  • 2017年06月20日 10:53
  • 1159

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

Wifi 定位原理及 iOS Wifi 列表获取   对于大家来说,Wifi 应该是一个很熟悉的词了,我们每天都可能在使用 Wifi 热点。Wifi 除了能给我们提供热点之外同时还有定位的作用,...
  • st646889325
  • st646889325
  • 2018年01月15日 16:37
  • 60

iOS私有API之wifi扫描和wifi连接

原文:http://www.douban.com/note/293551961/ 公开的api 如果只是想获取已连接的wifi信息。apple已经有公开的api可以使用. 首...
  • loongwong2011
  • loongwong2011
  • 2015年08月07日 10:00
  • 2152

android开发-获取wifi列表

最近博主在学frangment框架,因此想着想着就想通过listfragment完成对wifi列表的获取。 好!现在就不说废话了。 一.wifi的基础知识 在Android的官方文档中定义了如下五...
  • smilecjw
  • smilecjw
  • 2016年04月13日 17:42
  • 11215

Android连续获取当前所连接WiFi及周围热点列表信息的解决方案

Android开发中wifi信息持续获取是比较基础的部分,为方便自己以后回顾,特此记下。...
  • Android_bing
  • Android_bing
  • 2017年07月26日 12:01
  • 1578

Android wifi属性简介 及 wifi信息获取(wifi列表、配置信息、热点信息),androidwifi

Android wifi属性简介 及 wifi信息获取(wifi列表、配置信息、热点信息),androidwifi Android wifi对象属性及简易Demo  本章介绍Android开发...
  • qq_29721419
  • qq_29721419
  • 2016年11月18日 19:32
  • 1069

iOS 扫描wifi热点那些事儿

源码地址:     https://github.com/devinshively/wifiAssociate 扫描wifi信息的参考资料:http://code.google.com/p/uw...
  • daiyelang
  • daiyelang
  • 2013年11月28日 16:14
  • 4986

Android系统6.0获取WiFi列表为空的问题

最近做的一个功能中涉及到了网络定位,当前采取的方案是利用谷歌提供的Google Maps Geolocation API实现,其中需要我们提供用户当前的基站列表+wifi列表。然后问题就来了,最后发现...
  • u011484134
  • u011484134
  • 2016年10月16日 18:12
  • 4029

iOS获取当前所连接的WIFI名称

由于苹果是闭源的,所以我们不能像安卓那样对一些东西进行操作,比如WIFI,通过使用一些私有的API并在越狱的iPhone上面或许你能够实现那些功能,但是这样做有很大的局限性:1.私有API苹果审核不会...
  • u011118092
  • u011118092
  • 2016年09月21日 15:01
  • 727
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS 利用 NEHotspotHelper 获取 WiFi 列表
举报原因:
原因补充:

(最多只允许输入30个字)