美文网首页iOS进阶常用的第三方iOS进阶
iOS 获取系统wifi列表,wifi信号强度,并给wifi设

iOS 获取系统wifi列表,wifi信号强度,并给wifi设

作者: 少年_如他 | 来源:发表于2016-09-27 17:23 被阅读11613次

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

问卷调查表
根据自己的实际情况填写.里面有个产品介绍,最好找个英文好的...

1-2 调查表填写完成后,大概过了2 ,3小时,苹果会回复给你一封邮件,并且返回给你一个fllowup.(注意,这并不是代表你已经申请成功了,邮件里面只是确认你填写的问卷信息!)

并不是成功的邮件.png

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

配置描述文件

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

通过邮件.png

恭喜您,通过了.但是不得不说,这只成功了一小半.后面你可能遇见更痛苦的事情.

2下面就来来说更痛苦的事情.
2-1 配置工程
a .新建一个App ID.

新建 App ID

b. 添加iCloud 和Wireless Accessory

添加iCloud 和Wireless Accessory.png

c.新建iCloud Containers

新建iCloud Containers.png

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


编辑刚刚创建的AppID.png

e


17407914-2B9F-42D2-9E21-7EBF50DF0FEC.png

f


ABD85AAF-04C8-4FDD-B6E5-005D188980ED.png

g 配置App ID完成


2DEACBF8-CB87-4CB0-A6B1-2E092DAD4369.png

2-2 配置描述文件 .

注意选择新建的App ID 注意这个值要加上.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>

通过xml方式添加.png 添加完了会有这

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

,打开并配置icould 打开Wireless-Accessory-Configuration.png

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


配置.entitlements文件.png

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

配置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界面,才能在控制台查看打印信息的.

下面附上两张效果图:

系统的wifi列表.png 修改系统wifi的标签

最后附上一个Network Extension 使用的难兄(福)难(利)弟群(群里很多都已经实现了这个功能)----585640621

最后推荐一个技术交流群,里面大神很多! 529043462
QQ1 :2806539826
QQ2 :576484150

demo已上传到gitHub上 :https://github.com/chengkunlun/FirstRePository

参考文档:http://blog.csdn.net/qinxianjun163/article/details/51583057

相关文章

