iOS:在 Testflight 上获取当前的 WiFi SSID 始终为零

Dom*_*yan 5 wifi ios testflight captivenetwork swift

下面是我用来获取当前 WiFi SSID 并将其显示在我的应用程序中的代码。

我将位置权限设置为始终,以及所需的 Privacy info.plist 值。我也有Access WiFi Information能力添加到我的项目中。当我将应用程序从 Xcode 构建到我的 iPhone(不是模拟器)时,它工作正常,我可以看到我的 WiFi SSID。但是,当我通过 Testflight 分发应用程序时,它不再起作用,它什么也没有返回。

import SystemConfiguration.CaptiveNetwork

private func getWiFiSsid() -> 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
    }
Run Code Online (Sandbox Code Playgroud)

下面是我从 ipa 文件中解压缩的权利的屏幕截图,显示我确实设置了访问 WiFi 信息: 无线上网权限

iUr*_*rii 4

由于CNCopyCurrentNetworkInfo从 iOS 14 ( https://developer.apple.com/documentation/systemconfiguration/1614126-cncopycurrentnetworkinfo ) 开始已弃用,请考虑迁移到NEHotspotNetwork.fetchCurrent,我们可以在用户授权的情况下使用此方法来访问精确位置,例如:

import CoreLocation
import NetworkExtension

var locationManager: CLLocationManager?

...

locationManager = CLLocationManager()
locationManager?.delegate = self
locationManager?.requestAlwaysAuthorization()

...

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    if status == .authorizedAlways || status == .authorizedWhenInUse {
        NEHotspotNetwork.fetchCurrent { hotspotNetwork in
            if let ssid = hotspotNetwork?.ssid {
                print(ssid)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:您必须Access WiFi Information在权利文件Privacy - Location Always and When In Use Usage DescriptionPrivacy - Location When In Use Usage DescriptionInfo.plist 中设置为 YES。