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

问题描述 投票:34回答:7

直到今天,我使用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 objective-c cocoa-touch ios9
7个回答
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);

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


31
投票

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

#import <NetworkExtension/NetworkExtension.h>  

NSArray * networkInterfaces = [NEHotspotHelper supportedNetworkInterfaces];  
NSLog(@"Networks %@",networkInterfaces);  

更新(2015年9月11日)

以下强制网络API已在最新版本的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为您提供安全,自动加入或信号强度等额外信息。它还允许您在用户扫描wifis时在背景模式下将凭据设置为wifis。


9
投票

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

一个小小的警告是,现在在iOS 12中,您必须转到应用项目的功能部分并启用Access WiFi信息功能。它将为您的项目添加一个权利条目,并允许函数调用CNCopyCurrentNetworkInfo正常工作。

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

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

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


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
      }
    }
  }
}

对于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"]);
 }

4
投票

如前所述,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;
}

1
投票

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>;
}

0
投票

CaptiveNetwork仍在运作。但是你需要添加这个:

您的Entitlements.plist中的com.apple.developer.networking.wifi-info = true。

此外,您需要在developer.apple.com门户的App ID部分中启用Access WiFi信息。

在应用程序ID中启用“访问WiFi信息”选项后,请确保清理环境,生成新的配置文件。

© www.soinside.com 2019 - 2024. All rights reserved.