iOS之Wifi开发探究

很久没有写博客了,最近在作iOSWIFi开发的部分,这里咱们主要用到的API以及FrameWork有如下:ios

  • NetworkExtension.framework
  • NEHotspotHelper

一 申请

准备条件:git

  • 1 付费的开发者帐号
  • 2 公司的WebSite
  • 3 明确你的Wifi开发需求

申请步骤: 申请网址 developer.apple.com//contact/ne… 填写申请的相关资料 github

image.png
根据你项目中的具体状况,在相对应的地方打钩

image.png

  • 上述表填写完毕以后,发送以后,没多久会受到一封邮件,邮件的大体内容为

image.png

大体意思就是从16年11月10日开始 能够在开发者帐户的account页面建立APPID的时候添加网络扩展数组

image.png

  • Note:NetWork Extensions能作的有限,能够获取WiFi名字和mac地址,可是注册改变Wifi设置页面子title 设置密码 并能够进行链接 这仍需咱们申请并获取HotsPotHelperApi的使用权限 过两周或者更久能够收到Apple回复的是否经过的Email,若是失败了不要气馁,据不少小伙伴反应,比追姑娘都要麻烦😂

二 使用

在这里我就很少加赘述,WIFi开发的相关资料虽然不多,可是申请成功后,如何在项目中配置,这部分的文章网上有不少,具体配置给大家推荐两篇文章好吧安全

一些相关属性
  • SSID:Wifi 名称
  • BSSID:站点的 MAC 地址
  • signalStrength: Wifi信号强度,该值在0.0-1.0之间
  • secure:网络是否安全 (不须要密码的 Wifi,该值为 false)
  • autoJoined: 设备是否自动链接该 Wifi,目前测试自动链接之前连过的 Wifi 的也为 false
  • justJoined:网络是否刚刚加入
  • chosenHelper:HotspotHelper是否为网络的所选助手

部分使用代码bash

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列表,并给系统设置页面Wifi设置子标题 能够得到wifi名称,信号强度,mac地址等等
+(void)getWifiList{

    NSMutableDictionary* options = [[NSMutableDictionary alloc] init];
    [options setObject:@"🔑Wifi子标题🔑" 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);

}
复制代码

三 思考

  • 1 必须进入到系统WIFI设置页面才能够获取到WIFI列表(包括强度 WIFI名称)参考WIFI万能助手 可能都是经过LBS一些方法告诉你附近可能存在的WIFI,而后经过点击推荐的WIFI 进入下一步

image.png

  • 2 点击上方任意一个可能存在的WIFI,由于Apple政策缘由 没法再APP内直接链接WIFI!!! 因此万能钥匙的策略是 以下图,提供你个链接教程,将能够链接的WIFI名称进行更改,在下方加上提示文字 好比 🔑万能WIFI - 点击一键上网🔑 
    image.png

经过这样的方式进行链接网络

image.png
这里万能钥匙的作法是帮助用户跳到wifi系统设置页面,市面上还有不少须要用户本身手动进入WIFI设置页面的App,好比360免费wifi,这样虽然牺牲了一部分用户体验,可是在审核方面能够经过率大大增长,仍是比较值得倡导的

  • 3 不能主动经过代码的方式断开WIFI 好比 有一个按钮叫作断开WIFI 这样是不容许的 只能经过用户手动关闭WIFI或者WIFI自己没法链接网络只能经过判断当前网络状态的方式进行链接

四 总结

iOS wifi开发相关资料较少,Apple对这方面的审核也较为严格 但愿这篇文章能够帮助到正在作wifi开发相关的小伙伴们,加油!app

相关文章
相关标签/搜索