苹果提供了NetworkExtension框架让开发者实现VPN以及WiFi热点相应的功能,虽然iOS9系统出来之后,这个框架的很多功能被苹果屏蔽了,需要申请权限才能用,但是今天介绍的的获取WiFi名字和mac地址信息的方法还是可以用的。
获取WiFi相关信息的时候需要引入一下头文件
#import <SystemConfiguration/CaptiveNetwork.h>
#import <NetworkExtension/NetworkExtension.h>
实现方法如下:
1、获取SSID(Service Set Identifier),服务集标识,也就是WiFi网络所取的名字。
+ (NSString *)wifiName
{
NSArray *ifs = CFBridgingRelease(CNCopySupportedInterfaces());
id info = nil;
for (NSString *ifname in ifs) {
info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((CFStringRef) ifname);
if (info && [info count]) {
break;
}
}
NSDictionary *dic = (NSDictionary *)info;
NSString *ssid = [[dic objectForKey:@"SSID"] lowercaseString];
return ssid;
}
2、获取BSSID即mac地址。
+ (NSString *)wifiMac
{
NSArray *ifs = CFBridgingRelease(CNCopySupportedInterfaces());
id info = nil;
for (NSString *ifname in ifs) {
info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((CFStringRef) ifname);
if (info && [info count]) {
break;
}
}
NSDictionary *dic = (NSDictionary *)info;
NSString *bssid = [dic objectForKey:@"BSSID"];
return bssid;
}
返回获取到的结果如下:
SSID = mywifiname
BSSID = e3:fc:40:38:ac:e6
这个方法在iOS12以下的系统完全可以胜任我们的任务,但是iOS12+的系统无法正常获取到WiFi信息。苹果对方法的使用提升了要求。
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会自动在App ID和应用的权限列表中增加获取WiFi信息的权限。
通过上面我们可以了解到,要在iOS12以上的系统中继续使用方法,就需要获取授权。如果你使用的是自动签名,授权之后Xcode会自动在App ID和应用的权限列表中增加WiFi的权限。如果你使用的是手动签名,可能还需要去App ID中配置一下权限,并生成新的profile文件。
具体的操作如下:
设置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+的系统中获取WiFi名字和mac信息的方法就可以正常获取信息了。
如果采用的是手动签名,App ID中配置Access WiFi Information的方法如下,编辑App ID,勾选相应的选项。
然后重新生成项目的Provisioning Profiles文件,包括Distribution的和Development的,下载之后双击打开,项目就可以正常签名,并获取到WiFi信息了。