前言: iOS 9 发布之后,推出NetworkExtension, 它可给系统WiFi列表列表里边的WiFi设置密码 、标签(副标题)。 还可获取整个WiFi列表。
首先你得向苹果申请一个权限,人家允许你使用了,你再在工程里面配置一下,这样你才可以使用.苹果会给你发个问卷调查,根据你自己的情况填写.这儿谢谢我初中学霸,专业的英语翻译果然6.
1-1.框架申请链接:https://developer.apple.com/contact/network-extension

根据自己的实际情况填写.里面有个产品介绍,最好找个英文好的...
1-2 调查表填写完成后,大概过了2 ,3小时,苹果会回复给你一封邮件,并且返回给你一个fllowup.(注意,这并不是代表你已经申请成功了,邮件里面只是确认你填写的问卷信息!)

1-3 接下来,就只能等了.逛苹果论坛,据说要等三星期,可是,我TM等了5星期是什么鬼.所以当超过三星期的时候我也没闲着,打电话 :4006701855 , 虽然得到的回复还是等...
而且,值得一提的是:有人遇见过这种情况,一直没有收到苹果拒绝或者同意的邮件.但是可以使用这个类.所以当超过3星期以后,我是每天都登录到开发者账号 配置描述文件,如果发现这儿多了一个选项.如下图,这也说明你申请成功了

1-5 所以呢,打了两次电话,重发了5 ,6 次邮件之后,大概苹果也觉得不好意思了吧,终于通过了.此时你会收到这也一封邮件:

恭喜您,通过了.但是不得不说,这只成功了一小半.后面你可能遇见更痛苦的事情.
2下面就来来说更痛苦的事情.
2-1 配置工程
a .新建一个App ID.

b. 添加iCloud 和Wireless Accessory

c.新建iCloud Containers

d.打开刚刚创建的App ID 发现这个是黄色的,下面就要编辑这个App ID

e

f

g 配置App ID完成

2-2 配置描述文件 .


配置好这个之后,可以到苹果提供的检测环境检测一下配置文件的正确性
附上网址 :https://forums.developer.apple.com/message/75928#75928
这一步很重要:就是检测你的工程配置的描述文件和这个账号使用权限是否对等.后面有小伙伴遇到一个bug就是ruternType一直返回NO,获取不到wifi列表,然后通过上面验证发现,证书的权限和申请使用的权限不相同.
所以这儿有个建议,如果发现获取列表时返回值是NO,把测试证书删掉,重新创建.然后再走一遍上面的流程.(我遇到的BUG奇怪的很,对着英文文档走了好几遍,确定文件没什么问题,就是返回值一直都是NO,后来,在创建iCoud的时候,把那个id改成和App ID不一样,就是按照他下面的要求创建,就奇怪的好了.)
注意 :创建完描述文件别忘了安装到Xcode,直接下载,完了双击就ok了.
3.配置Xcode工程了;
3-1 配置plist文件 (允许后台运行)
通过xml添加
<key>UIBackgroundModes</key>
<array>
<string>network-authentication</string>
</array>


3-2 targets->Capabilities->iCloud 和Wireless-Accessory-Configuration


配置完上面两个你就会发现工程左边会多了一个.entitlements结尾的文件.
然后还要向这个文件里面添加一个BOOL值为YES的字段 com.apple.developer.networking.HotspotHelper

3-3 Tagarts-->Build Settings -> code Signing

3-4 上代码 (也是蛮辛苦的)
Register a Hotspot Helper
+ (BOOL)registerWithOptions:(NSDictionary*)options queue:(dispatch_queue_t)queue handler:(NEHotspotHelperHandler)handler
@param options
kNEHotspotHelperOptionDisplayName :WIFI的注释tag字符串// 此处设置的内容会在WiFi列表中每个WiFi下边展示出来
@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 对应当前关联的WiFi网络NEHotspotNetwork
@return 注销命令已成功进入队列YES, 否则NO.
@discussion 调用此方法使kNEHotspotHelperCommandTypeLogoff型的NEHotspotHelperCommand向应用程序发出的“handler”模块 网络参数必须符合当前关联的WiFi网络,即它必须来自对NEHotspotHelperCommand网络属性或方法supportedInterfaces
+ (NSArray *)supportedNetworkInterfaces
@return 如果没有网络接口被管理,返回nil。否则,返回NEHotspotNetwork对象数组。
@discussion 每个网络接口由NEHotspotNetwork对象表示。当前返回的数组包含一个NEHotspotNetwork对象代表Wi-Fi接口。
这种方法的主要目的是当没有得到一个命令来处理它时,让一个热点助手偶尔提供在UI里其准确的状态。 此方法加上NEHotspotNetwork的isChosenHelper方法允许应用程序知道它是否是当前处理的网络。
//最后奉上我的实现代码,获取wifi列表,并给指定ssid做标记;
+(void)getWifiList{
NSMutableDictionary* options = [[NSMutableDictionary alloc] init];
[options setObject:@"🔑😀新网程-点我上网😀🔑" 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);
}
注意 :运行一遍,然后需要打开系统设置连wifi界面,才能在控制台查看打印信息的.
下面附上两张效果图:


最后附上一个Network Extension 使用的难兄(福)难(利)弟群(群里很多都已经实现了这个功能)----585640621
最后推荐一个技术交流群,里面大神很多! 529043462
QQ1 :2806539826
QQ2 :576484150
demo已上传到gitHub上 :https://github.com/chengkunlun/FirstRePository
参考文档:http://blog.csdn.net/qinxianjun163/article/details/51583057
网友评论
If you are requesting an entitlement for Hotspot Helper APIs, please make sure you have submitted your request using the online web form.
Regards,
Developer Technical Support
Apple Worldwide Developer Relations
2016.11苹果对该框架已经不需要申请审核了,
那么还需要这些配置吗?
If you are requesting an entitlement for Hotspot Helper APIs your request will be addressed at our earliest convenience.
Regards,
Developer Technical Support
Apple Worldwide Developer Relations
谢谢你的请求信息网络扩展框架。2016年11月10日,请注意,这个过程不需要开发人员希望使用应用程序代理,内容过滤,或者包隧道api。使用这些服务,请导航到你的开发者账户< https://developer.apple.com/account/ >并选择网络扩展能力你将使用你的应用程序ID。
上面是写完调查问卷给我的回复,现在这个功能放开了吗还是说这个答复是错误的,回答的不是我想要的。请楼主帮我一下
的呢?