iOS 9 NEHotspotHelper 的NetworkEx
iOS 9 发布之后,苹果对于WiFi这块废弃了CaptiveNetwork了这个类,不再推荐使用,同时推出NetworkExtension。最近把对这个类的研究以及心得体会写下来。 效果图如下,可以在指定的WiFi下设置自定义的文字。
首先,要想使用这个类需要向苹果("networkextension@apple.com")发邮件获取这个权限,这里不做具体详细说明,需要说明的一点是你必须说明你为什么要使用这个类,苹果会回复给你一个问卷文档,根据你的实际需求进行填写。网上说三周时间会给予回复,我们的公司可能回复的有点慢了。不过所幸最终通过了。
当你在邮件中看到这几行话说明你成功了!
Hi, Thanks for your interest in the Network Extension APIs.
We added a new template containing the Network Extension entitlements to your team.然后你就可以在你的项目中配置你的证书了。这里附上配置证书的指导文档<https://developer.apple.com/library/ios/technotes/tn2415/_index.html#//apple_ref/doc/uid/DTS40016427>
如果配置完成,还可以通<https://forums.developer.apple.com/message/75928#75928> 这个对你的配置进行检测,看是否配置成功。当然最最重要的还是对NetworkExtension这个类的运用,以下是对这个类的中文翻译。
NOTE
应用程序的Info.plist必须添加一个包含“remote-notification”的UIBackgroundModes数组应用程序必须设置“com.apple.developer.networking.HotspotHelper'作为它的权利之一。
该权利的值是一个布尔值true要申请这个权利,请发送E-MAIL到networkextension@apple.com更多信息请参阅苹果的Hotspot Network Subsystem Programming Guide
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。
Manage Hotspot Networks
+ (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方法允许应用程序知道它是否是当前处理的网络。
Data
Typestypedef void (^NEHotspotHelperHandler)(NEHotspotHelperCommand * cmd)
@discussion 当调用方法registerWithOptions:queue:handler:时,Hotspot Helper app提供这种类型的blcok。 每次有要处理的命令时调用block。
以上为对这个类的一些解读,最后附上具体的代码。
NSMutableDictionary* options = [[NSMutableDictionary alloc] init];
[options setObject:@"??????????" forKey:kNEHotspotHelperOptionDisplayName]; dispatch_queue_t queue = dispatch_queue_create("com.myapp.ex", NULL);
BOOL returnType = [NEHotspotHelper registerWithOptions:options queue:queue handler: ^(NEHotspotHelperCommand * cmd) {
NEHotspotNetwork* network;
NSLog(@"cmd %@", cmd);
NSLog(@"COMMAND TYPE: %ld", (long)cmd.commandType);
NSLog(@"network %@",cmd.network);
NSLog(@"networkList %@",cmd.networkList);
if (cmd.commandType == kNEHotspotHelperCommandTypeEvaluate || cmd.commandType ==kNEHotspotHelperCommandTypeFilterScanList) {
for (network in cmd.networkList) {
NSLog(@"COMMAND TYPE After: %ld", (long)cmd.commandType);
if ([network.SSID isEqualToString:@"A8F8"]) {
double signalStrength = network.signalStrength;
NSLog(@"Signal Strength: %f", signalStrength);
[network setConfidence:kNEHotspotHelperConfidenceHigh];
[network setPassword:@"123456789"];
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);