2018-06-01 17:40:48 CC1991_ 阅读数 8570

      前段时间在开发蓝牙功能,蓝牙功能开发结束之后最近又在开发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 权限;

       写封邮件给 networkextension@apple.com ,向苹果要开发 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 里有如下信息:SSIDWifi 名称;BSSID:站点的 MAC 地址;signalStrength Wifi信号强度,该值在0.0-1.0之间;secure:网络是否安全 (不需要密码的 Wifi,该值为 false)autoJoined 设备是否自动连接该 Wifi,目前测试自动连接以前连过的 Wifi 的也为 false justJoined:网络是否刚刚加入;chosenHelperHotspotHelper是否为网络的所选助手
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);

}



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



2020-02-11 17:15:03 youshaoduo 阅读数 1435

iOS 上获取 Wifi 列表其实有很大限制,在 iOS 9 以前是不能获取Wifi列表的,只能获取当前连接的 Wifi 信息,也就表示只有连接了 Wifi 才能确定位置。
Apple 在 iOS 9 以后,提供了获取Wifi列表的API,但是获取Wifi列表是有门槛的,主要步骤有:


  1. 向 Apple 申请开发 Network Extension 权限
  2. 申请包含 Network Extension 的描述文件
  3. 配置 Info.plist
  4. 配置 entitlements
  5. iOS 获取 Wifi 列表代码实现
  6. 获取Wifi列表回调

向 Apple 申请开发 Network Extension 权限

首先要先写封邮件给 networkextension@apple.com ,问苹果要开发 Network Extension 的权限。 苹果收到邮件后会自动回复邮件,在 https://developer.apple.com/contact/network-extension/ 里面填写申请表格,内容包括:

Organization:               

Company / Product URL:             

What's your product's target market?              

What's your company's primary function?             

Describe your application and how it will use the Network Extension framework.            

What type of entitlement are you requesting?                     

...

申请后大概两周左右能收到 Aplle的 确认信,如:

Hi, 

Thanks for your interest in the Network Extension APIs.

We added a new template containing the Network Extension entitlements to your team.

......

申请包含 Network Extension 的描述文件

选择包含 Network Extension 的描述文件,后点击下载,下载完成双击描述文件。

xcode中开启Network Extensions权限

在这里插入图片描述

配置 entitlements

xxx.entitlements(xxx是项目名称) 里添加 Key-Value: com.apple.developer.networking.HotspotHelper -> YES,没有此文件需要先创建一个:
在这里插入图片描述

iOS 获取 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) {
        if(cmd.commandType == kNEHotspotHelperCommandTypeFilterScanList) {
            for (NEHotspotNetwork* network  in cmd.networkList) {
                NSLog(@"network.SSID = %@",network.SSID);
            }
        }
    }];
}

kNEHotspotHelperCommandTypeFilterScanList: 表示扫描到 Wifi 列表信息。

NEHotspotNetwork 里有如下信息


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


获取Wifi列表回调

当你把上面的代码写完,并成功运行项目后,发现并没有Wifi列表的回调。因为你还没刷新Wifi列表,你需要:

打开手机系统设置 -> WLAN -> 系统 Wifi 列表加载出来时,上面代码部分才会回调,才能获取到 Wifi 列表。
这个时候你就能看到控制台源源不断的Log。

注意事项

1、获取Wifi列表功能由于是需要申请后台权限,所以能后台激活App(应用程序),而且激活后App的进程能存活几个小时。
2、整个获取Wifi列表不需要App用户授权,也就是在App用户无感知下获取设备的Wifi列表信息,使用时请正当使用。
3、Wifi列表获取 NetworkExtension 是 iOS 9以后才出的,目前 iOS 9 已经覆盖很广了。

2017-06-20 10:53:41 ws1352864983 阅读数 5942

最近公司社区项目中要用到或者社区周围WiFi列表以及信号强度,好多网友说实现不了讨论区


相关资源:

APP跳转 及iOS10跳转在设置页面

Wifi 定位原理及 iOS Wifi 列表获取

iOS 获取系统wifi列表,wifi信号强度,并给wifi设置密码,标签(副标题)

iOS 无法获取 WiFi 列表?一定是因为你不知道这个框架

Demo地址


9.0以前获取需要引入

#import<SystemConfiguration/CaptiveNetwork.h>

+ (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;

}

9.0以后获取需要引入

import <NetworkExtension/NetworkExtension.h>

