描述
本篇重點(diǎn)是描述獲取wifi SSID過程中遇到的坑蝌借,以幫助遇到同樣問題的人。
開發(fā)
首先先列一下獲取SSID的代碼:(swift代碼)
/** 獲取Wifi Ssid */
public func getSsid() -> String? {
if let interface : CFArray = CNCopySupportedInterfaces() {
NSLog("\(interface)");
for i in 0..<CFArrayGetCount(interface) {
let interfaceName: UnsafeRawPointer = CFArrayGetValueAtIndex(interface, i);
NSLog("\(interfaceName)");
let rec = unsafeBitCast(interfaceName, to: AnyObject.self)
if let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)" as CFString), let interfaceData = unsafeInterfaceData as? [String : AnyObject] {
if let ssid = interfaceData["SSID"] as? String {
return ssid
}
}
}
}
return nil;
}
代碼挺簡單的,這樣就直接可以獲取到當(dāng)前手機(jī)鏈接的wifi名稱。
但是在iOS 12.0 + 之后,蘋果官方增加了獲取wifi的權(quán)限乳丰,具體說明可以查看 CNCopyCurrentNetworkInfo 的官方文檔說明:
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.0+之后,需要打開Access WiFi Information capability這個(gè)開關(guān)才能正確獲取到 WiFi 信息内贮。
打開開關(guān)的方式有兩種:
( 1 )Xcode
這種方式最簡單产园,Xcode -> Targets -> Capabilities汞斧,如下圖所示,直接點(diǎn)擊打開
打開之后Xcode也會同步到AppID的設(shè)置
( 2 )Apple Developer(蘋果開發(fā)者中心)
操作步驟如下圖:(用第一種方法(Xcode)操作的話什燕,Xcode也會自動同步狀態(tài)到開發(fā)者中心對應(yīng)AppID的開關(guān)的)
可能出現(xiàn)的問題
1粘勒、CNCopyCurrentNetworkInfo返回為NULL
解決方法:
(1)首先檢查 AppID 的 Access WiFi Information 開關(guān)。
(2)如果是出現(xiàn)在用戶使用App時(shí)出現(xiàn)的情況屎即,而這種情況只出現(xiàn)在部分手機(jī)上(大部分手機(jī)能成功獲让硭),那么有可能是這些手機(jī)iOS系統(tǒng)的 wifid 模塊 crash 了(因?yàn)槟撤N原因)技俐,這樣會導(dǎo)致CNCopyCurrentNetworkInfo返回NULL乘陪。解決方法: Settings -> General(通用)-> reset(還原)-> Reset Network Settings(還原網(wǎng)絡(luò)設(shè)置),還原之后手機(jī)系統(tǒng)就可以重啟 wifid 模塊雕擂,CNCopyCurrentNetworkInfo就能成功獲取了啡邑,不過這樣會導(dǎo)致用戶手機(jī)需要重新輸入密碼連接WIFI。(解決方法原文)