iOS 9 发布之后,苹果推出了 NetworkExtension,利用这个框架可以实现很多和网络相关的操作。本文主要介绍怎样使用其中的 NEHotspotHelper 进行设备 WiFi 列表的获取。如果你只是想获取当前设备正在连接的 WiFi 信息,有更加便捷的方法,可参考我的另一篇文章:iOS 获取当前已连接 WiFi 信息。

Demo 地址:github.com/EyreFree/EF…

一. 注意事项

  1. 首先,NEHotspotHelper 只在 iOS 9 及以上版本得到支持,之前版本的 iOS 并不支持该功能;
  2. 然后,你需要有一个开发者账号;
  3. 最后,该框架目前还没有大规模开放使用,所以需要向苹果发送申请并且审核通过才能够获得使用该框架的权限,大致内容就是描述一下你需要使用该框架的原因之类的,然后我是用的英文进行描述(感谢百度以及谷歌翻译),不过据说中文也行。提交申请后大概一周内会收到反馈邮件,申请地址为: developer.apple.com/contact/net… 。
  4. 我申请的时候就描述了一个 VPN 应用的大概功能就给过了,具体流程见 Network Extension 申请表格填写及邮件往来 这篇博文;
  5. 如果如果已知 SSID 及密码的情况下,可以直接调用 NEHotspotConfigurationManager API 来进行 WiFi 连接,不需要向苹果申请 NEHotspotHelper 权限,不过需要注意的是该方法仅在 iOS 11 及以上系统有效,可参考 iOS NEHotspotConfigurationManager 使用 一文。

二. 创建 App ID

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

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

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

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

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

三. 创建 Provisioning Profile

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

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

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

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

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

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

点击 Download 将它下载到本地:

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

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

四. 创建工程

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

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

代码如下:

<key>UIBackgroundModes</key>
<array><string>network-authentication</string>
</array>
复制代码

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

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

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

代码如下:

<key>com.apple.developer.networking.HotspotHelper</key>
<true/>
复制代码

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

五. 核心代码

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

#import <NetworkExtension/NetworkExtension.h>
复制代码

然后使用如下代码即可将 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 值,否则 NoNSLog(@"3.Result: %@", returnType == YES ? @"Yes" : @"No");
}
复制代码

六. 演示

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

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

七. 备注

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

iOS 9.0 搜索附近Wi-Fi热点 IOS NetworkExtension 框架使用笔记 iOS NEHotspotHelper使用 iOS-NetworkExtension-NEHotspotHelper API Reference - NetworkExtension

八. 附录

Network Extension 申请表格填写及邮件往来


如有任何知识产权、版权问题或理论错误,还请指正。
https://juejin.im/post/5a3214cd51882506fd589047
转载请注明原作者及以上信息。

iOS 无法获取 WiFi 列表?一定是因为你不知道这个框架相关推荐

  1. iOS中获取WiFi的SSID(CNCopySupportedInterfaces())

    获取当前设备连接WiFi: ios5之前可以通过读取配置文件获取,ios5以后苹果修改wifi列表文件位置,只有root权限才可以读取. ios4:/System/Library/SystemConf ...

  2. H5获取wifi列表及当前wifi

    H5获取wifi列表及当前wifi <script type="text/javascript" src="./js/jquery.js">< ...

  3. java 获取wifi_获取wifi列表并连接wifi

    一.获取wifi列表 获取wifi列表需要用wifiManager.startScan();进行扫描,扫描结果的列表使用List 保存 扫描步骤: wifiManager.startScan(); / ...

  4. python获取WiFi列表,根据密码本穷举破解,Windows

    python获取WiFi列表,根据密码本穷举破解,Windows 后附密码本 结果还是看运气 不要过度以及违法使用 单次连接时间自由调整:我自己测试时1秒够了 #wifi连接时间 time.sleep ...

  5. Android7.0+ 获取WiFi列表以及连接WiFi

    获取WiFi列表并连接 这段时间项目中涉及到需要获取WiFi列表以及连接,在这里记录下 其中就有一个坑,在Android7.0以上还需要打开定位(也就是手机中"位置信息") Wif ...

  6. Android7.0华为Mate9开发获取WiFi列表失败

    关键代码 WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Contex ...

  7. android wifi动画显示,Android获取WiFi列表的正确用法

    最近有个需求,需要做一个获取WiFi列表的功能,也在网上找了一些资料,但有些资料是有问题的,然后经过自己的摸索,总结如下: 本地环境: Android Studio版本:3.0.1:DEMO APK ...

  8. android 获取wifi的加密类型,Android WIFI开发:获取wifi列表,连接指定wifi,获取wifi加密方式,监听wifi网络变化等...

    下面是 Android 开发中 WiFi 的常用配置,如:获取当前 WiFi ,扫描 WiFi 获取列表,连接指定 WiFi ,监听网络变化等等. 下面是效果图: GitHub 下载地址:https: ...

  9. 【IOS】获取wifi名称 (即SSID)

    iOS 获取wifi ssid 名称 SSID全称Service Set IDentifier, 即Wifi网络的公开名称.在IOS 4.1以上版本提供了公开的方法来获取该信息. 首先添加框架:Sys ...

最新文章

  1. pyqt怎么给字体加粗_微信拍一拍可设置后缀?怎么用?还有更多新功能!
  2. 单片机干嘛的?嵌入式是单片机吗?
  3. Shell 定时清理小脚本
  4. INADDR_ANY 最好的解释
  5. name 'false' is not defined
  6. python简单代码hello-[代码全屏查看]-python初学之helloworld
  7. 如何将已有mdf文件导入到SQL 2000 或者 SQL 2005
  8. 一步带你了解java程序逻辑控制
  9. Dominant Indices(CF 1009 F)
  10. SAP UI5 aggregation field type
  11. 自动调试自动编译五分钟上手
  12. netapp做内网穿透有问题
  13. ==与equal在java中应用的感悟
  14. 购物商城框架java_基于jsp的购物商城-JavaEE实现购物商城 - java项目源码
  15. Bootstrap 幻灯片效果
  16. jQuery 对象与Dom 对象互转
  17. qt插件开发框架搭建_Flutter框架之:开发环境搭建
  18. ROS学习笔记基础1(Ubuntu16.04安装ROS和依赖包)
  19. [T-ARA][놀아볼래?][要玩吗]
  20. Xcode5打包静态库

热门文章

  1. Zookeeper分布式锁的使用
  2. 解决element-ui table 表格排列错位问题
  3. vue使用@路径引入
  4. ZooKeeper入门(一)
  5. idea2020配置springboot热部署超全步骤以及安装JRebel插件
  6. 第二轮冲次会议第七次
  7. 提高JS性能注意事项(转载)
  8. 有关OCS监控软件安装在windows上, 服务端显示乱码的问题
  9. HttpURLConnection与 HttpClient 区别/性能测试对比
  10. XenApp6 建立请求的连接时出错解决方法