iOS 获取手机当前连接的 WiFi 信息
作者:掘金 形影相吊
https://juejin.cn/post/7032853944170709006
一、应用背景
物联网开发中,对设备进行配网时需要打开手机的WiFi功能,并且连接上相应的设备WiFi热点,把家庭的WiFi名称和密码通过TCP连接或UDP广播的方式发送给设备。设备接入到家庭的WiFi名称和密码后就可以连接上家庭WiFi,将设备注册到云端,从而实现设备上云。那么在iOS中,我们如何获取手机当前连接的WiFi信息呢?
二、前提
iOS中要获取手机当前连接的WiFi信息,iOS13.0之后必须先打开定位,iOS14.0之前还要打包精准位置,详情可以参考iOS精确位置,然后去设置APP连接上任意的WiFi。
三、获取方式
1.获取SSID---WiFi名称
+ (NSString *)getWifiSSID {
NSString *ssid = nil;
CFArrayRef arrRef = CNCopySupportedInterfaces();
NSArray *ifs = ( __bridge id)arrRef;
for (NSString *ifnam in ifs) {
CFDictionaryRef dicRef = CNCopyCurrentNetworkInfo(( __bridge CFStringRef)ifnam);
NSDictionary *info = ( __bridge id)dicRef;
if (info[@"BSSID"]) {
ssid = info[@"SSID"];
}
if(dicRef !=nil) {
CFRelease(dicRef);
}
}
if(arrRef != nil) {
CFRelease(arrRef);
}
return ssid;
}
2.获取BSSID---WiFi的MAC
+ (NSString *)getWifiBSSID {
NSString *bssid = @"";
CFArrayRef arrRef = CNCopySupportedInterfaces();
NSArray *ifs = ( __bridge id)arrRef;
for(NSString *ifnam in ifs) {
CFDictionaryRef dicRef = CNCopyCurrentNetworkInfo(( __bridge CFStringRef)ifnam);
NSDictionary *info = ( __bridge id)dicRef;
if (info[@"BSSID"]) {
bssid = info[@"BSSID"];
}
if(dicRef != nil) {
CFRelease(dicRef);
}
}
if (arrRef != nil) {
CFRelease(arrRef);
}
return bssid;
}
四、写在最后的重点
iOS中提供了快速获取手机当前连接的WiFi的信息,可以方便我们快速设置wifi信息和密码完成为智能设备的联网;但这只是其中的一种方式,而直接获取手机当前连接的wifi的方式也存在配网失败的风险。
目前大部分的设备只支持2.4G频段的WiFi,5G频段的WiFi设备是无法完成联网操作的,而手机是可以同时支持2.4G和5G的;所以如果手机当前连接的是5G频段的WiFi,我们是无法使用其为设备完成联网操作的。这里提供一些其他设置配网wifi的方式:
-
1.手机输入WiFi名称:这种方式出错率太高,并且非常不友好,不过可以作为系统原因或用户设置原因(如未开启定位或精确位置时)导致无法通过上面的方法获取到手机连接的WiFi信息时的兜底方案; 2.模块支持搜索附近WiFi:这种方式需要设备内置的联网模块本身支持搜索附近的WiFi热点,并且最好同时支持蓝牙,可以方便通过蓝牙连接把设备搜索到的WiFi信息发送给手机app,手机端可以选择设置已经发现的热点,设置密码后即可进行对设备的配网。这种方式就不要求手机是否开启定位,甚至不需要手机连接了WiFi,而且不用考虑是否是5G频段的WiFi,因为设备能搜索到的WiFi热点肯定也支持连接WiFi热点了;不过这种方式成本高,需要设备同时支持WiFi模块和蓝牙模块。
-End-
最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!
面试题
】即可获取