Fix CNCopyCurrentNetworkInfo() does NOT work in iOS13 and later
import Foundation
import SystemConfiguration.CaptiveNetwork
func getSSID() -> String? {
var ssid: String?
if let interfaces = CNCopySupportedInterfaces() as NSArray? {
for interface in interfaces {
if let interfaceInfo = CNCopyCurrentNetworkInfo(interface as! CFString) as NSDictionary? {
ssid = interfaceInfo[kCNNetworkInfoKeySSID as String] as? String
break
}
}
}
return ssid
}
To use
CNCopyCurrentNetworkInfo()
in iOS 12 and later, enable the Access WiFi Information capability in Xcode. For more information, see Access WiFi Information Entitlement.
Watch WWDC19 Session 713: Advances in Networking, Part 2.
Now you all know the important privacy to Apple. And one of the things we realized. Is that... Accessing Wi-Fi information can be used to infer location.
So starting now, to access that Wi-Fi information. You'll need the same kind of privileges that you'll need to get other location information.
Requires Capability: Access Wi-Fi Information
Must also meet at least one of criteria below
- Apps with permission to access location
- Currently enabled VPN app
- NEHotspotConfiguration (only Wi-Fi networks that the app configured)
Otherwise, returns nil
Import Core Location framework
import CoreLocation
Function to update UI
func updateWiFi() {
print("SSID: \(currentNetworkInfos?.first?.ssid)")
ssidLabel.text = getSSID()
}
Ask location permission
if #available(iOS 13.0, *) {
let status = CLLocationManager.authorizationStatus()
if status == .authorizedWhenInUse {
updateWiFi()
} else {
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
}
} else {
updateWiFi()
}
Implement CLLocationManagerDelegate
class ViewController: UIViewController, CLLocationManagerDelegate {
...
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == .authorizedWhenInUse {
updateWiFi()
}
}
...
}
If your app uses CNCopyCurrentNetworkInfo()
and needs to solve the issue. Solve it now. There's no need to wait for Xcode 11 GM. The solution above is Xcode 10 compatible.