Как получить WID SSID в iOS9 после того, как CaptiveNetwork устарела, а вызовы имени Wifi уже заблокированы
До сегодняшнего дня я использовал интерфейс CaptiveNetwork для отображения имени подключенного в данный момент Wi-Fi. В пререлизной версии iOS 9 уже говорилось, что методы CaptiveNetwork в настоящее время устарели, но они все еще работали в начале.
С последней версией Apple, кажется, уже заблокировал эти звонки (возможно, из-за проблем с конфиденциальностью?).
Есть ли другой способ узнать название текущего вайфай?
Вот как я получил SSID до сегодняшнего дня, но теперь вы получаете только ноль:
#import <SystemConfiguration/CaptiveNetwork.h>
NSString *wifiName = nil;
NSArray *interFaceNames = (__bridge_transfer id)CNCopySupportedInterfaces();
for (NSString *name in interFaceNames) {
NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)name);
if (info[@"SSID"]) {
wifiName = info[@"SSID"];
}
}
6 ответов
В GM для iOS 9 кажется, что это снова включено. На самом деле, он даже не указан как устаревший в онлайн-документации, однако заголовочный файл CaptiveNetwork имеет следующее:
CNCopySupportedInterfaces (void) __OSX_AVAILABLE_BUT_DEPRECATED_MSG(__MAC_10_8, __MAC_NA, __IPHONE_4_1, __IPHONE_9_0, CN_DEPRECATION_NOTICE);
Итак, он работает в iOS 9 GM, но не уверен, как долго:)
Зарегистрируйте свое приложение в качестве помощника Hotspot.
#import <NetworkExtension/NetworkExtension.h>
NSArray * networkInterfaces = [NEHotspotHelper supportedNetworkInterfaces];
NSLog(@"Networks %@",networkInterfaces);
ОБНОВЛЕНИЕ (11 сентября 2015 г.)
Следующие API-интерфейсы Captive Network были повторно включены в последней версии iOS 9.
- CNCopySupportedInterfaces
- CNCopyCurrentNetworkInfo
ОБНОВЛЕНИЕ (16 сентября 2015 г.)
Если вы все еще предпочитаете использовать NetworkExtension
и Apple дала вам разрешение на добавление прав, затем вы можете сделать это, чтобы получить информацию о Wi-Fi:
for(NEHotspotNetwork *hotspotNetwork in [NEHotspotHelper supportedNetworkInterfaces]) {
NSString *ssid = hotspotNetwork.SSID;
NSString *bssid = hotspotNetwork.BSSID;
BOOL secure = hotspotNetwork.secure;
BOOL autoJoined = hotspotNetwork.autoJoined;
double signalStrength = hotspotNetwork.signalStrength;
}
NetworkExtension
предоставляет вам некоторую дополнительную информацию, как безопасную, автоматическое соединение или уровень сигнала. И это также позволяет вам устанавливать учетные данные для Wi-Fi в фоновом режиме, когда пользователь просматривает Wi-Fi.
Ответ от abdullahselek по-прежнему верен даже для Swift 4.1 и 4.2.
Небольшое предостережение заключается в том, что теперь в iOS 12 вы должны перейти в раздел возможностей вашего проекта приложения и включить функцию доступа к информации Wi-Fi. Он добавит запись о правах в ваш проект и позволит вызвать функцию CNCopyCurrentNetworkInfo
работать правильно.
Если вы этого не сделаете, эта функция просто вернет nil. Во время выполнения не будет отображаться никаких ошибок или предупреждений об отсутствующем праве.
Для получения дополнительной информации см. Ссылку ниже на документацию Apple.
https://developer.apple.com/documentation/systemconfiguration/1614126-cncopycurrentnetworkinfo
Подтвердите, что 2017-April-27, Captive Network все еще работает для Swift 3.1
, XCode 8.3
Для Swift > 3.0
func printCurrentWifiInfo() {
if let interface = CNCopySupportedInterfaces() {
for i in 0..<CFArrayGetCount(interface) {
let interfaceName: UnsafeRawPointer = CFArrayGetValueAtIndex(interface, i)
let rec = unsafeBitCast(interfaceName, to: AnyObject.self)
if let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)" as CFString), let interfaceData = unsafeInterfaceData as? [String : AnyObject] {
// connected wifi
print("BSSID: \(interfaceData["BSSID"]), SSID: \(interfaceData["SSID"]), SSIDDATA: \(interfaceData["SSIDDATA"])")
} else {
// not connected wifi
}
}
}
}
Для Objective-C
NSArray *interFaceNames = (__bridge_transfer id)CNCopySupportedInterfaces();
for (NSString *name in interFaceNames) {
NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)name);
NSLog(@"wifi info: bssid: %@, ssid:%@, ssidData: %@", info[@"BSSID"], info[@"SSID"], info[@"SSIDDATA"]);
}
Как упоминалось ранее, CaptiveNetwork хорошо работает с Xcode 8.3 и выше. Вот фрагменты кода для Swift 3, Swift 4 и Objective-C.
Свифт 3 и 4
import SystemConfiguration.CaptiveNetwork
internal class SSID {
class func fetchSSIDInfo() -> [String: Any] {
var interface = [String: Any]()
if let interfaces = CNCopySupportedInterfaces() {
for i in 0..<CFArrayGetCount(interfaces){
let interfaceName = CFArrayGetValueAtIndex(interfaces, i)
let rec = unsafeBitCast(interfaceName, to: AnyObject.self)
guard let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)" as CFString) else {
return interface
}
guard let interfaceData = unsafeInterfaceData as? [String: Any] else {
return interface
}
interface = interfaceData
}
}
return interface
}
}
Objective-C
#import <SystemConfiguration/CaptiveNetwork.h>
+ (NSDictionary *)fetchSSIDInfo
{
NSArray *interFaceNames = (__bridge_transfer id)CNCopySupportedInterfaces();
for (NSString *name in interFaceNames)
{
NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)name);
return info;
}
return nil;
}
Теперь это должно работать с iOS 13.3. Я использую связанную библиотеку Pod, которая использует точную функцию в Objc и с оболочкой Swift.
CaptiveNetwork все еще работает. Но вам нужно будет добавить это:
com.apple.developer.networking.wifi-info = true внутри вашего Entitlements.plist.
Кроме того, вам необходимо включить функцию "Включить доступ к WiFi" в разделе "Идентификатор приложения" на портале developer.apple.com.
Обязательно создайте новый профиль обеспечения после включения параметра "Доступ к информации WiFi" в идентификаторе приложения.
CaptiveNetwork все еще работает. По многочисленным просьбам Apple, возможно, восстановила API.
Используя CaptiveNetwork, мы можем получить SSID сети WiFi. Это даже работает в iOS 10.
#import <SystemConfiguration/CaptiveNetwork.h>
NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)name);
Вот вывод:
Printing description of info:
{
BSSID = "5*:**:**:**:**:**";
SSID = Cisco12814;
SSIDDATA = <43697363 6f313238 3134>;
}