inc images fotos apple iphone xcode

iphone - images - apple photos



iPhone recibe SSID sin biblioteca privada (7)

ACTUALIZACIÓN PARA iOS 10 y posteriores

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 = 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.

Tengo una aplicación comercial que tiene un motivo completamente legítimo para ver el SSID de la red a la que está conectado: si está conectado a una red Adhoc para un dispositivo de hardware de otro fabricante, debe funcionar de una manera diferente que si conectado a Internet.

Todo lo que he visto sobre cómo obtener el SSID me dice que tengo que usar Apple80211, que entiendo es una biblioteca privada. También leí que si uso una biblioteca privada, Apple no aprobará la aplicación.

¿Estoy atrapado entre un Apple y un lugar difícil, o hay algo que me falta aquí?


A partir de iOS 7 u 8, puede hacer esto, que aprovecha ARC y módulos, que se vincularán automáticamente en el marco necesario:

@import SystemConfiguration.CaptiveNetwork; /** Returns first non-empty SSID network info dictionary. * @see CNCopyCurrentNetworkInfo */ - (NSDictionary *)fetchSSIDInfo { NSArray *interfaceNames = CFBridgingRelease(CNCopySupportedInterfaces()); NSLog(@"%s: Supported interfaces: %@", __func__, interfaceNames); NSDictionary *SSIDInfo; for (NSString *interfaceName in interfaceNames) { SSIDInfo = CFBridgingRelease( CNCopyCurrentNetworkInfo((__bridge CFStringRef)interfaceName)); NSLog(@"%s: %@ => %@", __func__, interfaceName, SSIDInfo); BOOL isNotEmpty = (SSIDInfo.count > 0); if (isNotEmpty) { break; } } return SSIDInfo; }

(Esto es una modernización de un ejemplo de código escrito para iOS 4.1 o superior. Los únicos cambios fueron la introducción de nombres de variable más claros y la adopción de ARC y módulos).

Ejemplo de salida:

2011-03-04 15:32:00.669 ShowSSID[4857:307] -[ShowSSIDAppDelegate fetchSSIDInfo]: Supported interfaces: ( en0 ) 2011-03-04 15:32:00.693 ShowSSID[4857:307] -[ShowSSIDAppDelegate fetchSSIDInfo]: en0 => { BSSID = "ca:fe:ca:fe:ca:fe"; SSID = XXXX; SSIDDATA = <01234567 01234567 01234567>; }

Tenga en cuenta que no se admiten ifs en el simulador. Prueba en tu dispositivo.

Antes de 4.1, es posible que tenga algo de suerte en el diccionario de configuración del sistema. Por ejemplo, usando scutil en mi Mac:

$ scutil > show State:/Network/Interface/en1/AirPort <dictionary> { Power Status : 1 SecureIBSSEnabled : FALSE BSSID : <data> 0xcafecafecafe SSID_STR : XXXX SSID : <data> 0x012345670123456701234567 Busy : FALSE CHANNEL : <dictionary> { CHANNEL : 1 CHANNEL_FLAGS : 10 } } > exit


Aquí está la breve y dulce versión de Swift.

Recuerde vincular e importar el Marco:

import UIKit import SystemConfiguration.CaptiveNetwork

Definir el método:

func fetchSSIDInfo() -> CFDictionary? { if let ifs = CNCopySupportedInterfaces().takeUnretainedValue() as? [String], ifName = ifs.first, info = CNCopyCurrentNetworkInfo((ifName as CFStringRef)) { return info.takeUnretainedValue() } return nil }

Llame al método cuando lo necesite:

if let ssidInfo = fetchSSIDInfo() as? [String:AnyObject], ssID = ssidInfo["SSID"] as? String { println("SSID: /(ssID)") } else { println("SSID not found") }

Como se mencionó en otra parte, esto solo funciona en tu iDevice. Cuando no está en WiFi, el método devolverá nulo, de ahí el opcional.


Aquí está la versión limpiada de ARC, basada en el código de @ elsurudo:

- (id)fetchSSIDInfo { NSArray *ifs = (__bridge_transfer NSArray *)CNCopySupportedInterfaces(); NSLog(@"Supported interfaces: %@", ifs); NSDictionary *info; for (NSString *ifnam in ifs) { info = (__bridge_transfer NSDictionary *)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam); NSLog(@"%@ => %@", ifnam, info); if (info && [info count]) { break; } } return info; }


Este código funciona bien para obtener SSID.

#import <SystemConfiguration/CaptiveNetwork.h> @implementation IODAppDelegate @synthesize window = _window; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { CFArrayRef myArray = CNCopySupportedInterfaces(); CFDictionaryRef myDict = CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(myArray, 0)); NSLog(@"Connected at:%@",myDict); NSDictionary *myDictionary = (__bridge_transfer NSDictionary*)myDict; NSString * BSSID = [myDictionary objectForKey:@"BSSID"]; NSLog(@"bssid is %@",BSSID); // Override point for customization after application launch. return YES; }

Y este es el resultado:

Connected at:{ BSSID = 0; SSID = "Eqra''aOrange"; SSIDDATA = <45717261 27614f72 616e6765>;

}


Esto funciona para mí en el dispositivo (no en el simulador). Asegúrese de agregar el marco de configuración del sistema.

#import <SystemConfiguration/CaptiveNetwork.h> + (NSString *)currentWifiSSID { // Does not work on the simulator. NSString *ssid = nil; NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces(); for (NSString *ifnam in ifs) { NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam); if (info[@"SSID"]) { ssid = info[@"SSID"]; } } return ssid; }