我目前正在根据CNCopyCurrentNetworkInfo返回的内容更新我的应用程序。我了解Apple在iOS 13上针对此实施的隐私更改,因此我目前正在更新实施。
这很简单。但是,我遇到的问题在应用程序的这一部分内,用户可能处于飞行模式(飞行中的应用程序)。无论CLLocationManager.authorizationStatus()是什么,即使它是.notDetermined然后触发了requestWhenInUseAuthorization()方法,并且一旦用户选择“允许一次”或“在使用应用程序时允许”,我仍然无法获取Wi-Fi ssid。
static func fetchSSIDInfo() -> String? {
if isSimulator() {
return "wireless"
} else {
if let interfaces: CFArray = CNCopySupportedInterfaces() {
for i in 0..<CFArrayGetCount(interfaces) {
let interfaceName: UnsafeRawPointer = CFArrayGetValueAtIndex(interfaces, i)
let rec = unsafeBitCast(interfaceName, to: AnyObject.self)
// skips this in airplane mode
if let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)" as CFString) {
if let interfaceData = unsafeInterfaceData as Dictionary? {
let ssid = interfaceData["SSID" as NSObject] as? String
let bssid = interfaceData["BSSID" as NSObject] as? String
if ssid != "Wi-Fi" && bssid != "00:00:00:00:00:00" {
return ssid
} else {
return "invalid"
}
}
}
}
}
}
return nil
}
在上面的代码中,当处于飞行模式时,它实际上跳过if let unsafeInterfaceData。当它不在飞行模式下时,它将按预期工作,并根据用户是否允许位置服务返回ssid或无效字符串。
我的问题是我如何才能在飞行模式下工作?也许我缺少了一些东西,但目前还不太确定。
答案 0 :(得分:1)
在iOS13和可能的较早版本(我尚无法立即进行测试)中,一旦启用“飞行模式”,WiFi就会自动断开连接。
最终用户需要在仍启用飞行模式的情况下主动重新启用设备上的WiFi才能重新连接。
您的if
语句未得到执行,可能是因为尚无网络信息。重新启用WiFi应该可以为您带来预期的效果。