Tengo una aplicación comercial que tiene una razón completamente legítima para ver el SSID de la red a la que está conectada: si está conectada a una red Adhoc para un dispositivo de hardware de terceros, debe estar funcionando de una manera diferente de lo que es. conectado a Internet.
Todo lo que he visto sobre 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 una Apple y un lugar difícil, o hay algo que me falta aquí?
Respuestas:
A partir de iOS 7 u 8, puede hacer esto (necesita el derecho para iOS 12+ como se muestra a continuación):
Salida de ejemplo:
Tenga en cuenta que no se admiten ifs en el simulador. Prueba en tu dispositivo.
iOS 12
Debe habilitar el acceso a la información wifi desde las capacidades.
Swift 4.2
fuente
@import
lugar de#import
) Clang se vinculará automáticamente en el marco necesario cuando se importe un módulo, en lugar de solo un encabezado.CNCopyCurrentNetworkInfo
devolver información útil; de lo contrario vuelvenil
. Ver: stackoverflow.com/questions/56583650/…Aquí está la versión ARC limpiada, basada en el código de @ elsurudo:
fuente
ACTUALIZACIÓN PARA iOS 10 y superior
CNCopySupportedInterfaces ya no está en desuso en iOS 10. ( Referencia de la 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) :
( Importante: CNCopySupportedInterfaces devuelve nulo en el simulador).
Para Objective-c, vea la respuesta de Esad aquí y abajo
ACTUALIZACIÓN PARA iOS 9
A partir de iOS 9, Captive Network está en desuso *. ( fuente )
* Ya no está en desuso en iOS 10, ver arriba.
Se recomienda usar NEHotspotHelper ( fuente )
Deberá enviar un correo electrónico a apple a [email protected] y solicitar derechos. ( fuente )
Código de muestra ( no es mi código. Vea la respuesta de Pablo A ):
Nota al margen: Sí, desaprobaron CNCopySupportedInterfaces en iOS 9 e invirtieron su posición en iOS 10. Hablé con un ingeniero de redes de Apple y la reversión se produjo después de que muchas personas archivaron Radares y hablaron sobre el problema en los foros de desarrolladores de Apple.
fuente
Esto funciona para mí en el dispositivo (no simulador). Asegúrese de agregar el marco de configuración del sistema.
fuente
Este código funciona bien para obtener SSID.
Y estos son los resultados:
}
fuente
Si está ejecutando iOS 12, deberá realizar un paso adicional. He estado luchando para que este código funcione y finalmente encontré esto en el sitio de Apple: "Importante Para usar esta función en iOS 12 y versiones posteriores, habilite la capacidad de Acceso a información WiFi para su aplicación en Xcode. Cuando habilita esta capacidad, Xcode automáticamente agrega el derecho de Acceso a la información WiFi a su archivo de derechos y al ID de la aplicación ". https://developer.apple.com/documentation/systemconfiguration/1614126-cncopycurrentnetworkinfo
fuente
Consulte CNCopyCurrentNetworkInfo en CaptiveNetwork: http://developer.apple.com/library/ios/#documentation/SystemConfiguration/Reference/CaptiveNetworkRef/Reference/reference.html .
fuente
Aquí está la versión corta y dulce de Swift.
Recuerde vincular e importar el Marco:
Define el método:
Llame al método cuando lo necesite:
Como se mencionó en otra parte, esto solo funciona en su iDevice. Cuando no está en WiFi, el método devolverá nulo, de ahí el opcional.
fuente
Para iOS 13
A partir de iOS 13, su aplicación también necesita acceso a la ubicación principal para usar la
CNCopyCurrentNetworkInfo
función a menos que haya configurado la red actual o tenga configuraciones de VPN:Entonces, esto es lo que necesita (consulte la documentación de Apple ):
- Enlace la
CoreLocation.framework
biblioteca- Agregue
location-services
como unaUIRequiredDeviceCapabilities
clave / valor en Info.plist- Agregue una
NSLocationWhenInUseUsageDescription
clave / valor en Info.plist que describa por qué su aplicación requiere Ubicación principal- Agregue el "Acceso WiFi Derecho de información "para su aplicación
Ahora, como un ejemplo de Objective-C, primero verifique si se ha aceptado el acceso a la ubicación antes de leer la información de la red usando
CNCopyCurrentNetworkInfo
:fuente