如何在不推荐使用CaptiveNetwork后在iOS9中获取Wifi SSID,并且已经阻止了对Wifi名称的调用

Thy*_*raz 35 cocoa-touch objective-c ios ios9

直到今天,我使用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"]; 
    } 
} 
Run Code Online (Sandbox Code Playgroud)

Pab*_* A. 31

将您的应用注册为Hotspot助手.

#import <NetworkExtension/NetworkExtension.h>  

NSArray * networkInterfaces = [NEHotspotHelper supportedNetworkInterfaces];  
NSLog(@"Networks %@",networkInterfaces);  
Run Code Online (Sandbox Code Playgroud)

更新(2015年9月11日)

以下强制网络API已在最新版本的iOS 9中重新启用.

  • CNCopySupportedInterfaces
  • CNCopyCurrentNetworkInfo

更新(2015年9月16日)

如果你仍然喜欢使用NetworkExtensionApple并且允许你添加权利,那么你可以这样做来获取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;
}
Run Code Online (Sandbox Code Playgroud)

NetworkExtension为您提供安全,自动加入或信号强度等额外信息.它还允许您在用户扫描wifis时在后台模式下将凭据设置为wifis.

  • 这应该是接受的答案:) (4认同)
  • @Forke lewiguez是第一个回答Apple重新启用旧方法的人.如果您不是热点帮助应用程序,Apple拒绝对热点助手权利的请求.因此lewiguez同时回答了这个问题,因为Apple给我写了一封邮件,我不会获得权利,但由于他们收到了大量的请求,他们重新激活了旧方法. (4认同)
  • 它不起作用......它返回NIL作为CNCopySupportedInterfaces()也是如此 (2认同)

lew*_*uez 10

在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);
Run Code Online (Sandbox Code Playgroud)

所以,它在iOS 9 GM中工作,但不确定多久:)


小智 9

即使对于Swift 4.1和4.2,abdullahselek的答案仍然是正确的.

一个小小的警告,现在在iOS的12,你必须去你的应用项目的功能部分并启用访问无线网络信息的功能.它将为您的项目添加权利条目,并允许函数调用CNCopyCurrentNetworkInfo正常工作.

如果你不这样做,那个函数只返回nil.运行时不会显示有关丢失权利的错误或警告.

有关详细信息,请参阅Apple文档下面的链接.

https://developer.apple.com/documentation/systemconfiguration/1614126-cncopycurrentnetworkinfo


nuy*_*ait 8

确认在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
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

对于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"]);
 }
Run Code Online (Sandbox Code Playgroud)