У меня есть коммерческое приложение, которое имеет вполне законную причину для просмотра SSID сети, к которой он подключен: если оно подключено к сети Adhoc для стороннего аппаратного устройства, оно должно функционировать не так, как если бы оно было подключен к интернету.
Все, что я видел о получении SSID, говорит мне, что я должен использовать Apple80211, который, как я понимаю, является частной библиотекой. Я также читал, что если я использую личную библиотеку, Apple не одобрит приложение.
Я застрял между Apple и наковальней, или мне чего-то не хватает здесь?
Ответы:
Начиная с iOS 7 или 8, вы можете сделать это (необходимо получить право на iOS 12+, как показано ниже):
Пример вывода:
Обратите внимание, что в симуляторе не поддерживаются if. Протестируйте на своем устройстве.
iOS 12
Вы должны включить доступ к информации Wi-Fi из возможностей.
Swift 4.2
источник
@import
а не#import
). Clang автоматически связывается в нужной среде, когда импортируется модуль, а не просто заголовок.CNCopyCurrentNetworkInfo
возврата полезной информации; в противном случае это возвращаетсяnil
. Смотрите: stackoverflow.com/questions/56583650/…Вот очищенная версия ARC, основанная на коде @ elsurudo:
источник
ОБНОВЛЕНИЕ для iOS 10 и выше
CNCopySupportedInterfaces больше не поддерживается в iOS 10. ( Справочник по API )
Вам необходимо импортировать SystemConfiguration / CaptiveNetwork.h и добавить SystemConfiguration.framework в связанные библиотеки вашей цели (на этапах сборки).
Вот фрагмент кода в быстром (ответ RikiRiocma) :
( Важно: CNCopySupportedInterfaces возвращает ноль на симуляторе.)
Для Objective-c см . Ответ Эсада здесь и ниже.
ОБНОВЛЕНИЕ ДЛЯ iOS 9
Начиная с iOS 9 Captive Network устарела *. ( источник )
* Больше не рекомендуется в iOS 10, см. Выше.
Рекомендуется использовать NEHotspotHelper ( источник )
Вам нужно будет отправить электронное письмо по адресу networkextension@apple.com и запросить разрешения. ( источник )
Пример кода ( не мой код. См. Ответ Пабло А ):
Примечание: Да, они отказались от CNCopySupportedInterfaces в iOS 9 и полностью изменили свою позицию в iOS 10. Я разговаривал с сетевым инженером Apple, и это изменение произошло после того, как очень много людей подали заявки на Radars и высказались о проблеме на форумах Apple Developer.
источник
Это работает для меня на устройстве (не симулятор). Убедитесь, что вы добавили каркас конфигурации системы.
источник
Этот код хорошо работает, чтобы получить SSID.
И вот результаты:
}
источник
Если вы используете iOS 12, вам нужно будет сделать дополнительный шаг. Я изо всех сил пытался заставить этот код работать и, наконец, нашел его на сайте Apple: «Важно! Чтобы использовать эту функцию в iOS 12 и более поздних версиях, включите возможность доступа к информации Wi-Fi для вашего приложения в XCode. Когда вы включите эту возможность, XCode автоматически добавляет право доступа к информации Wi-Fi в ваш файл разрешений и идентификатор приложения. " https://developer.apple.com/documentation/systemconfiguration/1614126-cncopycurrentnetworkinfo
источник
См. CNCopyCurrentNetworkInfo в CaptiveNetwork: http://developer.apple.com/library/ios/#documentation/SystemConfiguration/Reference/CaptiveNetworkRef/Reference/reference.html .
источник
Вот короткая и сладкая версия Swift.
Не забудьте связать и импортировать Framework:
Определите метод:
Вызовите метод, когда вам это нужно:
Как уже упоминалось, это работает только на вашем iDevice. Когда не по WiFi, метод вернет ноль - следовательно, необязательный.
источник
Для iOS 13
Начиная с iOS 13, вашему приложению также необходим доступ к Core Location, чтобы использовать эту
CNCopyCurrentNetworkInfo
функцию, если только он не настроил текущую сеть или не имеет конфигурации VPN:Так что это то, что вам нужно (см. Документацию Apple ):
- Связать
CoreLocation.framework
библиотеку- Добавить
location-services
в качествеUIRequiredDeviceCapabilities
ключа / значения в Info.plist- Добавить
NSLocationWhenInUseUsageDescription
ключ / значение в Info.plist, описывающий, почему вашему приложению требуется расположение ядра- Добавить «Access WiFi» Информация "Право на ваше приложение
Теперь в качестве примера Objective-C, сначала проверьте, был ли принят доступ к местоположению, прежде чем читать информацию о сети, используя
CNCopyCurrentNetworkInfo
:источник