Wi-Fi

作者: 06f43b0b52f7 | 来源:发表于2017-08-14 18:25 被阅读48次

http://www.jianshu.com/p/5072a8485ceb

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

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

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

1-5 所以呢,打了两次电话,重发了5 ,6 次邮件之后,大概苹果也觉得不好意思了吧,终于通过了.此时你会收到这也一封邮件:
[图片上传中。。。(4)]通过邮件.png

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

b. 添加iCloud 和Wireless Accessory
[图片上传中。。。(6)]添加iCloud 和Wireless Accessory.png

c.新建iCloud Containers
[图片上传中。。。(7)]新建iCloud Containers.png

d.打开刚刚创建的App ID 发现这个是黄色的,下面就要编辑这个App ID
[图片上传中。。。(8)]编辑刚刚创建的AppID.png

e
[图片上传中。。。(9)]17407914-2B9F-42D2-9E21-7EBF50DF0FEC.png

f
[图片上传中。。。(10)]ABD85AAF-04C8-4FDD-B6E5-005D188980ED.png

g 配置App ID完成
[图片上传中。。。(11)]2DEACBF8-CB87-4CB0-A6B1-2E092DAD4369.png

2-2 配置描述文件 .
[图片上传中。。。(12)]注意选择新建的App ID

[图片上传中。。。(13)]注意这个值要加上.png

配置好这个之后,可以到苹果提供的检测环境检测一下配置文件的正确性附上网址 :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>
[图片上传中。。。(14)]通过xml方式添加.png

[图片上传中。。。(15)]添加完了会有这

3-2 targets->Capabilities->iCloud 和Wireless-Accessory-Configuration
[图片上传中。。。(16)],打开并配置icould

[图片上传中。。。(17)]打开Wireless-Accessory-Configuration.png

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

3-3 Tagarts-->Build Settings -> code Signing
[图片上传中。。。(19)]配置Build Settings

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界面,才能在控制台查看打印信息的.
下面附上两张效果图:
[图片上传中。。。(20)]系统的wifi列表.png

[图片上传中。。。(21)]修改系统wifi的标签

最后附上一个Network Extension 使用的难兄(福)难(利)弟群(群里很多都已经实现了这个功能)----585640621
最后推荐一个技术交流群,里面大神很多! 529043462QQ1 :2806539826QQ2 :576484150
demo已上传到gitHub上 :https://github.com/chengkunlun/FirstRePository
参考文档:http://blog.csdn.net/qinxianjun163/article/details/51583057

作者:少年_如他链接:http://www.jianshu.com/p/5072a8485ceb來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章

网友评论

      本文标题:Wi-Fi

      本文链接:https://www.haomeiwen.com/subject/rjxprxtx.html