但在应用中需要添加icloud containers

NSArray * networkInterfaces = [NEHotspotHelper supportedNetworkInterfaces];

NSLog(@"Networks %@",networkInterfaces);

//获取wifi列表

for(NEHotspotNetwork *hotspotNetwork in [NEHotspotHelper supportedNetworkInterfaces]) {

NSString *ssid = hotspotNetwork.SSID;

NSString *bssid = hotspotNetwork.BSSID;

BOOL secure = hotspotNetwork.secure;

BOOL autoJoined = hotspotNetwork.autoJoined;

double signalStrength = hotspotNetwork.signalStrength;}

应用程序的Info.plist必须添加一个包含“remote-notification”的UIBackgroundModes数组.

应用程序必须设置“com.apple.developer.networking.HotspotHelper’作为它的权利之一。

该权利的值是一个布尔值true要申请这个权利,请发送E-MAIL到networkextension@apple.com更多信息请参阅苹果的Hotspot Network Subsystem Programming Guide

申请链接 :https://developer.apple.com/contact/network-extension/

详阅官方文档: https://developer.apple.com/reference/networkextension/nehotspothelper

https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/Hotspot_Network_Subsystem_Guide/Contents/Introduction.html#//apple_ref/doc/uid/TP40016639

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方法允许应用程序知道它是否是当前处理的网络。

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:@"WISPr Hotspot"]) {

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);
2017-03-09 20:54:28 EyreFree 阅读数 2345

iOS 9 发布之后,苹果推出了 NetworkExtension,利用这个框架可以实现很多和网络相关的操作。本文主要介绍怎样使用其中的 NEHotspotHelper 进行设备 WiFi 列表的获取。

Demo 地址:https://github.com/EyreFree/EFNEHotspotHelperDemo

一. 注意事项

  1. 首先,NEHotspotHelper 只在 iOS 9 及以上版本得到支持,之前版本的 iOS 并不支持该功能;
  2. 然后,你需要有一个开发者账号;
  3. 最后,该框架目前还没有大规模开放使用,所以需要向苹果发送申请并且审核通过才能够获得使用该框架的权限,大致内容就是描述一下你需要使用该框架的原因之类的,然后我是用的英文进行描述(感谢百度以及谷歌翻译),不过据说中文也行。提交申请后大概一周内会收到反馈邮件,申请地址为: https://developer.apple.com/contact/network-extension/

二. 创建 App ID

打开苹果开发者中心,登陆然后找到 App IDs 选项,点击右上角按钮创建一个 App ID 用于接下来创建 Provisioning Profile,地址为: https://developer.apple.com/account/ios/identifier/bundle/ ,如图所示:

创建 App ID

首先,填写 Name 以及 Bundle ID,这里统一填写为 EFNEHotspotHelperDemo,如图所示:

填写 Name

填写 Bundle ID

接下来这一步注意需要勾选 Wireless Accessory Configuration 这一选项,如图所示:

勾选 Wireless Accessory Configuration

然后观察到如图所示状态表明已成功打开:

状态显示

在 App IDs 列表中查看刚创建完成的 App ID:

App IDs 列表

三. 创建 Provisioning Profile

找到 Provisioning Profiles 选项,点击右上角按钮创建一个 Provisioning Profile 用于接下来创建示例工程,地址为: https://developer.apple.com/account/ios/profile/ ,如图所示:

创建 Provisioning Profile

首先选择 Profile 类型,这里我选择的是 iOS App Development,可以根据自己的具体需要自由选择:

选择 Profile 类型

接下来选择我们在第二步创建好的 App ID,如图所示:

选择 App ID

然后选择证书和设备,全选即可:

选择证书

选择设备

在额外权限这一步需要选中我们申请到的 Network Extension 权限,可以看到其中包含我们需要使用的 NEHotspotHelper 权限,如图所示:

选中 Network Extension 权限

填写完 Profile Name 之后,即可成功创建我们需要的 Profile:

填写 Profile Name

点击 Download 将它下载到本地:

下载 Profile

双击打开,即可将 Profile 添加到本机:

添加 Profile

可以到 XCode 的账户设置里查看已安装的 Profile,若未安装成功可以尝试点击 Action 中的 Download 按钮重新下载:

查看已安装的 Profile

四. 创建工程

接下来我们创建一个示例工程,演示如何获取 WiFi 列表。首先,将 Bundle ID 改为之前设置的 EFNEHotspotHelperDemo:

