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

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

}



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



2019-10-09 10:35:13 ccnu027cs 阅读数 19

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

 


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

 

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

 

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

 

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

件:

 

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

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

 

 

b. 添加iCloud 和Wireless Accessory

添加iCloud 和Wireless Accessory.png

c.新建iCloud Containers

新建iCloud Containers.png

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

 

 

编辑刚刚创建的AppID.png

 

e


 

f

g 配置App ID完成

 

 

2-2 配置描述文件 .

配置好这个之后,可以到苹果提供的检测环境检测一下配置文件的正确性
附上网址 :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界面,才能在控制台查看打印信息的.

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

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 已经覆盖很广了。

2014-12-22 13:02:54 hong1595 阅读数 742

SSID全称Service Set IDentifier, 即Wifi网络的公开名称.在IOS 4.1以上版本提供了公开的方法来获取该信息.

[html] view plaincopy
  1. #import <SystemConfiguration/CaptiveNetwork.h>  

[html] view plaincopy
  1. -(id)fetchSSIDInfo  
  2. {  
  3.     NSArray *ifs = (id)CNCopySupportedInterfaces();  
  4.     NSLog(@"%s: Supported interfaces: %@", __func__, ifs);  
  5.     id info = nil;  
  6.     for (NSString *ifnam in ifs) {  
  7.         info = (id)CNCopyCurrentNetworkInfo((CFStringRef)ifnam);  
  8.         if (info && [info count]) {  
  9.             break;  
  10.         }  
  11.         [info release];  
  12.     }  
  13.     [ifs release];  
  14.     return [info autorelease];  
  15. }  
  16.   
  17. - (NSString *)currentWifiSSID {  
  18.     // Does not work on the simulator.  
  19.     NSString *ssid = nil;  
  20.     NSArray *ifs = (  id)CNCopySupportedInterfaces();  
  21.     NSLog(@"ifs:%@",ifs);  
  22.     for (NSString *ifnam in ifs) {  
  23.         NSDictionary *info = (id)CNCopyCurrentNetworkInfo((CFStringRef)ifnam);  
  24.         NSLog(@"dici:%@",[info  allKeys]);  
  25.         if (info[@"SSIDD"]) {  
  26.             ssid = info[@"SSID"];  
  27.               
  28.         }  
  29.     }  
  30.     return ssid;  
  31. }  
  32.   
  33. - (void)viewDidLoad  
  34. {  
  35.     [super viewDidLoad];  
  36.       
  37.     tempLabel=[[UILabel alloc]initWithFrame:CGRectMake(50, 40, 200, 40)];  
  38.     tempLabel.textAlignment=NSTextAlignmentCenter;  
  39.     [self.view addSubview:tempLabel];  
  40.     NSDictionary *ifs = [self fetchSSIDInfo];  
  41.     NSString *ssid = [[ifs objectForKey:@"SSID"] lowercaseString];  
  42.     tempLabel.text=ssid;  
  43.    
  44. }  


log 信息 :

[html] view plaincopy
  1. 2013-06-05 21:39:14.357 wifiNameDemo[9877:707] dici:{  
  2.     BSSID = "f4:ec:38:40:cc:e8";  
  3.     SSID = "Nice_Apple";  
  4.     SSIDDATA = <4e696365 5f417070 6c65>;  
  5. }  
  6. 2013-06-05 21:39:14.360 wifiNameDemo[9877:707] Nice_Apple  

 ARC 版本:

[html] view plaincopy
  1. - (id)fetchSSIDInfo {  
  2.     NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();  
  3.     NSLog(@"Supported interfaces: %@", ifs);  
  4.     id info = nil;  
  5.     for (NSString *ifnam in ifs) {  
  6.         info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);  
  7.         NSLog(@"%@ => %@", ifnam, info);  
  8.         if (info && [info count]) { break; }  
  9.     }  
  10.     return info;  
  11. }  

  效果如下:

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

前段时间在开发过程中遇到一个问题,就是之前设置的获取手机连接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、使用场景实例

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

 

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

三掌柜的微信公众号:

三掌柜的新浪微博:

 

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