【问题标题】:iPhone get a list of all SSIDs without private libraryiPhone 获取没有私有库的所有 SSID 列表
【发布时间】:2012-03-29 20:55:47
【问题描述】:

是否有可能在不使用私有库的情况下获取 iPhone 上所有可用 SSID 的列表

我阅读了iPhone get SSID without private library,这是关于获取有关当前网络的详细信息。

This answer 提及:

如果您越狱了您的设备,您可以使用Apple80211 私有框架来查找可用的 Wi-Fi 网络及其信号强度。但这也意味着您的应用会被拒绝。

Apple 有CaptiveNetwork API,但似乎没有解决方案来获取所有可用网络的列表。似乎只能通过使用the Apple80211 private library 或连接到所有这些来实现。

是我遗漏了什么,还是没有解决办法?

【问题讨论】:

标签: ios iphone ssid bssid


【解决方案1】:

一些新的 API 已作为 iOS 9 和 iOS 11 中网络扩展的一部分发布。虽然它们都不允许您在应用运行时扫描网络,但它们都允许您执行相关任务。例如。您可以在设置 Wi-Fi 页面运行时使用 Hotspot Helper 扫描网络,并且您可以使用其中任何一种方法让用户更轻松地加入网络。

这是两个框架的比较。

热点助手

  • NEHotspotHelper(在 iOS 9 中引入,WWDC 2015)。
  • 需要 Apple 的特别许可。
  • 需要com.apple.developer.networking.HotspotHelper 授权。
  • 如需获取此功能的分步说明,请参阅this answer
  • 允许您通过“设置”应用中的 Wi-Fi 屏幕参与 Wi-Fi 网络的发现/身份验证。您注册以在扫描网络时收到通知(例如,当用户在设置应用程序中启动 Wi-Fi),您可以自动预填密码并在网络名称附近显示注释。用户仍然需要点击网络名称才能连接,但如果您预先填写密码,则不会提示输入密码。

热点配置

  • NEHotspotConfigurationManager(在 iOS 11 中引入,WWDC 2017)。
  • 不需要 Apple 的特别许可。
  • 需要com.apple.developer.networking.HotspotConfiguration 权利。
  • 允许您启动与 Wi-Fi 网络的连接。您向其提供在应用运行时应连接的 SSID/密码列表。它将显示一个对话框,询问用户是否要连接到网络。

