Pregunta Cómo obtener Wifi SSID en iOS9 después de que CaptiveNetwork haya quedado en desuso y las llamadas al nombre Wifi ya estén bloqueadas


Hasta el día de hoy, utilicé la Interfaz CaptiveNetwork para mostrar el nombre del Wifi actualmente conectado. La referencia de iOS 9 Prerelease ya mencionada, que los métodos de CaptiveNetwork se desprenden ahora, pero todavía funcionaban al principio.

Con la versión más nueva, Apple parece haber bloqueado ya estas llamadas (¿quizás por cuestiones de privacidad?).

¿Hay alguna otra manera de obtener el nombre del Wifi actual?

Así es como obtuve el SSID hasta hoy, pero ahora solo obtienes nada:

#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"]; 
    } 
} 

32
2017-07-22 06:38


origen


Respuestas:


En el GM para iOS 9, parece que esto está habilitado de nuevo. De hecho, ni siquiera aparece como obsoleto en la documentación en línea, sin embargo, el archivo de encabezado de CaptiveNetwork tiene lo siguiente:

CNCopySupportedInterfaces (void) __OSX_AVAILABLE_BUT_DEPRECATED_MSG(__MAC_10_8, __MAC_NA, __IPHONE_4_1, __IPHONE_9_0, CN_DEPRECATION_NOTICE);

Por lo tanto, está trabajando en el iOS 9 GM, pero no estoy seguro de cuánto tiempo :)


10
2017-09-10 15:46



Registre su aplicación como ayudante de Hotspot.

#import <NetworkExtension/NetworkExtension.h>  

NSArray * networkInterfaces = [NEHotspotHelper supportedNetworkInterfaces];  
NSLog(@"Networks %@",networkInterfaces);  

ACTUALIZACIÓN (11 de septiembre de 2015) 

En su lugar, las siguientes API de red cautiva se han vuelto a habilitar en la última versión de iOS 9.

  • CNCopySupportedInterfaces
  • CNCopyCurrentNetworkInfo

ACTUALIZACIÓN (16 de septiembre de 2015)

Si aún prefieres usar NetworkExtension y Apple le dio permiso para agregar las autorizaciones, luego puede hacer esto para obtener la información de wifi:

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 le proporciona información adicional como segura, auto unida o la potencia de la señal. Y también le permite establecer credenciales a wifis en modo de fondo, cuando el usuario escanea wifis.


29
2017-07-23 14:46



Confirmar en 2017-abril-27, la red cautiva sigue trabajando para Swift 3.1, XCode 8.3

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

por C objetivo

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
2018-04-21 12:57



CaptiveNetwork todavía funciona. Debido a muchas solicitudes, Apple puede haber restablecido las API.

Usando CaptiveNetwork podemos obtener el SSID de la red WiFi. Incluso funciona en iOS 10.

#import <SystemConfiguration/CaptiveNetwork.h>

NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)name);

Aquí está el resultado:

Printing description of info:
{
    BSSID = "5*:**:**:**:**:**";
    SSID = Cisco12814;
    SSIDDATA = <43697363 6f313238 3134>;
}

1
2017-09-20 11:28



Como se mencionó antes, CaptiveNetwork funciona bien con Xcode 8.3 y superior. Aquí hay fragmentos de código para ambos Swift 3, Swift 4 y C objetivo.

Swift 3 y 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
    }

}

C objetivo

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

1
2018-03-16 14:48