iPhone获取所有SSID列表而不使用私有库

34

有没有可能在不使用私有库的情况下,在iPhone上获取所有可用WiFi名称的列表

我读到了iPhone get SSID without private library,其中提到了如何获取当前网络的详细信息。

这个回答提到:

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

苹果公司有CaptiveNetwork API,但似乎没有解决方法可以获取所有可用网络的列表。看起来只有使用Apple80211私有库或连接到所有网络才能做到这一点。

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


对于同样的问题,但具有使用私有库的能力,请参见https://stackoverflow.com/questions/25784094/how-to-fetch-the-list-of-near-by-wifi-networks-and-able-to-connect-to-them-from。 - Senseful
6个回答

30

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


6
我希望我能给你一个不同的选择 :) - Rok Jarc
1
我们可以使用SystemNetworkConfiguration.framework中的CaptiveNetwork类,而无需使用私有API,获取SSID、BSSID和SSID数据。 - Durai Amuthan.H
1
据我所知,您可以检索支持的(预编程的)SSID - 而不是当前范围内的SSID。当然还有当前连接网络的SSID。如果我错了,请添加一个带有代码的答案,我将联系OP接受您的答案。 - Rok Jarc
@RokJarc,我需要所有可用的Wi-Fi列表。您能否建议任何可用的私有库来实现此目的?另外,请告诉我在较新的iOS版本中是否可以不使用私有库来完成此操作。 - Mitesh Dobareeya
@MiteshDobareeya: 我已经很久没有接触这个主题了,所以无法提供太多帮助。查看KeniLang的答案吧,那似乎是个不错的起点。 - Rok Jarc

4
作为 iOS 9 和 iOS 11 网络扩展的一部分,发布了一些新的 API。虽然这两个 API 都不允许您在应用程序运行时扫描网络,但它们都允许您执行相关任务。例如,使用 Hotspot Helper 可以在设置 Wi-Fi 页面运行时扫描网络,并且可以使用任何一个使用户更容易加入网络。
以下是两个框架的比较。

Hotspot Helper

  • NEHotspotHelper(iOS 9 中引入,WWDC 2015)。
  • 需要苹果的特殊权限。
  • 需要 com.apple.developer.networking.HotspotHelper 权限。
  • 要逐步执行此操作,请参见此答案
  • 允许您通过设置应用中的 Wi-Fi 屏幕参与发现/认证 Wi-Fi 网络。 您可以注册以在扫描网络时收到通知(例如,当用户在设置应用中启动 Wi-Fi 时),并且可以自动预填密码并在网络名称旁显示注释。用户仍然需要点击网络名称进行连接,但如果您已经预填了密码,则不需要提示输入密码。

    enter image description here

Hotspot Configuration

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

    enter image description here


4

只有当用户导航到设置中的Wi-Fi页面时,NEHotspotNetwork才会返回网络列表。有关更多详细信息,请参见此答案 - Senseful

1

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

import SystemConfiguration
import SystemConfiguration.CaptiveNetwork

Step 3: Now Use Code:

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

你能打出Objective-C版本吗? - Zakaria Darwish
1
我只能获取已连接的SSID,但我想获取所有可用的SSID。你能帮我实现吗? - hitesh landge
1
@hiteshlandge 有没有可能获取所有范围内的WiFi SSID?请提供任何提示或示例代码。 - Mitesh Dobareeya
2
请删除此回答并/或将其重新发布为回答某人如何获取您当前连接的唯一网络的SSID。 - blerg
@Evan Thompson 让interfaceName等于interfacesArray数组的第一个元素,强制转换为字符串类型。 这行代码返回当前连接的网络SSID。 - Sarvesh Singh
1
interfacesArray 只包含一个元素,即使您附近有多个 Wi-Fi 访问点。因此,这回答了如何获取有关当前网络的 SSID 的详细信息,而不是所有附近网络的 SSID。 - Senseful

1
首先导入以上两个系统头文件。
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";
}

1
我只能获取连接的SSID,我想获得所有可用的SSID。你能帮我吗? - hitesh landge
嗨 @hiteshlandge,我在Swift中发布了另一个答案,如下所示。那个答案可以提供所有在范围内的SSID。谢谢。 - Sarvesh Singh
如果您清楚地知道这不能获取所有网络,那么请友善地删除此答案,因为它并没有回答原帖提出的问题。 - Senseful

0
#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,而不是所有在范围内的网络。 - Senseful

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接