为了账号安全,请及时绑定邮箱和手机立即绑定

iPhone在没有私有库的情况下获得SSID

iPhone在没有私有库的情况下获得SSID

沧海一幻觉 2019-06-28 15:44:43
iPhone在没有私有库的情况下获得SSID我有一个商业应用程序,它有一个完全合法的理由来查看它连接到的网络的SSID:如果它连接到一个第三方硬件设备的Adhoc网络,它需要以一种不同于连接到互联网的方式运行。我所看到的有关获得SSID的一切都告诉我,我必须使用Apple80211,据我所知,它是一个私有库。我还读到,如果我使用一个私人图书馆,苹果将不会批准该应用程序。我是被困在一个苹果和一个艰难的地方之间,还是这里缺少什么东西?
查看完整描述

3 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

从iOS 7或8开始,您可以这样做,它利用ARC和模块,这些模块将自动链接到所需的框架中:

@import SystemConfiguration.CaptiveNetwork;/** Returns first non-empty SSID network info dictionary.
 *  @see CNCopyCurrentNetworkInfo */- (NSDictionary *)fetchSSIDInfo{
    NSArray *interfaceNames = CFBridgingRelease(CNCopySupportedInterfaces());
    NSLog(@"%s: Supported interfaces: %@", __func__, interfaceNames);

    NSDictionary *SSIDInfo;
    for (NSString *interfaceName in interfaceNames) {
        SSIDInfo = CFBridgingRelease(
            CNCopyCurrentNetworkInfo((__bridge CFStringRef)interfaceName));
        NSLog(@"%s: %@ => %@", __func__, interfaceName, SSIDInfo);

        BOOL isNotEmpty = (SSIDInfo.count > 0);
        if (isNotEmpty) {
            break;
        }
    }
    return SSIDInfo;}

(这是为IOS 4.1+编写的代码示例的现代化。唯一的变化是引入了更清晰的变量名称,并采用了ARC和模块。

示例输出:

2011-03-04 15:32:00.669 ShowSSID[4857:307] -[ShowSSIDAppDelegate fetchSSIDInfo]: Supported interfaces: (
    en0)2011-03-04 15:32:00.693 ShowSSID[4857:307] -[ShowSSIDAppDelegate fetchSSIDInfo]: en0 => {
    BSSID = "ca:fe:ca:fe:ca:fe";
    SSID = XXXX;
    SSIDDATA = <01234567 01234567 01234567>;}

请注意,模拟器中不支持任何ifs。在你的设备上测试。

在4.1之前,您可能会很幸运地浏览系统配置字典。例如,使用scutil在我的Mac上:

$ scutil> show State:/Network/Interface/en1/AirPort<dictionary> {
  Power Status : 1
  SecureIBSSEnabled : FALSE
  BSSID : <data> 0xcafecafecafe
  SSID_STR : XXXX
  SSID : <data> 0x012345670123456701234567
  Busy : FALSE
  CHANNEL : <dictionary> {
    CHANNEL : 1
    CHANNEL_FLAGS : 10
  }}> exit

IOS 12

您必须启用从功能访问wifi信息。

在iOS 12及更高版本中使用此功能非常重要,请在Xcode中为您的应用程序启用访问WiFi信息功能。启用此功能时,Xcode会自动将访问WiFi信息权限添加到应享权利文件和应用程序ID中。文档链接

SWIFT 4.2

func getConnectedWifiInfo() -> [AnyHashable: Any]? {

    if let ifs = CFBridgingRetain( CNCopySupportedInterfaces()) as? [String],
        let ifName = ifs.first as CFString?,
        let info = CFBridgingRetain( CNCopyCurrentNetworkInfo((ifName))) as? [AnyHashable: Any] {

        return info    }
    return nil}


查看完整回答
反对 回复 2019-06-28
?
当年话下

TA贡献1890条经验 获得超9个赞

以下是基于@elsurudo代码的清理后的ARC版本:

- (id)fetchSSIDInfo {
     NSArray *ifs = (__bridge_transfer NSArray *)CNCopySupportedInterfaces();
     NSLog(@"Supported interfaces: %@", ifs);
     NSDictionary *info;
     for (NSString *ifnam in ifs) {
         info = (__bridge_transfer NSDictionary *)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
         NSLog(@"%@ => %@", ifnam, info);
         if (info && [info count]) { break; }
     }
     return info;}


查看完整回答
反对 回复 2019-06-28
  • 3 回答
  • 0 关注
  • 609 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信