Ответ 1
Без использования частной библиотеки (Apple80211
) вы можете получить только SSID сети, к которой в настоящее время подключено ваше устройство.
Возможно ли получить список всех доступных SSID на iPhone без использования частной библиотеки?
Я читаю, что iPhone получает SSID без частной библиотеки, а именно о получении информации о текущей сети.
В этом ответе говорится:
Если вы джейлбрейк своего устройства, вы можете использовать частную инфраструктуру Apple80211 для поиска доступных сетей Wi-Fi и их силы сигнала. Но это также означает, что ваше приложение будет отклонено.
У Apple есть CaptiveNetwork API, но, похоже, не существует решения для получения списка всех доступных сетей. Кажется, это возможно только при использовании частной библиотеки Apple80211 или для подключения ко всем из них.
Я что-то пропустил, или нет решения?
Без использования частной библиотеки (Apple80211
) вы можете получить только SSID сети, к которой в настоящее время подключено ваше устройство.
Начиная с iOS 9, вы можете использовать NEHotspotHelper для получения списка SSID. Но вы должны получить право на com.apple.developer.networking.HotspotHelper
от Apple, отправив запрос.
Для более подробной информации проверьте https://developer.apple.com/documentation/networkextension/nehotspothelper.
Первичный импорт из двух файлов заголовка системы
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: добавьте фреймворк 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"
}
}
Некоторые новые API были выпущены как часть расширения сети в iOS 9 и iOS 11. Хотя ни одно из них не позволяет сканировать сети во время работы вашего приложения, они оба позволяют выполнять связанные задачи. Например, вы можете сканировать сети, пока страница настроек Wi-Fi работает с помощью Hotspot Helper, и вы можете упростить для пользователя возможность присоединиться к сети, используя любой из них.
Вот сравнение двух рамок.
NEHotspotHelper
(представлен в iOS 9, WWDC 2015).com.apple.developer.networking.HotspotHelper
.Позволяет участвовать в обнаружении/аутентификации в сети Wi-Fi через экран Wi-Fi в приложении "Настройки". Вы регистрируетесь для получения уведомлений при сканировании сетей (например, когда пользователь запускает Wi-Fi в приложении "Настройки"), и вы можете автоматически предварительно заполнить пароль и отобразить аннотацию рядом с именем сети. Пользователю по-прежнему нужно использовать сетевое имя для подключения, но оно не будет запрашивать пароль, если вы его предварительно заполнили.
NEHotspotConfigurationManager
(представлен в iOS 11, WWDC 2017).com.apple.developer.networking.HotspotConfiguration
.Позволяет инициировать подключение к сети Wi-Fi. Вы даете ему список SSID/паролей, к которым нужно подключиться, пока приложение работает. Он представит диалог с запросом пользователя, хотите ли они подключиться к сети.
#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;
}
}