ios - 如何使用 iOS 13 在 iOS 设备中获取 SSID
问题描述
我有一个 Objective-C iPhone 应用程序,目前我正在使用下面的代码来获取连接的 Wifi 名称。但它在 iOS 13 中不起作用。如何在 iOS 13 中获取连接的 Wifi SSID?
目前我在 Swift 中使用以下代码:
public class SSID {
class func fetch() -> String {
var currentSSID = ""
if let interfaces = CNCopySupportedInterfaces() {
for i in 0..<CFArrayGetCount(interfaces) {
let interfaceName = CFArrayGetValueAtIndex(interfaces, i)
let rec = unsafeBitCast(interfaceName, to: AnyObject.self)
let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)" as CFString)
if let interfaceData = unsafeInterfaceData as? [String: AnyObject] {
currentSSID = interfaceData["SSID"] as! String
let BSSID = interfaceData["BSSID"] as! String
let SSIDDATA = interfaceData["SSIDDATA"] as! String
debugPrint("ssid=\(currentSSID), BSSID=\(BSSID), SSIDDATA=\(SSIDDATA)")
}
}
}
return currentSSID
}
}
但此代码在 iOS 13 中返回 nil,提前致谢!
解决方案
使用 iOS 14 上提供的代码,我收到以下错误:
nehelper sent invalid result code [1] for Wi-Fi information request
搜索那个错误把我带到了这个问题
解决方案:
请求应用程序必须满足以下要求之一:
该应用程序使用核心位置,并具有用户使用位置信息的授权。
该应用程序使用 NEHotspotConfiguration API 来配置当前的 Wi-Fi 网络。
该应用程序已安装有效的 VPN 配置。
未能满足上述任何要求的应用会收到以下返回值:
与 iOS 12 或更早版本链接的应用程序会收到带有伪值的字典。在这种情况下,SSID 为 Wi-Fi(或中国地区的 WLAN),BSSID 为 00:00:00:00:00:00。
与 iOS 13 或更高版本关联的应用会收到 NULL。
重要的
要使用此功能,与 iOS 12 或更高版本关联的应用必须在 Xcode 中启用 Access WiFi Information 功能。
我还确认,一旦您请求位置许可,这实际上适用于 iOS 14。
import CoreLocation
import UIKit
import SystemConfiguration.CaptiveNetwork
final class ViewController: UIViewController {
var locationManager: CLLocationManager?
override func viewDidLoad() {
super.viewDidLoad()
locationManager = CLLocationManager()
locationManager?.delegate = self
locationManager?.requestAlwaysAuthorization()
}
func getWiFiName() -> 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
}
}
extension ViewController: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == .authorizedAlways || status == .authorizedAlways {
let ssid = self.getWiFiName()
print("SSID: \(String(describing: ssid))")
}
}
}
输出:SSID: YaMomsWiFi
不要忘记在您的 plist 中包含 wifi 权利和必要的密钥以获得位置许可。
推荐阅读
- java - java:使用 BouncyCastle 验证 Ed25519 签名未按预期工作
- c - (C DSA) 为什么在 fgetc() 读取并搜索时,使用 fputc() 写入的字符位置偏移 1?
- python - Discord.py 中 cog 的延迟未被识别为有效属性
- android - Android ListView FindViewById 混淆
- python - 在服务器上无限运行 python 脚本
- javascript - 如何保存此表单以备后用,以 JSON 格式存储序列化数据?
- javascript - 当值未定义时,保持输入状态会中断应用程序
- javascript - 如何检查最近用jquery悬停的元素
- git - 错误:将“.git”转换为绝对错误:访问被拒绝
- scala - Scala:Nothing 和 throw 表达式