iOS 飞行模式下 13 个 wifi ssid

iOS 13 wifi ssid in airplane mode

我目前正在根据从 CNCopyCurrentNetworkInfo 返回的内容更新我的应用程序。我了解 Apple 从 iOS 13 开始就此实施的隐私更改,因此我目前正在更新实施。

这很简单。然而,我 运行 遇到的问题是在应用程序的这一部分内,用户可能处于飞行模式(飞行中的应用程序)。不管 CLLocationManager.authorizationStatus(),即使它是 .notDetermined 然后触发 requestWhenInUseAuthorization() 方法并且一旦用户选择 "Allow Once" 或 "Allow while Using App",我仍然无法获取 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。当它不处于飞行模式时,它会按预期工作,并且 returns ssid 或无效字符串取决于用户是否允许定位服务。

我的问题是如何才能在飞行模式下运行它?也许我遗漏了什么,但在这一点上不太确定。

在 iOS13 中,可能还有更早的版本(我没有立即可用的版本进行测试),一旦您启用 "Airplane mode,",WiFi 将自动断开连接。

最终用户需要在其设备上主动重新启用 WiFi 才能重新连接,同时仍启用飞行模式。

您的 if 语句没有被执行,可能是因为还没有网络信息。重新启用 WiFi 应该会得到预期的结果。