iPhone получит список всех SSID без приватной библиотеки

Возможно ли получить список всех доступных SSID на iPhone без использования личной библиотеки?

Я прочитал, что iPhone получает SSID без частной библиотеки, которая касается получения информации о текущей сети.

Этот ответ упоминает:

Если вы сделали джейлбрейк своего устройства, вы можете использовать частную платформу Apple80211 для поиска доступных сетей Wi-Fi и уровня их сигнала. Но это также означает, что ваше приложение будет отклонено.

У Apple есть API-интерфейс CaptiveNetwork, но, похоже, не существует решения для получения списка всех доступных сетей. Кажется, что это возможно сделать только с помощью частной библиотеки Apple80211 или подключением ко всем из них.

Я что-то упустил или нет решения?

6 ответов

Решение

Без использования частной библиотеки (Apple80211) вы можете получить только SSID сети, к которой в данный момент подключено ваше устройство.

Некоторые новые API были выпущены как часть Сетевого расширения в iOS 9 и iOS 11. Хотя ни один из них не позволяет сканировать сети во время работы приложения, они оба позволяют выполнять связанные задачи. Например, вы можете сканировать сети, когда страница настроек Wi-Fi работает с помощью Hotspot Helper, и вы можете упростить подключение пользователя к сети с помощью любого из них.

Вот сравнение двух рамок.

Hotspot Helper

  • NEHotspotHelper (представлен в iOS 9, WWDC 2015).
  • Требуется специальное разрешение от Apple.
  • Требуется com.apple.developer.networking.HotspotHelper право.
  • Для пошаговых инструкций, как это работает, смотрите этот ответ.
  • Позволяет участвовать в обнаружении / аутентификации в сети Wi-Fi через экран Wi-Fi в приложении "Настройки". Вы регистрируетесь, чтобы получать уведомления при сканировании сетей (например, когда пользователь запускает Wi-Fi в приложении "Настройки"), и вы можете автоматически предварительно заполнить пароль и отобразить аннотацию рядом с именем сети. Пользователю все еще нужно нажать на имя сети, чтобы подключиться, но он не будет запрашивать пароль, если вы предварительно заполнили его.

Конфигурация Hotspot

  • NEHotspotConfigurationManager (представлен в iOS 11, WWDC 2017).
  • Не требует специального разрешения от Apple.
  • Требуется com.apple.developer.networking.HotspotConfiguration право.
  • Позволяет инициировать подключение к сети Wi-Fi. Вы даете ему список SSID / паролей, которые должны быть подключены во время работы вашего приложения. Появится диалоговое окно, спрашивающее пользователя, хотят ли они подключиться к сети.

Начиная с iOS 9, вы можете использовать NEHotspotHelper, чтобы получить список SSID. Но вы должны получить com.apple.developer.networking.HotspotHelper право от Apple, отправив запрос.

Проверьте https://developer.apple.com/documentation/networkextension/nehotspothelper для получения дополнительной информации.

Шаг 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"
        }
    }

Прежде всего импортируйте выше двух системных заголовочных файлов

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";
}
#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;
        }
    }
Другие вопросы по тегам