獲取當(dāng)前設(shè)備連接WiFi:
ios5之前可以通過讀取配置文件獲取洲敢,ios5以后蘋果修改wifi列表文件位置慎玖,只有root權(quán)限才可以讀取.
ios4:/System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager
ios5:/System/Library/SystemConfiguration/IPConfiguration.bundle/IPConfiguration
iOS4.1之后 : CNCopySupportedInterfaces()
1.引用頭文件<SystemConfiguration/CaptiveNetwork.h>
2.通過CNCopySupportedInterfaces獲取wifi列表巨朦,實(shí)際測試中返回?cái)?shù)組中只有一個(gè)值叮叹,即當(dāng)前連接的wifi。
+ (NSString *)getWifiSSID {
NSString *ssid = nil;
NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
for (NSString *ifnam in ifs) {
NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
if (info[@"SSID"]) {
ssid = info[@"SSID"];
}
}
return ssid;
}
出現(xiàn)問題 :
Xcode10正式版在9月17號發(fā)布, 使用最新版的Xcode編譯某項(xiàng)目發(fā)現(xiàn)App在iOS 12中無法獲取WiFi的SSID.
發(fā)現(xiàn) : 在iOS 12中,經(jīng)斷點(diǎn)調(diào)試發(fā)現(xiàn)info為nil话侄。猜測是CNCopyCurrentNetworkInfo方法在iOS 12中有了變化闹获。通過查看官方文檔,發(fā)現(xiàn)文檔中增加了Important字樣的描述:
Impotant.png
解決方法:
注意 : WiFi信息只有在真機(jī)上才能獲取下來,在模擬器上為NULL
1.開發(fā)者證書上配置ID支持Access WiFi Information的能力
2.Xcode配置 : Xcode -> [Project Name] -> Targets -> [Target Name] -> Capabilities -> Access WiFi Information -> ON
3.出現(xiàn).entitlements文件,修改為Access WiFi Information為YES
Snip20181219_2.png
Snip20181219_3.png
至此颜懊,就能在iOS 12+中正常獲取到WiFi的SSID了.
更新: 在iOS13之后WiFi的SSID的獲取
在iOS13中, CNCopyCurrentNetworkInfo進(jìn)行了更新, 不僅要在Access WiFi Information設(shè)置為YES的情況下, 還需要符合下列三項(xiàng)條件中的至少一項(xiàng)才會(huì)返回正確的 CNCopyCurrentNetworkInfo 函數(shù)值财岔,否則仍然會(huì)返回 nil.
- The app uses Core Location, and has the user’s authorization to use location information.
- The app uses the NEHotspotConfiguration API to configure the current Wi-Fi network.
- The app has active VPN configurations installed.
即::
- 使用定位功能,并且獲得了定位服務(wù)權(quán)限的應(yīng)用河爹;
- 使用NEHotspotConfiguration配置過的Wi-Fi匠璧;
- 應(yīng)用程序已安裝有效的VPN配置
至少要滿足其一, 接下來以開啟定位功能為例:
- 首先, 開啟WiFi權(quán)限的界面稍有改動(dòng):
image.png- 設(shè)置可獲取WiFi信息:
image.png- info.plist文件中添加定位服務(wù)權(quán)限:
image.png- 獲取地理位置信息:
image.png- 最后通過上文提到的getWifiSSID方法就可以獲取到WiFi的SSID了.
其實(shí), 在想要獲取WiFi的相關(guān)信息之前, 如果APP已經(jīng)滿足以上三點(diǎn)中的任意一點(diǎn)的話, 其實(shí)就能正常獲取到info的信息了.
.End