ios - una - ssid ejemplo
Cómo obtener el SSID de Wifi en iOS9 después de que CaptiveNetwork está en desuso y las llamadas para el nombre de Wifi ya están bloqueadas (7)
Hasta hoy utilicé la interfaz de CaptiveNetwork para mostrar el nombre del Wifi conectado actualmente. La referencia de lanzamiento preliminar de iOS 9 ya indicó que los métodos de CaptiveNetwork ahora están depravados, pero aún funcionaban al principio.
Con la versión más reciente, Apple parece haber bloqueado estas llamadas (¿quizás debido a problemas de privacidad?)
¿Hay alguna otra forma 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"];
}
}
CaptiveNetwork sigue funcionando. 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á la salida:
Printing description of info:
{
BSSID = "5*:**:**:**:**:**";
SSID = Cisco12814;
SSIDDATA = <43697363 6f313238 3134>;
}
CaptiveNetwork sigue funcionando. Pero deberá agregar esto:
com.apple.developer.networking.wifi-info = true dentro de su Entitlements.plist.
Además, debe habilitar Habilitar la información WiFi de acceso en la parte de ID de la aplicación en su portal developer.apple.com.
Asegúrese de limpiar su entorno, generar un nuevo perfil de aprovisionamiento después de habilitar la opción "Acceder a información WiFi" en la ID de la aplicación.
Como se mencionó anteriormente, CaptiveNetwork funciona bien con Xcode 8.3 y superior. Aquí hay fragmentos de código para Swift 3 , Swift 4 y Objective-C .
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;
}
Confirme el 27 de abril de 2017, Captive Network sigue trabajando para
Swift 3.1
,
XCode 8.3
Para 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
}
}
}
}
Para el objetivo-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"]);
}
En el GM para iOS 9, parece que esto está habilitado nuevamente. De hecho, ni siquiera aparece como obsoleto en la documentación en línea, sin embargo, el archivo de encabezado 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);
Entonces, está funcionando en el iOS 9 GM, pero no estoy seguro de cuánto tiempo :)
La respuesta de abdullahselek sigue siendo correcta incluso para Swift 4.1 y 4.2.
Una pequeña advertencia es que ahora en iOS 12, debe ir a la sección de capacidades de su proyecto de aplicación y habilitar la función
Acceso a información WiFi
.
Agregará una entrada de derecho a su proyecto y permitirá que la función llamada
CNCopyCurrentNetworkInfo
funcione correctamente.
Si no hace esto, esa función simplemente devuelve nil. No se mostrarán errores ni advertencias en tiempo de ejecución sobre la titularidad faltante.
Para obtener más información, consulte el siguiente enlace a la documentación de Apple.
https://developer.apple.com/documentation/systemconfiguration/1614126-cncopycurrentnetworkinfo
Registre su aplicación como ayuda de Hotspot.
#import <NetworkExtension/NetworkExtension.h>
NSArray * networkInterfaces = [NEHotspotHelper supportedNetworkInterfaces];
NSLog(@"Networks %@",networkInterfaces);
ACTUALIZACIÓN (11 de septiembre de 2015)
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 prefiere usar
NetworkExtension
y Apple le dio permiso para agregar los derechos, puede hacerlo para obtener la información 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
proporciona información adicional como seguridad,
NetworkExtension
o intensidad de la señal.
Y también le permite establecer credenciales para wifis en modo de fondo, cuando el usuario escanea wifis.