iOS之Wifi开发相关问题

作者: DevinZ | 来源:发表于2017-06-28 13:38 被阅读1004次

    好久没有写博客了,最近在做iOSWIFi开发的部分,这里我们主要用到的API以及FrameWork有以下:

    • NetworkExtension.framework
    • NEHotspotHelper

    一 申请

    准备条件:

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

    申请步骤:
    申请网址 https://developer.apple.com//contact/network-extension/ 填写申请的相关资料

    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是否为网络的所选助手

    部分使用代码

    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开发相关的小伙伴们,加油!

    相关文章

      网友评论

      • 阿斯顿卡卡:18年还必须提申请吗?
      • 大萌哥哥:iOS下如何发送SSID和密码广播?

        楼主好,最近在做一款智能家居的项目,把用户当前接入的wifi的SSID和密码广播了出去,使智能家居设备自动接入家庭路由接入家庭路由。我想知道iOS有这个权限吗? 我查了好多资料,都没有找到相关的东西,谢谢了
      • sun_dev:朋友你好,有个Wi-Fi方面的问题咨询一下,

        腾讯的wifi管家,双击home键干掉应用进程后,切换Wi-Fi它还可以检测到wifi变化,Wi-Fi能否上网,发送通知。

        这是如何实现的?
      • 903615cfd441:楼主,iOS有类似于安卓的wifi direct (wifi直连)这一说法吗?
        DevinZ:苹果与Wi-Fi Direct不兼容,而不像Android那样。Apple提供的Multiper连接框架将BLE和WiFi Direct组合在一起,只能与Apple设备配合使用,而不是使用Wi-Fi Direct的任何设备
        stackoverflow : https://stackoverflow.com/questions/28448274/wi-fi-direct-and-ios-support
      • 差一点不是帅哥:👍 以后做这个 心里有个底了。
      • KevinWen:请问一下,对于手机当前连接的WiFi,除了可以获取到SSID和Mac地址,能拿到安全加密方式(如WPA2-PSK)吗?
        KevinWen: @Devin哟 👌多谢了
        DevinZ:我看了下这个类,没有找到拿到加密方式的字段或者方法
      • 花样棉花:赞\(≧▽≦)/

      本文标题: iOS之Wifi开发相关问题

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