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.
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ą.
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.
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; }
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".
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