描述
本篇重点是描述获取wifi SSID过程中遇到的坑,以帮助遇到同样问题的人。
开发
首先先列一下获取SSID的代码:(swift代码)
/** 获取Wifi Ssid */
public func getSsid() -> String? {
if let interface : CFArray = CNCopySupportedInterfaces() {
NSLog("\(interface)");
for i in 0..<CFArrayGetCount(interface) {
let interfaceName: UnsafeRawPointer = CFArrayGetValueAtIndex(interface, i);
NSLog("\(interfaceName)");
let rec = unsafeBitCast(interfaceName, to: AnyObject.self)
if let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)" as CFString), let interfaceData = unsafeInterfaceData as? [String : AnyObject] {
if let ssid = interfaceData["SSID"] as? String {
return ssid
}
}
}
}
return nil;
}
代码挺简单的,这样就直接可以获取到当前手机链接的wifi名称。
但是在iOS 12.0 + 之后,苹果官方增加了获取wifi的权限,具体说明可以查看 CNCopyCurrentNetworkInfo 的官方文档说明:
Important
To use this function in iOS 12 and later, enable the Access WiFi Information capability for your app in Xcode. When you enable this capability, Xcode automatically adds the Access WiFi Information entitlement to your entitlements file and App ID.
在iOS 12.0+之后,需要打开Access WiFi Information capability这个开关才能正确获取到 WiFi 信息。
打开开关的方式有两种:
( 1 )Xcode
这种方式最简单,Xcode -> Targets -> Capabilities,如下图所示,直接点击打开
打开之后Xcode也会同步到AppID的设置
( 2 )Apple Developer(苹果开发者中心)
操作步骤如下图:(用第一种方法(Xcode)操作的话,Xcode也会自动同步状态到开发者中心对应AppID的开关的)
可能出现的问题
1、CNCopyCurrentNetworkInfo返回为NULL
解决方法:
(1)首先检查 AppID 的 Access WiFi Information 开关。
(2)如果是出现在用户使用App时出现的情况,而这种情况只出现在部分手机上(大部分手机能成功获取),那么有可能是这些手机iOS系统的 wifid 模块 crash 了(因为某种原因),这样会导致CNCopyCurrentNetworkInfo返回NULL。解决方法: Settings -> General(通用)-> reset(还原)-> Reset Network Settings(还原网络设置),还原之后手机系统就可以重启 wifid 模块,CNCopyCurrentNetworkInfo就能成功获取了,不过这样会导致用户手机需要重新输入密码连接WIFI。(解决方法原文)