首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用CaptiveNetwork获取当前WiFi热点名称

如何使用CaptiveNetwork获取当前WiFi热点名称
EN

Stack Overflow用户
提问于 2011-01-17 19:16:34
回答 4查看 31.4K关注 0票数 26

我需要获取当前连接的Wi-Fi热点的名称,例如"BT OpenZone“

有人告诉我可以用CaptiveNetwork特别是CNCopyCurrentNetworkInfo来完成

到目前为止我的代码如下:

代码语言:javascript
复制
#import <SystemConfiguration/CaptiveNetwork.h>
...

// Get the dictionary containing the captive network infomation
CFDictionaryRef captiveNtwrkDict = CNCopyCurrentNetworkInfo(kCNNetworkInfoKeySSID);

// Get the count of the key value pairs to test if it has worked
int count = CFDictionaryGetCount(captiveNtwrkDict);
NSLog(@"Count of dict:%d",count);

当代码在WiFi热点中的设备上运行时,captiveNtwrkDict为空。

有没有人能让它工作起来?我在CaptiveNetworks上找不到太多的文档或任何示例代码示例...任何帮助都将不胜感激。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-17 23:28:16

您需要找出哪些网络可用,然后将它们传递给CNCopyCurrentNetworkInfo。例如:

代码语言:javascript
复制
CFArrayRef myArray = CNCopySupportedInterfaces();
CFDictionaryRef myDict = CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(myArray, 0));

然后,您可以使用您得到的字典上的kCNNetworkInfoKeySSID (myDict)来查找...and。不要忘记适当地释放/管理内存。

票数 27
EN

Stack Overflow用户

发布于 2015-10-15 02:01:50

iOS 12、swift 4.2的更新

iOS 12

您必须从功能启用Access WiFi信息。

重要信息要在iOS 12和更高版本中使用此功能,请在Xcode中为您的应用程序启用访问WiFi信息功能。启用此功能后,Xcode会自动将Access WiFi信息权限添加到您的权限文件和应用程序ID中。Documentation link

Swift4.2 4.2

代码语言:javascript
复制
public class SSID {
    class func fetchSSIDInfo() -> String {
        var currentSSID = ""
        if let interfaces = CNCopySupportedInterfaces() {
            for i in 0..<CFArrayGetCount(interfaces) {
                let interfaceName: UnsafeRawPointer = CFArrayGetValueAtIndex(interfaces, i)
                let rec = unsafeBitCast(interfaceName, to: AnyObject.self)
                let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)" as CFString)
                if let interfaceData = unsafeInterfaceData as? [String: AnyObject] {
                    currentSSID = interfaceData["SSID"] as! String
                    let BSSID = interfaceData["BSSID"] as! String
                    let SSIDDATA = interfaceData["SSIDDATA"]
                    debugPrint("ssid=\(currentSSID), BSSID=\(BSSID), SSIDDATA=\(SSIDDATA)")
                }
            }
        }
        return currentSSID
    }
}

iOS 10更新

iOS 10中不再推荐使用CNCopySupportedInterfaces。(API Reference)

您需要导入SystemConfiguration/CaptiveNetwork.h并将SystemConfiguration.framework添加到目标的链接库(在build phases下)。

以下是swift (RikiRiocma's Answer)中的代码片段

代码语言:javascript
复制
import Foundation
import SystemConfiguration.CaptiveNetwork

public class SSID {
    class func fetchSSIDInfo() ->  String {
        var currentSSID = ""
        if let interfaces:CFArray! = CNCopySupportedInterfaces() {
            for i in 0..<CFArrayGetCount(interfaces){
                let interfaceName: UnsafePointer<Void> = CFArrayGetValueAtIndex(interfaces, i)
                let rec = unsafeBitCast(interfaceName, AnyObject.self)
                let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)")
                if unsafeInterfaceData != nil {
                    let interfaceData = unsafeInterfaceData! as Dictionary!
                    currentSSID = interfaceData["SSID"] as! String
                }
            }
        }
    return currentSSID
    }
}

(重要信息: CNCopySupportedInterfaces在模拟器上返回nil。)

有关Objective-c,请参阅Esad's answer here and below

代码语言:javascript
复制
+ (NSString *)GetCurrentWifiHotSpotName {    
    NSString *wifiName = nil;
    NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
    for (NSString *ifnam in ifs) {
        NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
        if (info[@"SSID"]) {
            wifiName = info[@"SSID"];
        }
    }
    return wifiName;
}

iOS 9更新

从iOS 9开始,强制网络已弃用*。(source)

*在iOS 10中不再推荐使用,请参见上文。

建议您使用NEHotspotHelper (source)

你需要给苹果公司发邮件到networkextension@apple.com,并申请授权。(source)

示例代码(Not my code. See Pablo A's answer):

代码语言:javascript
复制
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;
}

附注:是的,他们在iOS 9中弃用了CNCopySupportedInterfaces,并在iOS 10中改变了立场。我与一位苹果网络工程师进行了交谈,在这么多人提交雷达并在苹果开发者论坛上谈论这个问题后,他们的立场发生了逆转。

票数 23
EN

Stack Overflow用户

发布于 2013-12-30 19:51:48

易于使用的代码片段(方法):

添加下面的method

  • (NSString *)GetCurrentWifiHotSpotName { NSString *wifiName = nil;NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();for (NSString *ifs in ifs) { NSDictionary *= (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);NSLog(@"info:%@",info);如果(info@"SSID") { wifiName = info@"SSID";}}返回wifiName;}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4712535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档