Как получить Wi-Fi SSID в iOS9 после того, как CaptiveNetwork устарела и требует имя Wifi, уже заблокировано

До сегодняшнего дня я использовал интерфейс CaptiveNetwork для отображения имени подключенного в настоящее время Wi-Fi. В предыдущей ссылке iOS 9 уже указано, что методы CaptiveNetwork отныне теперь, но они все еще работали в начале.

С новейшей версией Apple, похоже, уже заблокировала эти вызовы (возможно, из-за проблем с конфиденциальностью?).

Есть ли другой способ получить имя текущего Wifi?

Вот как я получил 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"]; 
    } 
} 

Ответ 1

В 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, но не уверен, как долго:)

Ответ 2

Зарегистрируйте свое приложение как помощник 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 предоставляет вам дополнительную информацию как защищенную, автоматически присоединенную или силу сигнала. А также позволяет устанавливать учетные данные для wifis в фоновом режиме, когда пользователь сканирует wifis.

Ответ 3

Ответ от abdullahselek по-прежнему верен даже для Swift 4.1 и 4.2.

Небольшое предостережение заключается в том, что теперь в iOS 12 вы должны перейти в раздел возможностей вашего проекта приложения и включить функцию доступа к Wi-Fi Information. Он добавит запись о правах в ваш проект и позволит функции вызова CNCopyCurrentNetworkInfo работать должным образом.

Если вы этого не сделаете, эта функция просто возвращает ноль. Во время выполнения не будут отображаться ошибки или предупреждения об отсутствующем праве.

Для получения дополнительной информации см. Ссылку ниже на документацию Apple.

https://developer.apple.com/documentation/systemconfiguration/1614126-cncopycurrentnetworkinfo

Ответ 4

Подтвердите в 2017-апреле-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"]);
 }

Ответ 5

Как упоминалось ранее, 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;
}

Ответ 6

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>;
}

Ответ 7

CaptiveNetwork все еще работает. Но вам нужно будет добавить это:

com.apple.developer.networking.wifi-info = true внутри вашего Entitlements.plist.

Кроме того, вам необходимо включить функцию "Включить доступ к WiFi" в разделе "Идентификатор приложения" на портале developer.apple.com.

Обязательно создайте новый профиль обеспечения после включения параметра "Доступ к информации WiFi" в идентификаторе приложения.