网友评论

  • 526a0c4d43dd:不明白,为什么一定要勾选iCloud,获取Wi-Fi列表跟iCloud有什么联系?
  • 孤独感爆棚:我的需求是,通过获取到的WIFI列表,判断是否连接到公司WIFI,从而判断考勤范围打卡什么的。如果获取这个列表每次都需要用户跳到WIFI界面,不是坑爹吗
  • X__Z:楼主, 请问下获取wifi列表是不是要先跳转到系统设置这个步骤才可获取,不然是🈳️值 对吗
    db31b23d1fd1:@少年_如他 楼主你好,按照你说的,如果不跳转到设置页面就不能获取Wifi列表,那么Wi-Fi万能钥匙App里的附近wifi列表是怎么获取的?Wi-Fi万能钥匙App里没有跳转页面,但是可以获取周围列表。
    少年_如他:@小小ios 是的
  • a10eacc93c3c:运行之后怎么没有WiFi列表,只有一个空白页面
    a10eacc93c3c:Thank you for requesting information about the Network Extension framework. Please note that this process is not required for developers who wish to use App Proxy, Content Filter, or Packet Tunnel APIs. To learn more about enabling these services for your app, please see the App Distribution Guide.

    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
    a10eacc93c3c:是真机测试,也是自己的开发者账号,至于权限,不是说现在可以不用申请NetworkExtension了吗,是指什么权限
    少年_如他:@隐形的翅膀_8a54 需要真机测试 改成你自己的开发者账号,而且需要权限
  • 590ca6fda784:我只想在APP里面获取wifi列表,需要申请这个东西吗?
    少年_如他:@呲嗯滋吴 目前要实现这个功能还是要的
  • 汤姆的杰瑞:大佬你好 请问下类似wifi 万能钥匙的这种app 必须使用Network Extension 这个框架
  • d830c2f7a46e:你好 问一下用这个框架会不会有被拒绝的风险啊
  • 望了不忘:我获取到权限之后,已有的appId应用能否使用这个权限呢?
  • 雪_晟:写的很棒,可是我们提交申请之后,苹果回复"these APIs are not designed for the user you've identified"; 这个怎么破
  • Chefil:看了那么多,就这个最详细了,谢谢分享~~~
  • Little_Shaun:楼主,我申请了半个月了,都没反应,你申请了多长时间啊,快被老大逼疯了。。。
    少年_如他:@Little_Shaun 现在貌似是很难通过,我申请了五个星期..好在我们当时并不怎么要求...
  • 20406e2f0d9f:楼主您好

    2016.11苹果对该框架已经不需要申请审核了,
    那么还需要这些配置吗?
  • 20406e2f0d9f:您好楼主,获取WiFi列表,可以代码添加指定的SSID吗?并不要连接...
    少年_如他:@Niki_徐 这个貌似不可以的吧,安卓也不可以的吧!
    20406e2f0d9f:@少年_如他 我现在要实现的是:我来操控扫描WiFi,让它扫描我指定的SSID,可以不要显示出来,也不需要连接.
    少年_如他:什么意思?代码添加指定的ssid,然后设备上也显示是吗?
  • 马金星:我通过这个调查问卷申请了一个多月了没有什么结果,问问作者现在要怎么申请?麻烦您了,希望您可以帮助我一下
    橙_知足常乐:hank you for requesting information about the Network Extension framework. Please note that as of November 10, 2016 this process is not required for developers who wish to use App Proxy, Content Filter, or Packet Tunnel APIs. To use these services please navigate to your Developer Account at <https://developer.apple.com/account/>;; and select the Network Extension capability for the App ID you will be using for your app.

    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
    马金星:@少年_如他 没有,你把群号发我,我马上加进群
    少年_如他:你加群了么?你在群里的名字叫啥?
  • 马金星:Thank you for requesting information about the Network Extension framework. Please note that as of November 10, 2016 this process is not required for developers who wish to use App Proxy, Content Filter, or Packet Tunnel APIs. To use these services please navigate to your Developer Account at <https://developer.apple.com/account/&gt; and select the Network Extension capability for the App ID you will be using for your app.

    谢谢你的请求信息网络扩展框架。2016年11月10日,请注意,这个过程不需要开发人员希望使用应用程序代理,内容过滤,或者包隧道api。使用这些服务,请导航到你的开发者账户< https://developer.apple.com/account/ >并选择网络扩展能力你将使用你的应用程序ID。

    上面是写完调查问卷给我的回复,现在这个功能放开了吗还是说这个答复是错误的,回答的不是我想要的。请楼主帮我一下
  • 蜗牛1992:添加了这个功能后打包不能安装了。。。。。。去掉后安装就是好的。。总是提示此应用无法安装
    少年_如他:@蜗牛1992 嗯,我们是公司账户 99美元的。企业级还需要再加个发布权限吗?
    蜗牛1992:企业级 账号打包用的的InHouse权限是需要拿到申请通过的邮件后再次申请的,大概一周审核通过。
    _牙牙:我这一样,不知道啥情况
  • 出门右转掘金见:写的很好啊,良心之作.顺便问一下苹果回复的邮件在哪里查看
  • sun_dev:你好,从服务器获取了账号密码,用代码注入WiFi 实现联网?
  • sun_dev:老兄,拉取服务器账号密码,代码连接WiFi 是哪个方法?
    少年_如他:万能钥匙也需要到系统设置界面联网的啊!
    sun_dev:@少年_如他 那WiFi 万能钥匙是如何连上WiFi
    的呢?
    少年_如他:@Guo浮沉 ios 不可以实现代码连接吧,要是能实现代码连接就好了.
  • 01badM:楼主, 请问下你有做过在app中获取wifi列表, 并控制硬件连接wifi的吗? 这个可否实现尼?
    暮雨霜白:老哥,你这个实现了吗?求教一二
    少年_如他:在app中获取系统的wifi列表做过,控制硬件连接wifi没有做过..
  • ihere洋:我每次需要进到我的app中,系统wifi列表才会出现我设置的信息,当我把App杀死后重新打开系统wifi列表时我之前设置的信息都没有了,怎么才能让系统记住我设置的wifi信息呢?
    少年_如他:之前设置的信息是指?
  • 柳骏:必须用开发者账号才行吗?苹果ID不能?
    少年_如他:@柳骏 这个貌似是的,因为需要你自己配置描述文件,没有开发者账号,不可以配置描述文件的..
  • LeonLei:Network Extension framework 11月10号开始已经不需要申请了,创建APPID的时候勾上就可以,Hotspot Helper API还是需要填写调查问卷申请的
    马金星:这个调查问卷一直没有什么有用的回复
    CoderHG:@LeonLei 我怎么还是不行呢?
  • 阿兹尔:兄弟 我想问下 这个到时成功的话,苹果商店会拒绝上线吗?
    少年_如他:@阿兹尔 不会的
  • 王强iOS:我申请框架,填写了调查问卷了,调查表填写完成后 ,没有收到苹果回复的fllowup 邮件,这是咋回事呢,我有重新申请了好几次,快两个月
    马金星:你的问题解决了吗?我也遇到相同的问题
  • LiteDeveloper:真不错
  • 12345qwert:你好兄弟,我有个地方不太明白,请教一下:1.wifi密码为什么可以通过代码取设定?wifi的密码不是事先就已经设定好的吗?2.我现在有个需求,知道ssid和密码,通过代码连接上wifi,不知道是否可以实现?如果实现不了是否可以采用你这种办法实现
  • 诸子百家谁的天下:被总监逼着按照安卓的API搞,真是头疼啊!感觉要离职的节奏!
    诸子百家谁的天下:@暮雨霜白 没有呢!
    暮雨霜白:老兄,你搞出来了吗?需要申请吗?咋弄的?
    少年_如他:@诸子百家谁的天下 最怕总监技术盲,我们老大是做c++的。。所以,你懂的
  • 2c68a794e6c3:哈哈 干的漂亮
    少年_如他:@JoneYin 为了帮助更多爬坑的人...

本文标题:iOS 获取系统wifi列表,wifi信号强度,并给wifi设

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