iphone - internet - ¿Cómo uso CaptiveNetwork para obtener el nombre actual de Hotspot WiFi?
hotspot internet ilimitado (3)
Necesito obtener el nombre del punto de conexión Wi-Fi actualmente conectado, por ejemplo, "BT OpenZone"
Me han dicho que se puede hacer con CaptiveNetwork específicamente CNCopyCurrentNetworkInfo
Mi código hasta ahora:
#import <SystemConfiguration/CaptiveNetwork.h>
...
// Get the dictionary containing the captive network infomation
CFDictionaryRef captiveNtwrkDict = CNCopyCurrentNetworkInfo(kCNNetworkInfoKeySSID);
// Get the count of the key value pairs to test if it has worked
int count = CFDictionaryGetCount(captiveNtwrkDict);
NSLog(@"Count of dict:%d",count);
Cuando el código se ejecuta en un dispositivo en un punto de acceso WiFi, captiveNtwrkDict
es nulo.
¿Alguien ha logrado que funcione? No encuentro mucha documentación o ejemplos de código de ejemplo en CaptiveNetworks ... cualquier ayuda sería muy apreciada.
ACTUALIZACIÓN PARA iOS 10
CNCopySupportedInterfaces ya no está en desuso en iOS 10. ( Referencia de API )
Debe importar SystemConfiguration / CaptiveNetwork.h y agregar SystemConfiguration.framework a las bibliotecas vinculadas de su destino (en las fases de compilación).
Aquí hay un fragmento de código en swift (Respuesta de RikiRiocma) :
import Foundation
import SystemConfiguration.CaptiveNetwork
public class SSID {
class func fetchSSIDInfo() -> String {
var currentSSID = ""
if let interfaces:CFArray! = CNCopySupportedInterfaces() {
for i in 0..<CFArrayGetCount(interfaces){
let interfaceName: UnsafePointer<Void> = CFArrayGetValueAtIndex(interfaces, i)
let rec = unsafeBitCast(interfaceName, AnyObject.self)
let unsafeInterfaceData = CNCopyCurrentNetworkInfo("/(rec)")
if unsafeInterfaceData != nil {
let interfaceData = unsafeInterfaceData! as Dictionary!
currentSSID = interfaceData["SSID"] as! String
}
}
}
return currentSSID
}
}
( Importante: CNCopySupportedInterfaces devuelve nil en el simulador).
Para Objective-c, consulte la respuesta de Esad aquí y debajo
+ (NSString *)GetCurrentWifiHotSpotName {
NSString *wifiName = nil;
NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
for (NSString *ifnam in ifs) {
NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
if (info[@"SSID"]) {
wifiName = info[@"SSID"];
}
}
return wifiName;
}
ACTUALIZACIÓN PARA iOS 9
A partir de iOS 9, la red cautiva está en desuso *. ( source )
* Ya no está en desuso en iOS 10, ver arriba.
Se recomienda utilizar NEHotspotHelper ( source )
Tendrá que enviar un correo electrónico a apple a [email protected] y solicitar derechos. ( source )
Código de muestra ( no es mi código. Consulte la respuesta de Pablo A ):
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;
}
Nota al pie: Sí, desaprobaron CNCopySupportedInterfaces en iOS 9 e invirtieron su posición en iOS 10. Hablé con un ingeniero de redes de Apple y la revocación se produjo después de que mucha gente archivara radares y hablara sobre el tema en los foros de desarrolladores de Apple.
Fragmento de código fácil de usar (método):
Agregar SystemConfiguration.framework
import <SystemConfiguration / CaptiveNetwork.h>
usa el siguiente método
+ (NSString *)GetCurrentWifiHotSpotName { NSString *wifiName = nil; NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces(); for (NSString *ifnam in ifs) { NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam); NSLog(@"info:%@",info); if (info[@"SSID"]) { wifiName = info[@"SSID"]; } } return wifiName; }
Debe averiguar qué redes están disponibles y luego pasarlas a CNCopyCurrentNetworkInfo. Por ejemplo:
CFArrayRef myArray = CNCopySupportedInterfaces();
CFDictionaryRef myDict = CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(myArray, 0));
... y luego puede usar el kCNNetworkInfoKeySSID en el diccionario que recibió (myDict) para averiguar el SSID. No te olvides de liberar / administrar la memoria de manera apropiada.