好久没有写博客了, 最近在做 iOSWIFi 开发的部分, 这里我们主要用到的 API 以及 FrameWork 有以下:
- NetworkExtension.framework
- NEHotspotHelper
一 申请
准备条件:
1 付费的开发者账号
2 公司的 webSite
3 明确你的 Wi-Fi 开发需求
申请步骤: 申请网址 填写申请的相关资料
根据你项目中的具体情况, 在相对应的地方打钩
上述表填写完毕之后, 发送之后, 没多久会受到一封邮件, 邮件的大致内容为
大致意思就是从 16 年 11 月 10 日开始 可以在开发者账户的 account 页面创建 APPID 的时候添加网络扩展
Note:NetWork Extensions 能做的有限, 可以获取 Wi-Fi 名字和 Mac 地址, 但是注册改变 Wi-Fi 设置页面子 title 设置密码 并可以进行连接 这仍需我们申请并获取 HotsPotHelperApi 的使用权限 过两周或者更久可以收到 Apple 回复的是否通过的 Email, 如果失败了不要气馁, 据很多小伙伴反应, 比追姑娘都要麻烦
二 使用
在这里我就不多加赘述, Wi-Fi 开发的相关资料虽然很少, 但是申请成功后, 如何在项目中配置, 这部分的文章网上有很多, 具体配置给你们推荐两篇文章好吧
iOS 无法获取 Wi-Fi 列表? 一定是因为你不知道这个框架
iOS 获取系统 Wi-Fi 列表, Wi-Fi 信号强度, 并给 Wi-Fi 设置密码, 标签(副标题) http://www.jianshu.com/p/5072a8485ceb
NEHotspotHelpers 使用 - 官网文档
一些相关属性
SSID:Wi-Fi 名称
BSSID: 站点的 Mac 地址
signalStrength: Wi-Fi 信号强度, 该值在 0.0-1.0 之间
secure: 网络是否安全 (不需要密码的 Wi-Fi, 该值为 false)
autoJoined: 设备是否自动连接该 Wi-Fi, 目前测试自动连接以前连过的 Wi-Fi 的也为 false
justJoined: 网络是否刚刚加入
chosenHelper:HotspotHelper 是否为网络的所选助手
部分使用代码
- Register a Hotspot Helper
- + (BOOL)registerWithOptions:(NSDictionary*)options queue:(dispatch_queue_t)queue handler:(NEHotspotHelperHandler)handler
- @param options
kNEHotspotHelperOptionDisplayName :Wi-Fi 的注释 tag 字符串 // 此处设置的内容会在 Wi-Fi 列表中每个 Wi-Fi 下边展示出来
@param queue dispatch_queue_t 用来调用 handle 的 block
@param handler NEHotspotHelperHandler block 用于执行处理 helper commands.
@return 注册成功 YES, 否则 NO.
@discussion 一旦这个 API 调用成功, 应用程序有资格在后台启动, 并参与各种热点相关的功能. 当应用程序启动此方法应该调用一次. 再次调用它不会产生影响, 并返回 NO.
这个方法是主要的.
+ (BOOL)logoff:(NEHotspotNetwork *)network
@param network 对应当前关联的 Wi-Fi 网络 NEHotspotNetwork
@return 注销命令已成功进入队列 YES, 否则 NO.
@discussion 调用此方法使 kNEHotspotHelperCommandTypeLogoff 型的 NEHotspotHelperCommand 向应用程序发出的 "handler" 模块 网络参数必须符合当前关联的 Wi-Fi 网络, 即它必须来自对 NEHotspotHelperCommand 网络属性或方法 supportedInterfaces
+ (NSArray *)supportedNetworkInterfaces
@return 如果没有网络接口被管理, 返回 nil. 否则, 返回 NEHotspotNetwork 对象数组.
@discussion 每个网络接口由 NEHotspotNetwork 对象表示. 当前返回的数组包含一个 NEHotspotNetwork 对象代表 Wi-Fi 接口.
这种方法的主要目的是当没有得到一个命令来处理它时, 让一个热点助手偶尔提供在 UI 里其准确的状态. 此方法加上 NEHotspotNetwork 的 isChosenHelper 方法允许应用程序知道它是否是当前处理的网络.
获取 Wi-Fi 列表, 并给系统设置页面 Wi-Fi 设置子标题 可以获得 Wi-Fi 名称, 信号强度, Mac 地址等等
- +(void)getWifiList{
- NSMutableDictionary* options = [[NSMutableDictionary alloc] init];
- [options setObject:@"Wifi 子标题" forKey:kNEHotspotHelperOptionDisplayName];
- dispatch_queue_t queue = dispatch_queue_create("com.pronetwayXY", NULL);
- BOOL returnType = [NEHotspotHelper registerWithOptions:options queue:queue handler: ^(NEHotspotHelperCommand * cmd) {
- NEHotspotNetwork* network;
- NSLog(@"COMMAND TYPE: %ld", (long)cmd.commandType);
- [cmd createResponse:kNEHotspotHelperResultAuthenticationRequired];
- if (cmd.commandType == kNEHotspotHelperCommandTypeEvaluate || cmd.commandType ==kNEHotspotHelperCommandTypeFilterScanList) {
- NSLog(@"WIFILIST: %@", cmd.networkList);
- for (network in cmd.networkList) {
- // NSLog(@"COMMAND TYPE After: %ld", (long)cmd.commandType);
- if ([network.SSID isEqualToString:@"ssid"]|| [network.SSID isEqualToString:@"proict_test"]) {
- double signalStrength = network.signalStrength;
- NSLog(@"Signal Strength: %f", signalStrength);
- [network setConfidence:kNEHotspotHelperConfidenceHigh];
- [network setPassword:@"password"];
- NEHotspotHelperResponse *response = [cmd createResponse:kNEHotspotHelperResultSuccess];
- NSLog(@"Response CMD %@", response);
- [response setNetworkList:@[network]];
- [response setNetwork:network];
- [response deliver];
- }
- }
- }
- }];
- NSLog(@"result :%d", returnType);
- NSArray *array = [NEHotspotHelper supportedNetworkInterfaces];
- NSLog(@"wifiArray:%@", array);
- NEHotspotNetwork *connectedNetwork = [array lastObject];
- NSLog(@"supported Network Interface: %@", connectedNetwork);
- }
三 思考
1 必须进入到系统 Wi-Fi 设置页面才可以获取到 Wi-Fi 列表 (包括强度 Wi-Fi 名称) 参考 Wi-Fi 万能助手 可能都是通过 LBS 一些方法告诉你附近可能存在的 Wi-Fi, 然后通过点击推荐的 Wi-Fi 进入下一步
2 点击上方任意一个可能存在的 Wi-Fi, 因为 Apple 政策原因 无法再 App 内直接连接 Wi-Fi!!! 所以万能钥匙的策略是 如下图, 提供你个连接教程, 将可以连接的 Wi-Fi 名称进行更改, 在下方加上提示文字 比如 万能 Wi-Fi - 点击一键上网 
通过这样的方式进行连接
这里万能钥匙的做法是帮助用户跳到 Wi-Fi 系统设置页面, 市面上还有很多需要用户自己手动进入 Wi-Fi 设置页面的 App, 比如 360 免费 Wi-Fi, 这样虽然牺牲了一部分用户体验, 但是在审核方面可以通过率大大增加, 还是比较值得倡导的
3 不能主动通过代码的方式断开 Wi-Fi 比如 有一个按钮叫做断开 Wi-Fi 这样是不允许的 只能通过用户手动关闭 Wi-Fi 或者 Wi-Fi 本身无法连接网络只能通过判断当前网络状态的方式进行连接
四 总结
iOS Wi-Fi 开发相关资料较少, Apple 对这方面的审核也较为严格 希望这篇文章可以帮助到正在做 Wi-Fi 开发相关的小伙伴们, 加油!