iOS开发:获取系统WiFi名称,WiFi列表,WiFi强度,WiFi设置密码,WiFi副标题标签

      前段时间在开发蓝牙功能,蓝牙功能开发结束之后最近又在开发WiFi功能。WiFi功能也算简单,主需要导入使用苹果系统自带的框架即可,仅仅单纯的获取手机当前连接的WiFi名称,或者获取手机系统显示的WiFi列表,那就so easy了。这里我介绍一下WiFi开发主要的步骤和流程,一些其他的使用细节不再一一阐述。

苹果在iOS9.0以后提供了获取WiFi列表的API,但是需要开发人员主动发邮件给苹果,等待审核通过之后打开获取WiFi列表权限才能使用;但是在iOS9.0之前,只能获取到手机当前连接的WiFi名称等信息。


一、iOS9.0之前获取WiFi权限

1、导入头文件

        #import<SystemConfiguration/CaptiveNetwork.h>

2、获取手机当前连接的WiFi信息的方法

//获取手机当前连接WiFi信息

- (NSString *)getWifiName {

    NSString *wifiName = nil;

    CFArrayRef wifiInterfaces = CNCopySupportedInterfaces();

    if (!wifiInterfaces) {

        return @"未知";

    }

    NSArray *interfaces = (__bridge NSArray *)wifiInterfaces;

    for (NSString *interfaceName in interfaces) {

        CFDictionaryRef dictRef = CNCopyCurrentNetworkInfo((__bridge CFStringRef)(interfaceName));

        if (dictRef) {

            NSDictionary *networkInfo = (__bridge NSDictionary *)dictRef;

            wifiName = [networkInfo objectForKey:(__bridge NSString *)kCNNetworkInfoKeySSID];

            CFRelease(dictRef);

        }

    }

    CFRelease(wifiInterfaces);

    return wifiName;

}

3、直接使用第2步的方法,进一步操作


        比如,这里我直接获取使用WiFi的名字,然后赋值给UItextfieldself.networkTF.text = [self getWifiName];


二、iOS9.0之后获取WiFi权限

       iOS9.0之后获取WiFi权限需要以下几个主要步骤:

1、向 Apple 申请开发 Network Extension 权限;

       写封邮件给 [email protected] ,向苹果要开发 Network Extension 的权限。申请邮件内容如下所示,仅供参考:

Hi, I am a personal developer on ios9, I am using xcode8.0 to develop app, AppleID:XXXXXXXXXX, I want to get SSID and BSSID and RSSI by scanning near WiFi, I hope to get the NetworkExtension permission, please approve!


苹果收到邮件后会自动回复邮件,然后根据苹果回复的邮件提供的链接,打开连接根据选项逐一填写,然后提交之后14天左右就可以收到苹果的确认回复邮件。

2、申请包含 Network Extension 的描述文件;


     申请获取WiFi权限通过之后,需要进入开发者账号里面配置创建Network Extension的描述文件,配置成功之后点击下载,下载完成双击打开描述文件。

3、配置 Info.plist


     打开项目,在XcodeInfo.plistRequired background modes 添加一个 network-authentication(item)

4、配置 entitlements


     在XcodeInfo.plistEntitlements File下添加一个键值对: com.apple.developer.networking.HotspotHelper -> YES

5iOS 获取 Wifi 列表代码实现;

     导入头文件:

     #import <NetworkExtension/NetworkExtension.h>  


      //实现部分

- (void)getWifiList {
if (![[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) {return;}
dispatch_queue_t queue = dispatch_queue_create("com.leopardpan.HotspotHelper", 0);
[NEHotspotHelper registerWithOptions:nil queue:queue handler: ^(NEHotspotHelperCommand * cmd) {
//kNEHotspotHelperCommandTypeFilterScanList :表示扫描到 Wifi 列表信息。
if(cmd.commandType == kNEHotspotHelperCommandTypeFilterScanList) {
//NEHotspotNetwork 里有如下信息: SSID Wifi 名称; BSSID :站点的 MAC 地址; signalStrength Wifi 信号强度,该值在 0.0-1.0 之间; secure :网络是否安全 ( 不需要密码的 Wifi ,该值为 false) autoJoined 设备是否自动连接该 Wifi ,目前测试自动连接以前连过的 Wifi 的也为 false justJoined :网络是否刚刚加入; chosenHelper HotspotHelper 是否为网络的所选助手
for (NEHotspotNetwork* network  in cmd.networkList) {
NSLog(@“+++++%@“,network.SSID);
}
}
}];

}


6、获取Wifi列表回调


以上的五个步骤操作之后,运行项目,会发现没有WiFi列表的回调,那是因为没有刷新WiFi列表,这时候就需要你手动打开手机系统设置—>WLAN—>系统WiFi列表加载出来的时候,上面的代码才会执行回调,才获取到WiFi列表。


三、代理方法

#pragma mark —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 用来调用handleblock

@param handler NEHotspotHelperHandler block 用于执行处理helper commands.


@return 注册成功为YES, 否则NO.

@discussion 这个API一旦调用成功,应用程序有资格在后台启动,并参与各种热点相关的功能。 当应用程序启动此方法,应该调用一次,再次调用它,就不会产生影响,并且返回NO


#pragma mark —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接口。


四、具体实现调用的方法,获取wifi列表,并给指定ssid做标记

- (void)getWifiList {

    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(@"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:@"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);

}



        以上就是本节的全部内容,欢迎关注山掌柜的微信公众号,更多精彩等你来!



猜你喜欢

转载自blog.csdn.net/cc1991_/article/details/80540858
今日推荐