飞行模式下的 iOS 13 wifi ssid
Posted
技术标签:
【中文标题】飞行模式下的 iOS 13 wifi ssid【英文标题】:iOS 13 wifi ssid in airplane mode 【发布时间】: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 啊,我真傻!我真的没有想到这一点。差不多就是这样。它确实改变了我的结果。谢谢!你可以继续发布这个作为答案! 我很高兴这是一个简单的修复。即使我很困惑,因此一旦我观察到这种行为,我就删除了评论。干杯! 【参考方案1】:在 iOS13 和可能更早的版本(我没有立即可用的测试)中,一旦启用“飞行模式”,WiFi 会自动断开连接。
最终用户需要在其设备上主动重新启用 WiFi 以重新连接,同时仍启用飞行模式。
您的if
语句没有被执行,可能是因为还没有网络信息。重新启用 WiFi 应该可以获得预期的结果。
【讨论】:
以上是关于飞行模式下的 iOS 13 wifi ssid的主要内容,如果未能解决你的问题,请参考以下文章
飞行模式开启时 CLLocationManager 是如何获取位置的
IOS unregisterForRemoteNotifications 在飞行模式下不起作用