修改 Bundle ID

然后在 Info.plist 中添加后台模式权限数组:

添加后台模式代码

代码如下:

<key>UIBackgroundModes</key>
<array>
    <string>network-authentication</string>
</array>

添加完成后可以在 Target -> Capabilities 中看到后台模式已处于开启状态:

后台模式已开启

接下来在 Capabilities 找到 Wireless Accessory Configuration 并将其打开:

打开 Wireless Accessory Configuration

在工程中找到后缀为 {工程名}.entitlements 的文件 EFNEHotspotHelperDemo.entitlements,在其中加入 HotspotHelper 权限代码:

添加 HotspotHelper 权限代码

代码如下:

<key>com.apple.developer.networking.HotspotHelper</key>
<true/>

好了,到这里已经完成了各种乱七八糟的配置工作,可以尝试进行 Build。如果没有提示错误信息的话,接下来就可以愉快地使用 HotspotHelper 了;如果有问题的话,请检查之前的步骤是否都已正确完成或者根据错误信息修改具体项目。

五. 核心代码

首先,在需要使用 HotspotHelper 的地方添加头文件引用,这里以 Objective-C 代码为例:

#import <NetworkExtension/NetworkExtension.h>

然后使用如下代码即可将 WiFi 列表信息打印到 XCode 控制台,注意:这里需要打开系统 设置 中的 无线局域网 页面才可以触发回调:

- (void)scanWifiInfos{
    NSLog(@"1.Start");

    NSMutableDictionary* options = [[NSMutableDictionary alloc] init];
    [options setObject:@"EFNEHotspotHelperDemo" forKey: kNEHotspotHelperOptionDisplayName];
    dispatch_queue_t queue = dispatch_queue_create("EFNEHotspotHelperDemo", NULL);

    NSLog(@"2.Try");
    BOOL returnType = [NEHotspotHelper registerWithOptions: options queue: queue handler: ^(NEHotspotHelperCommand * cmd) {

        NSLog(@"4.Finish");
        NEHotspotNetwork* network;
        if (cmd.commandType == kNEHotspotHelperCommandTypeEvaluate || cmd.commandType == kNEHotspotHelperCommandTypeFilterScanList) {
            // 遍历 WiFi 列表,打印基本信息
            for (network in cmd.networkList) {
                NSString* wifiInfoString = [[NSString alloc] initWithFormat: @"---------------------------\nSSID: %@\nMac地址: %@\n信号强度: %f\nCommandType:%ld\n---------------------------\n\n", network.SSID, network.BSSID, network.signalStrength, (long)cmd.commandType];
                NSLog(@"%@", wifiInfoString);

                // 检测到指定 WiFi 可设定密码直接连接
                if ([network.SSID isEqualToString: @"测试 WiFi"]) {
                    [network setConfidence: kNEHotspotHelperConfidenceHigh];
                    [network setPassword: @"123456789"];
                    NEHotspotHelperResponse *response = [cmd createResponse: kNEHotspotHelperResultSuccess];
                    NSLog(@"Response CMD: %@", response);
                    [response setNetworkList: @[network]];
                    [response setNetwork: network];
                    [response deliver];
                }
            }
        }
    }];

    // 注册成功 returnType 会返回一个 Yes 值,否则 No
    NSLog(@"3.Result: %@", returnType == YES ? @"Yes" : @"No");
}

六. 演示

唔,Demo 运行效果如下,点击 Open WiFi Setting 按钮可直接打开 无线局域网 页面:

运行效果

具体可尝试下载 Demo 并完成相应配置后体验:https://github.com/EyreFree/EFNEHotspotHelperDemo

七. 备注

参考以下资料完成本 Demo,在此表示感谢:

IOS NetworkExtension 框架使用笔记
iOS NEHotspotHelper使用
iOS-NetworkExtension-NEHotspotHelper
API Reference - NetworkExtension


本文链接:http://www.jianshu.com/p/14da35d0b74b

2019-04-15 16:04:11 CC1991_ 阅读数 5865

前段时间在开发过程中遇到一个问题,就是之前设置的获取手机连接WiFi名称的方法不起作用了,后来经查发现是因为新系统需要申请开启相对应的权限才能获取到手机连接的WiFi名称等信息,本章就来讲一下iOS12.0以上系统获取WiFi名称的方法。

一、iOS12.0以下系统获取WiFi名字和mac地址信息的方法

