如何解决iOS:在Testflight上获取最新的WiFi SSID始终为零
下面是我用来获取当前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
}
以下是我从ipa文件中解包的权利的屏幕截图,显示我确实设置了Access WiFi Information:
解决方法
虽然没有明确记录。您不需要来自 NEHotspotHelper 的特殊权利。您需要:
- 访问 WiFi 信息 = YES(在权利中,手动添加或通过目标的 xcode 签名和功能添加)
- 隐私 - 位置始终和使用时的使用说明(在 Info.plist 中)
- 隐私 - 使用时的位置使用说明(在 Info.plist 中)
- 通过以下方式授予位置访问权限
-
locationManager = CLLocationManager() locationManager?.requestAlwaysAuthorization()
-
由于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)
}
}
}
}
注意:您还必须在Info.plist中的权利文件Access WiFi Information
和Privacy - Location Always and When In Use Usage Description
中将Privacy - Location When In Use Usage Description
设置为YES。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。