【讨论】:

    【解决方案2】:

    从 iOS 9 开始,您可以使用 NEHotspotHelper 来获取 SSID 列表。但是您必须通过发送请求从 Apple 获得 com.apple.developer.networking.HotspotHelper 权利。

    查看https://developer.apple.com/documentation/networkextension/nehotspothelper了解更多信息。

    【讨论】:

    • NEHotspotNetwork 只会在用户导航到“设置”中的 Wi-Fi 页面时返回网络列表。有关详细信息,请参阅this answer
    【解决方案3】:
    #import SystemConfiguration#
    ##import SystemConfiguration.CaptiveNetwork##
    
     //create variable
      var SSIDNameArray = NSMutableArray()
      var nameArray : NSArray = [];
     // Here function to return all SSIDName
        func getUsedSSID()->NSArray{
            let interfaces = CNCopySupportedInterfaces()
            if interfaces != nil {
                let interfacesArray = CFBridgingRetain(interfaces) as! NSArray
                if interfacesArray.count > 0 {
                    for interfaceName in interfacesArray {
                        let unsafeInterfaceData = CNCopyCurrentNetworkInfo(interfaceName as! CFString)! as NSDictionary
                        let SSIDName = unsafeInterfaceData["SSID"] as! String
                        self.SSIDNameArray .add(SSIDName)
                    }
                    nameArray = self.SSIDNameArray .copy() as! NSArray
                    return nameArray;
                }else{
                     return nameArray;
                }
            }else{
                return nameArray;
            }
        }
    

    【讨论】:

    • 这仅显示已连接网络的 SSID,而不是范围内的所有 SSID
    【解决方案4】:

    首先导入上面两个系统头文件

    import SystemConfiguration/SystemConfiguration.h
    import SystemConfiguration/CaptiveNetwork.h
    

    下面的函数/方法返回SSIDName

    -(NSString *)getNetworkId{
        NSString *string = CFBridgingRelease(CNCopySupportedInterfaces());
        NSArray *interfacesArray = CFBridgingRelease(CFBridgingRetain(string));
            if(interfacesArray.count > 0){
                NSString *networkName = [interfacesArray objectAtIndex:0];
                CFStringRef yourFriendlyCFString = (__bridge CFStringRef)networkName;
                NSDictionary *unsafeInterfaceData = CFBridgingRelease(CNCopyCurrentNetworkInfo(yourFriendlyCFString));
                NSString *ssidName = unsafeInterfaceData[@"SSID"];
                return ssidName;
            }
        return @"No network Found";
    }
    

    【讨论】:

    • 只获取连接的 SSID,我想获取所有远程 SSID。你能帮我做同样的吗?
    • 嗨@hiteshlandge 我在下面快速发布了另一个答案。并且该答案提供了范围内的所有 SSID。谢谢
    • 如果你清楚地知道这并没有得到所有网络,你应该删除这个答案,因为它没有回答原始发布者的问题。
    【解决方案5】:

    第 1 步: 添加框架SystemConfiguration.framework
    第 2 步: 导入以下头文件

    import SystemConfiguration
    import SystemConfiguration.CaptiveNetwork
    

    第 3 步:现在使用代码:

    func getUsedSSID()->String {
    
           let interfaces = CNCopySupportedInterfaces()
    
            if interfaces != nil {
    
                let interfacesArray = CFBridgingRetain(interfaces) as! NSArray
    
                if interfacesArray.count > 0 {
    
                    let interfaceName = interfacesArray[0] as! String
                    let unsafeInterfaceData = CNCopyCurrentNetworkInfo(interfaceName)! as Dictionary
                    let SSIDName = unsafeInterfaceData["SSID"] as! String
                    print(SSIDName)/* here print recentally used wifi name*/
                    return SSIDName
                }else{
                    return "0"
                }
            }else{
                return "0"
            }
        }
    

    【讨论】:

    • 能否输入目标c版本
    • 只获取连接的 SSID,我想获取所有远程 SSID。你能帮我做同样的吗?
    • @hiteshlandge 是否有可能获得所有远程 wifi SSID?请提供任何提示或示例代码。
    • 请删除此答案和/或将其作为答案转发给询问如何获取您当前连接的一个网络的 SSID。
    • interfacesArray 将仅包含 1 个元素,即使您靠近 1 个以上的 wi-fi 接入点。因此,这回答了如何获取有关当前网络的 SSID 而不是所有附近网络的 SSID 的详细信息。
    【解决方案6】:

    如果不使用私有库 (Apple80211),您只能获取设备当前连接的网络的 SSID。

    【讨论】:

    • @grubernd: 我希望我能给你一个不同的:)
    • 我们可以在不使用私有 api 的情况下获取 SSID、BSSID 和 SSID DATA,而只需使用 SystemNetworkConfiguration.framework 中的 CaptiveNetwork 类。
    • 据我所知,您可以检索受支持(预编程)的 SSID,而不是当前范围内的 SSID。当然还有当前连接网络的 SSID。如果我错了,请添加带有代码的答案,我会联系 OP 接受您的答案。
    • @RokJarc 我需要所有远程 wifi 列表。您能否建议任何可用的私人图书馆来实现这一目标。另外请让我知道是否可以在较新的 ios 版本中不使用私有库。
    • @MiteshDobareeya:我很长时间没有遇到这个话题,所以我帮不上什么忙。检查KeniLang's answer 到这篇文章。似乎是一个很好的起点。
    猜你喜欢
    • 2010-12-21
    • 2013-10-20
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 2018-11-30
    • 2023-03-24
    • 2019-05-18
    相关资源
    最近更新 更多