Jak używać CaptiveNetwork, aby uzyskać bieżącą nazwę hotspotu WiFi

Muszę uzyskać nazwę aktualnie podłączonego hotspotu Wi-Fi, np. "BT OpenZone"

Powiedziano mi, że można to zrobić za pomocą CaptiveNetwork konkretnie CNCopyCurrentNetworkInfo

Mój kod do tej pory:

#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);

Gdy kod działa na urządzeniu w hotspocie WiFi, captiveNtwrkDict jest zerowy.

Czy komuś udało się to uruchomić? Nie mogę znaleźć wiele dokumentacji lub przykładowych przykładów kodu na CaptiveNetworks... każda pomoc będzie mile widziana.
Author: Stefan, 2011-01-17

4 answers

Musisz dowiedzieć się, które sieci są dostępne, a następnie przekazać je do CNCopyCurrentNetworkInfo. Na przykład:

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

...następnie możesz użyć kCNNetworkInfoKeySSID w słowniku, który masz z powrotem (myDict), aby dowiedzieć się o identyfikatorze SSID. Nie zapomnij odpowiednio zwolnić / zarządzać pamięcią.

 26
Author: lxt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-17 15:28:16

Aktualizacja dla iOS 10

CNCopySupportedInterfaces nie jest już przestarzały w systemie iOS 10. ( API Reference )

Musisz zaimportować SystemConfiguration / CaptiveNetwork.h i dodaj konfigurację systemu.framework do połączonych bibliotek Twojego celu (w fazie budowania).

Oto fragment kodu w języku swift (odpowiedź Rikiriocmy):

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
    }
}

(Ważne: CNCopySupportedInterfaces zwraca zero na symulatorze.)

Dla Objective-c, Zobacz odpowiedź Esada tutaj i poniżej

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

Aktualizacja dla iOS 9

[[5]}od iOS 9 sieć wewnętrzna jest przestarzała*. (source ) [5]} * nie jest już przestarzały w systemie iOS 10, patrz powyżej.

Zaleca się stosowanie NEHotspotHelper (source )

Będziesz musiał wysłać e-mail do apple na [email protected] i żądać uprawnień. (source )

Przykładowy kod ( nie mój kod. Zobacz odpowiedź 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;
}

Uwaga na marginesie: tak, wycofali CNCopySupportedInterfaces w iOS 9 i odwrócili swoją pozycję w iOS 10. Rozmawiałem z inżynierem sieciowym Apple, a odwrócenie nastąpiło po tym, jak wiele osób złożyło radary i wypowiedziało się o tym problemie na forach programistów Apple.

 19
Author: Emin Israfil iOS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:54

Łatwy w użyciu fragment kodu (Metoda):

  • Add SystemConfiguration.ramy

  • Import

  • Użyj poniższej metody

    + (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;
    }
    
 8
Author: Durai Amuthan.H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-30 11:51:47

Zauważ, że w Xcode 10 i iOS 12 musisz teraz włączyć funkcję" dostęp do informacji Wifi".

Źródło: https://openradar.appspot.com/43280182

 0
Author: Yuri Brigance,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-04 00:57:16