Como eu uso o CaptiveNetwork para obter o nome atual do hotspot WiFi?

Preciso obter o nome do ponto de access Wi-Fi atualmente conectado, por exemplo, “BT OpenZone”

Foi-me dito que pode ser feito com CaptiveNetwork especificamente CNCopyCurrentNetworkInfo

Meu código até agora:

#import  ... // 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); 

Quando o código é executado em um dispositivo em um hotspot WiFi, o captiveNtwrkDict é nulo.

Alguém conseguiu fazê-lo funcionar? Não consigo encontrar muita documentação ou exemplos de código de exemplo em CaptiveNetworks … qualquer ajuda seria muito apreciada.

    Você precisa descobrir quais redes estão disponíveis e, em seguida, passá-las para CNCopyCurrentNetworkInfo. Por exemplo:

     CFArrayRef myArray = CNCopySupportedInterfaces(); CFDictionaryRef myDict = CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(myArray, 0)); 

    … e você pode usar o kCNNetworkInfoKeySSID no dictionary que você obteve (myDict) para descobrir o SSID. Não esqueça de liberar / gerenciar a memory apropriadamente.

    ATUALIZAÇÃO PARA iOS 10

    O CNCopySupportedInterfaces não está mais obsoleto no iOS 10. ( API Reference )

    Você precisa importar SystemConfiguration / CaptiveNetwork.h e adicionar SystemConfiguration.framework às bibliotecas vinculadas do seu destino (em fases de compilation).

    Aqui está um trecho de código no swift (Resposta do RikiRiocma) :

     import Foundation import SystemConfiguration.CaptiveNetwork public class SSID { class func fetchSSIDInfo() -> String { var currentSSID = "" if let interfaces:CFArray! = CNCopySupportedInterfaces() { for i in 0.. = 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 retorna nulo no simulador.)

    Para Objective-c, veja a resposta de Esad aqui e abaixo

     + (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; } 

    ATUALIZAÇÃO PARA iOS 9

    A partir do iOS 9, o Captive Network está obsoleto *. ( fonte )

    * Não mais obsoleto no iOS 10, veja acima.

    É recomendado que você use NEHotspotHelper ( source )

    Você precisará enviar um e-mail para apple em networkextension@apple.com e solicitar direitos. ( fonte )

    Exemplo de código ( não meu código. Veja a resposta 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: Sim, eles desaprovaram CNCopySupportedInterfaces no iOS 9 e inverteram sua posição no iOS 10. Falei com um engenheiro de redes da Apple e a reversão veio depois que tantas pessoas arquivaram Radars e falaram sobre o assunto nos fóruns Apple Developer.

    Fácil de usar trecho de código (método):

    • Adicionar SystemConfiguration.framework

    • import

    • use o método abaixo

       + (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; }