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.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仍在工作。 由于许多请求苹果可能已经恢复了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>; }