在iOS有关WiFi开发中,苹果官方提供了NetworkExtension框架让iOS开发者实现VPN以及WiFi热点相应的功能,虽然在iOS9.0系统以后,这个框架的很多功能都被苹果官方屏蔽,想要使用这些被屏蔽的功能,需要开发者去申请权限才能用,但是简单的获取WiFi名字和WiFi的mac地址信息等方法还是可以正常使用的。

1、获取WiFi相关信息的时候需要引入一下头文件

#import <SystemConfiguration/CaptiveNetwork.h>

#import <NetworkExtension/NetworkExtension.h>

想要获取iPhone手机连接到的WiFi名字和WiFi的mac地址,需要用到CNCopySupportedInterfaces和CNCopyCurrentNetworkInfo两个类,具体的实现方法如下所示:

①获取SSID(Service Set Identifier):服务集标识,即WiFi网络的名称。

+ (NSString *)wiFiName {

    NSArray *wiFiName = CFBridgingRelease(CNCopySupportedInterfaces());

    id info1 = nil;

    for (NSString *wfName in wiFiName) {

        info1 = (__bridge_transfer id)CNCopyCurrentNetworkInfo((CFStringRef) wfName);

        if (info1 && [info1 count]) {

            break;

        }

    }

    NSDictionary *dic = (NSDictionary *)info1;

    NSString *ssidName = [[dic objectForKey:@"SSID"] lowercaseString];

    return ssidName;

}

 

②获取BSSID,即WiFi的mac地址。

+ (NSString *)wifiMac {

    NSArray *wfMac = CFBridgingRelease(CNCopySupportedInterfaces());

    id info1 = nil;

    for (NSString *macName in wfMac) {

        info1 = (__bridge_transfer id)CNCopyCurrentNetworkInfo((CFStringRef) macName);

        if (info1 && [info1 count]) {

            break;

        }

    }

    NSDictionary *dic = (NSDictionary *)info1;

    NSString *wifiMac = [dic objectForKey:@"BSSID"];

    return wifiMac;

}

 

 

二、iOS12.0以上系统获取WiFi信息的方法

1、苹果开发者官网官方的解释如下:

Important

To use this function in iOS 12 and later, enable the Access WiFi Information capability for your app in Xcode. When you enable this capability, Xcode automatically adds the Access WiFi Information entitlement to your entitlements file and App ID.

重要提示

要在iOS 12及以后系统中使用此功能,请在Xcode中为应用程序启用WiFi信息访问功能。当您启用此功能时,Xcode会自动将访问WiFi信息权限添加到您的权限文件和应用程序App ID中。

 

2、步骤

通过上面的苹果的官方解释可以知道,要想在iOS12.0及以上系统中继续使用该方法,就需要申请获取授权。若使用的是自动签名,授权之后Xcode会自动在App ID和应用的权限列表中增加WiFi使用的权限。若使用的是手动签名,则还需要去App ID中配置一下权限,并生成新的profile文件。具体的操作步骤如下所示:

设置Xcode里面Capabilities的步骤:Target —> Capabilities —> Access WiFi Information —> ON

 

若项目使用的是手动签名,则在上面打开Access WiFi Information选项之后,会造成Add the Access WiFi Information feature to your App ID这一项会报错,需要开发者手动去App ID账号中操作设置。具体操作步骤如下所示:

打开添加Access WiFi Information之后,项目会在.entitlements文件中添加Access WiFi Information信息,如果创建的时候没有.entitlements文件,会同时创建该文件。

操作以上步骤之后,在iOS12.0及以上系统中获取WiFi名字和WiFi的mac信息的方法就可以正常获使用了。若采用的是手动签名,需要在开发者账号中找到App IDs,并配置Access WiFi Information,编辑App ID,勾选相应的选项,然后保存即可。具体操作步骤如下所示:

 

最后再重新生成项目的Provisioning Profiles文件,包括Distribution的和Development两个不同的模式,下载双击打开,项目就可正常签名,就可以正常的获取到手机连接的WiFi的相关信息了。

3、使用场景实例

以下实例是按照实际使用场景来说明的,具体如下所示:

 

以上就是本章全部内容,欢迎关注三掌柜的微信公众号、微博,欢迎关注!

三掌柜的微信公众号:

三掌柜的新浪微博:

 

ios笔记

阅读数 190

没有更多推荐了,返回首页