直到今天,我使用CaptiveNetwork接口显示当前连接的Wifi的名称。 iOS 9 Prerelease引用已经说过,CaptiveNetwork方法现在已被删除,但它们仍然在开始时工作。
有了最新版本,Apple似乎已经阻止了这个电话(可能是出于隐私问题?)。
有没有其他方法来获得当前Wifi的名称?
这就是我今天获得SSID的方式,但你现在只获得nil:
#import <SystemConfiguration/CaptiveNetwork.h>
NSString *wifiName = nil;
NSArray *interFaceNames = (__bridge_transfer id)CNCopySupportedInterfaces();
for (NSString *name in interFaceNames) {
NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)name);
if (info[@"SSID"]) {
wifiName = info[@"SSID"];
}
}
在iOS 9的GM中,似乎再次启用它。实际上,它甚至没有在在线文档中列为已弃用,但CaptiveNetwork头文件确实具有以下内容:
CNCopySupportedInterfaces (void) __OSX_AVAILABLE_BUT_DEPRECATED_MSG(__MAC_10_8, __MAC_NA, __IPHONE_4_1, __IPHONE_9_0, CN_DEPRECATION_NOTICE);
所以,它在iOS 9 GM中工作,但不确定多久:)
将您的应用注册为Hotspot助手。
#import <NetworkExtension/NetworkExtension.h>
NSArray * networkInterfaces = [NEHotspotHelper supportedNetworkInterfaces];
NSLog(@"Networks %@",networkInterfaces);
更新(2015年9月11日)
以下强制网络API已在最新版本的iOS 9中重新启用。
更新(2015年9月16日)
如果你仍然喜欢使用NetworkExtension
并且Apple允许你添加权利,那么你可以这样做来获取wifi信息:
for(NEHotspotNetwork *hotspotNetwork in [NEHotspotHelper supportedNetworkInterfaces]) {
NSString *ssid = hotspotNetwork.SSID;
NSString *bssid = hotspotNetwork.BSSID;
BOOL secure = hotspotNetwork.secure;
BOOL autoJoined = hotspotNetwork.autoJoined;
double signalStrength = hotspotNetwork.signalStrength;
}
NetworkExtension
为您提供安全,自动加入或信号强度等额外信息。它还允许您在用户扫描wifis时在背景模式下将凭据设置为wifis。
即使对于Swift 4.1和4.2,abdullahselek的答案仍然是正确的。
一个小小的警告是,现在在iOS 12中,您必须转到应用项目的功能部分并启用Access WiFi信息功能。它将为您的项目添加一个权利条目,并允许函数调用CNCopyCurrentNetworkInfo
正常工作。
如果你不这样做,那个函数只返回nil。运行时不会显示有关丢失权利的错误或警告。
有关详细信息,请参阅Apple文档下面的链接。
https://developer.apple.com/documentation/systemconfiguration/1614126-cncopycurrentnetworkinfo
在2017年4月27日确认,Captive Network仍在为Swift 3.1
工作,XCode 8.3
对于Swift> 3.0
func printCurrentWifiInfo() {
if let interface = CNCopySupportedInterfaces() {
for i in 0..<CFArrayGetCount(interface) {
let interfaceName: UnsafeRawPointer = CFArrayGetValueAtIndex(interface, i)
let rec = unsafeBitCast(interfaceName, to: AnyObject.self)
if let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)" as CFString), let interfaceData = unsafeInterfaceData as? [String : AnyObject] {
// connected wifi
print("BSSID: \(interfaceData["BSSID"]), SSID: \(interfaceData["SSID"]), SSIDDATA: \(interfaceData["SSIDDATA"])")
} else {
// not connected wifi
}
}
}
}
对于Objective-C
NSArray *interFaceNames = (__bridge_transfer id)CNCopySupportedInterfaces();
for (NSString *name in interFaceNames) {
NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)name);
NSLog(@"wifi info: bssid: %@, ssid:%@, ssidData: %@", info[@"BSSID"], info[@"SSID"], info[@"SSIDDATA"]);
}
如前所述,CaptiveNetwork与Xcode 8.3及更高版本兼容。以下是Swift 3,Swift 4和Objective-C的代码片段。
斯威夫特3和4
import SystemConfiguration.CaptiveNetwork
internal class SSID {
class func fetchSSIDInfo() -> [String: Any] {
var interface = [String: Any]()
if let interfaces = CNCopySupportedInterfaces() {
for i in 0..<CFArrayGetCount(interfaces){
let interfaceName = CFArrayGetValueAtIndex(interfaces, i)
let rec = unsafeBitCast(interfaceName, to: AnyObject.self)
guard let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)" as CFString) else {
return interface
}
guard let interfaceData = unsafeInterfaceData as? [String: Any] else {
return interface
}
interface = interfaceData
}
}
return interface
}
}
Objective-C的
#import <SystemConfiguration/CaptiveNetwork.h>
+ (NSDictionary *)fetchSSIDInfo
{
NSArray *interFaceNames = (__bridge_transfer id)CNCopySupportedInterfaces();
for (NSString *name in interFaceNames)
{
NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)name);
return info;
}
return nil;
}
CaptiveNetwork仍在运作。由于许多要求Apple可能已恢复API。
使用CaptiveNetwork,我们可以获得WiFi网络的SSID。它甚至适用于iOS 10。
#import <SystemConfiguration/CaptiveNetwork.h>
NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)name);
这是输出:
Printing description of info:
{
BSSID = "5*:**:**:**:**:**";
SSID = Cisco12814;
SSIDDATA = <43697363 6f313238 3134>;
}
CaptiveNetwork仍在运作。但是你需要添加这个:
您的Entitlements.plist中的com.apple.developer.networking.wifi-info = true。
此外,您需要在developer.apple.com门户的App ID部分中启用Access WiFi信息。
在应用程序ID中启用“访问WiFi信息”选项后,请确保清理环境,生成新的配置文件。