最近做了一个WiFi的硬件APP,需要用到当前手机链接的WiFi名字和Mac地址,这种场景使用,其实,在打卡软件中,应该比较常用,比如打卡需要连接到公司的WiFi,就是保证你在办公室打的卡。
刚开始使用的时候,以为就像别人说的需要,想苹果申请访问权限,实际上如果只是想获取当前访问的WiFi名称和Mac地址,是不用申请的。
使用
需要添加系统库SystemConfiguration.framework,并且,在需要使用的文件中引用#import <SystemConfiguration/CaptiveNetwork.h>
CFArrayRef __nullable CNCopySupportedInterfaces (void)API_AVAILABLE(macos(10.8), ios(4.1)) API_UNAVAILABLE(tvos, watchos);
CFDictionaryRef __nullable CNCopyCurrentNetworkInfo (CFStringRef interfaceName) API_AVAILABLE(ios(4.1)) API_UNAVAILABLE(macos, tvos, watchos);
kCNNetworkInfoKeySSIDData ->当前的SSID,CFData格式
kCNNetworkInfoKeySSID ->当前连接的WiFi的名字 CFString格式
kCNNetworkInfoKeyBSSID->当前WiFi的Mac地址 CFString格式
-(void)getWiFiInfo{
NSArray * supports = (__bridge_transfer id)CNCopySupportedInterfaces();
id SSID = nil;//WiFi标示
id BSSID = nil;
id info = nil;
id SSIDDATA = nil;
for(NSString * idf in supports){
info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((CFStringRef)idf);
if (info&&[info count]) {
break;
}
}
SSID = [info objectForKey:@"SSID"];
BSSID = [info objectForKey:@"BSSID"];
SSIDDATA = [info objectForKey:@"SSIDDATA"];
// NSData * data = (__bridge NSData*)SSIDDATA;
NSLog(@"%@",[[NSString alloc]initWithData:SSIDDATA encoding:NSUTF8StringEncoding]);
NSLog(@"SSID***%@",SSID);
NSLog(@"BSSID***%@",BSSID);
NSLog(@"SSIDDATA***%@",SSIDDATA);
}
遇见的坑:iOS 12.0以上 在调试时,发现获取的数据是nil,这是因为iOS12.0系统对方法CNCopyCurrentNetworkInfo做了变更,可以查看苹果的开发者文档。
也就是说iOS 12.0以上,如果需要访问WiFi信息的话,可以在bundleID里面,开通Access WIFi Information功能,同时,也需要在你的项目打开这个功能。
解决方案:
Xcode -> [Project Name] -> Targets -> [Target Name] -> Capabilities -> Access WiFi Information -> ON
工程中会多了一个.entitlements文件