34

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

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

这个答案提到:

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

Apple 有CaptiveNetwork API,但似乎没有解决方案来获取所有可用网络的列表。似乎只有使用Apple80211 私有库或连接到所有这些库才能做到这一点。

我错过了什么,还是没有解决方案?

4

6 回答 6

30

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

于 2012-03-13T13:30:35.320 回答
4

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

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

于 2017-08-21T09:32:12.353 回答
3

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

这是两个框架的比较。

热点助手

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

    在此处输入图像描述

热点配置

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

    在此处输入图像描述

于 2018-09-24T06:04:01.233 回答
0

步骤 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"
        }
    }
于 2016-05-31T11:30:08.180 回答
0

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

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";
}
于 2017-03-08T09:04:21.040 回答
-1
#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;
        }
    }
于 2017-08-01T05:36:13.257 回答