博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 无法获取 WiFi 列表?一定是因为你不知道这个框架
阅读量:5909 次
发布时间:2019-06-19

本文共 3754 字,大约阅读时间需要 12 分钟。

2017-03-09 | EyreFree | iOS

概述

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

Demo 地址:

一. 注意事项

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

二. 创建 App ID

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

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

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

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

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

三. 创建 Provisioning Profile

找到 Provisioning Profiles 选项,点击右上角按钮创建一个 Provisioning Profile 用于接下来创建示例工程,地址为: ,如图所示:

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

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

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

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

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

点击 Download 将它下载到本地:

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

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

四. 创建工程

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

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

代码如下:

UIBackgroundModes
network-authentication
复制代码

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

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

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

代码如下:

com.apple.developer.networking.HotspotHelper
复制代码

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

五. 核心代码

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

#import 
复制代码

然后使用如下代码即可将 WiFi 列表信息打印到 XCode 控制台,注意:这里需要打开系统 设置 中的 无线局域网 页面才能获取相关信息,因为打开该页面系统刷新 WiFi 信息时才会触发该回调:

- (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 并完成相应配置后体验:

七. 备注

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


本文链接:

如有任何知识产权、版权问题或理论错误,还请指正。

转载请注明原作者及以上信息。

你可能感兴趣的文章
kafka 监控之Mx4jLoader
查看>>
wireshark windows 编译
查看>>
XBImageFilters
查看>>
chpter11~函数和函数式编程
查看>>
Hadoop之HDFS的常用命令
查看>>
分布式系统架构解决方案之Dubbo(三)--Dubbo管理端 和 Dubbo综合案例
查看>>
The function getUserId must be used with...解决办法
查看>>
懂得保持平衡的程序员
查看>>
Class yii\base\View
查看>>
服务器RAID磁盘坏道修复实战
查看>>
我的友情链接
查看>>
程序运行的原理
查看>>
我的友情链接
查看>>
给Extjs2.x GridPanel添加goup系方法
查看>>
NFS搭建
查看>>
Universal-USB-Installer、UItralSO、LinuxLive USB Creator U盘安装linux实战
查看>>
使用Unirest发送Json的格式数据
查看>>
亚洲诚信&华为云 | 双11钜惠提前来袭,错过等一年!
查看>>
目前所学的关键字整理
查看>>
当DUBBO遇上Arthas - 排查问题的实践
查看>>