美文网首页iOS开发精进iOS 实用iOS 收集
iOS 9 NEHotspotHelper 的NetworkEx

iOS 9 NEHotspotHelper 的NetworkEx

作者: 雪中夜归人 | 来源:发表于2016-05-13 18:12 被阅读4994次

           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);

    相关文章

      网友评论

      • MYS_iOS_8801:你好 方便加你的qq请教一下吗? 我的 qq 1084666097 项目比较紧急
      • 20406e2f0d9f:楼主您好

        2016.11的时候苹果对这个框架已经不需要申请审核了.
        那使用它还需要配置这些吗?
        姜益达:@Niki_徐 请问你现在在做什么功能?
        20406e2f0d9f:@姜益达 嗯,不需要了,获取热点需要
        姜益达:你好,现在使用这个框架真的不需要审核吗?
      • ZGZ小朱:大神,你好,这个只是获取当前的WiFi 列表,有没有什么方法去获取过去连接过的WiFi 列表
      • 蜗牛1992:打开这个功能后,打包不能安装了。。。。
        蜗牛1992:@雪中夜归人 我解决了这个问题,缺个权限,上架appstore用不到,199美元的企业级的是要用这个的。企业级账号打正式包用的的inHouse权限是要回复那个通过申请的邮件再次申请的,否则In House没有那个选择HotSpotHelper的面板,只有develop和Ad Hoc(打测试包用的)才有那个选择面板。
        蜗牛1992:@雪中夜归人 有关系,我在苹果论坛看到说这个权限in House模式是需要再次申请权限的,否则只有develop和Ad Hoc里面有那个选项面板。
        雪中夜归人:@蜗牛1992 应该是你打包的问题吧,跟这个是没有关系的
      • Kingiiyy_iOS:大师兄.想问个问题.能不能再APP里面获取到WIFI列表.不需要进入设置那里.VC1 进到-> VC2.VC2是想展现一个WIFI列表.进到VC2 经过一段时间的请求能不能直接展示在VC2 .而不用去到设置那里...谢谢啦.
        雪中夜归人:@小小ios 并没有,现在不搞WiFi了,所以没有再深入研究。希望你解决了分享一下
        X__Z:我也有同样的需求 请求楼主解决了吗?十分感谢!!!
        雪中夜归人:@kingiiyy 应该是可以的,但是并不知道怎么做,我只是看到UC跟QQ做到了这个功能。
      • ihere洋:我每次需要进到我的app中,系统wifi列表才会出现我设置的信息,当我把App杀死后重新打开系统wifi列表时我之前设置的信息都没有了,怎么才能让系统记住我设置的wifi信息呢?
        雪中夜归人:@ihere洋 本来就是这样的逻辑,你app都被杀死了,你的代码当然不运行了
        ihere洋:有人遇到过这个问题吗?
      • 这是我的猫头:你好你好,请问怎么用这个框架让CMCC不弹认证页啊
        ihere洋:我每次需要进到我的app中,系统wifi列表才会出现我设置的信息,当我把App杀死后重新打开系统wifi列表时我之前设置的信息都没有了,怎么才能让系统记住我设置的wifi信息呢?
        少年_如他:@这是我的猫头 你解决了吗?不让弹认证页的问题?
        雪中夜归人:@这是我的猫头 这个问题不是这个框架可以解决的
      • aeffb2f7ec39:师兄 能告诉我咋个申请成功的,我申请了好久了。
        aeffb2f7ec39:@雪中夜归人 公司需要,哎好麻烦
        雪中夜归人:@G_C_L 你是自己要试试呢 还是公司需要。这个申请流程我在上边有写啊,但是苹果会审核你是否真的需要这个权限
      • Kantoi:请问用这个能否判断不同设备是否连接在同一个wifi下?
        因为有的wifi名称可能一样所以根据SSID的话有可能判别不出。
        可以获取到当前wifi的IP什么的来判断吗?
        雪中夜归人:@Kantoi 取当前连接WiFi的方式可以不用这么麻烦的 你网上百度方法很多。
        Kantoi:@雪中夜归人 这个也是从supportedNetworkInterfaces()回调中就可以直接取到是吧?
        雪中夜归人:@Kantoi 取WiFi的mac地址啊
      • 繁华乱世沧桑了谁的容颜:可以传入WIFI的账号和密码 让它自动连接吗

        未之:您好,请问如果设置了WiFi账号和密码,连接时可以不弹出加入的alert弹框吗?
        繁华乱世沧桑了谁的容颜:@雪中夜归人 哦 哦 谢谢
        雪中夜归人:@繁华乱世沧桑了谁的容颜 只要当前WiFi列表中有你说的那条WiFi,你是可以设置密码的
      • 我的肖:师兄。问下,这个可以直接在app内获取wifi列表。并进行展现出来吗 可以进行直接点击链接吗?
        雪中夜归人:@我的肖 不可以的
      • chencheng0330:你好,我调用了 [network setPassword:@"123456789"]设置了一个错误的密码之后,再进入系统的wifi列表选中该wifi信号,会连接失败,并且弹出密码输入框,请问这个事件能拦截吗。
        雪中夜归人:@chencheng0330 目前没有研究的那么深入
      • husky_duang:哥们儿,这个能获得wifi 列表?
        雪中夜归人:@固执的yu 当用户到设置页面的WiFi列表中时是可以获取到的。
      • Darren_xu:这个权限我申请了好久了都被拒了,问一下你是怎么申请下来的?
        手里剑_c47c:我的也是啊
        请问有什么门路没有
      • 73b237d991da:不错,已分享
      • kelloy:赞一个,虽然我是搞android的
      • c031492d4046:很有参考价值
        雪中夜归人:@yinxiangyu111 谢谢,大家一起交流!

      本文标题:iOS 9 NEHotspotHelper 的NetworkEx

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