CaptiveNetwork弃用后,如何在iOS9中获取Wifi SSID,并且呼叫Wifi名称已被阻止

直到今天,我使用CaptiveNetwork接口来显示当前连接的Wifi的名称。 iOS 9预发布参考文件已经提到,CaptiveNetwork方法现在已经被剥夺了,但是它们仍然在开始工作。

苹果似乎已经阻止了这个电话的最新版本(也许是由于隐私问题?)。

有没有其他的方式来获得当前的Wifi的名称?

这是我直到今天获得SSID的方式,但现在你只能得到零:

#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,似乎这是再次启用。 事实上,它甚至没有在联机文档中被列为弃用,但CaptiveNetwork头文件确实具有以下内容:

 CNCopySupportedInterfaces (void) __OSX_AVAILABLE_BUT_DEPRECATED_MSG(__MAC_10_8, __MAC_NA, __IPHONE_4_1, __IPHONE_9_0, CN_DEPRECATION_NOTICE); 

所以,它是在iOS 9通用汽车,但不知道多久:)

将您的应用程序注册为热点帮手。

 #import <NetworkExtension/NetworkExtension.h> NSArray * networkInterfaces = [NEHotspotHelper supportedNetworkInterfaces]; NSLog(@"Networks %@",networkInterfaces); 

更新(2015年9月11日)

下面的CaptivenetworkingAPI已经在最新版本的iOS 9中重新启用。

  • CNCopySupportedInterfaces
  • CNCopyCurrentNetworkInfo

更新(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为您提供一些额外的信息,如安全,自动join或信号强度。 而且它还允许您在用户扫描wifis时在后台模式下将凭据设置为wifis。

在2017年4月27日确认,Captive Network仍在为Swift 3.1XCode 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仍在工作。 由于许多请求苹果可能已经恢复了API的。

使用CaptiveNetwork,我们可以获得WiFinetworking的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>; }