【发布时间】:2019-08-27 18:35:48
【问题描述】:
我目前正在更新我的应用程序,了解从 CNCopyCurrentNetworkInfo 返回的内容。我了解 Apple 从 iOS 13 开始对此实施的隐私更改,因此我目前正在更新实施。
这很简单。但是我遇到的问题是在应用程序的这一部分中,用户可能会处于飞行模式(飞行中的应用程序)。不管 CLLocationManager.authorizationStatus() 是什么,即使它是 .notDetermined 会触发 requestWhenInUseAuthorization() 方法,并且一旦用户选择“允许一次”或“使用应用程序时允许”,我仍然无法获得无线网络连接。
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 或无效字符串,具体取决于用户是否允许定位服务。
我的问题是如何在飞行模式下让它工作?也许我错过了什么,但目前还不太确定。
【问题讨论】:
-
所以,我刚刚在 iOS13 中做了一个测试(在删除了之前的评论之后)。进入飞行模式(可能在以前的 iOS 版本中也是如此)会立即断开手机与蜂窝网络和 WiFi 的连接。虽然您可以重新启用 WiFi,但它会在启用飞行模式后自动禁用(对我而言)。如果您主动重新启用 WiFi(但保持飞行模式开启),这会改变您的结果吗?
-
@gravity 啊,我真傻!我真的没有想到这一点。差不多就是这样。它确实改变了我的结果。谢谢!你可以继续发布这个作为答案!
-
我很高兴这是一个简单的修复。即使我很困惑,因此一旦我观察到这种行为,我就删除了评论。干杯!
标签: swift core-location xcode10 ios13