Как использовать CaptiveNetwork для получения текущего имени точки доступа Wi-Fi
Мне нужно получить имя подключенной в данный момент точки доступа Wi-Fi, например. "BT OpenZone"
Мне сказали, что это можно сделать с помощью CaptiveNetwork, в частности, CNCopyCurrentNetworkInfo
Мой код:
#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);
Когда код запускается на устройстве в точке доступа Wi-Fi, captiveNtwrkDict
равен нулю.
Кто-нибудь смог заставить его работать? Я не могу найти много документации или примеры примеров кода в CaptiveNetworks... любая помощь будет высоко оценена.
Ответы
Ответ 1
Вам нужно узнать, какие сети доступны, а затем передать их в CNCopyCurrentNetworkInfo. Например:
CFArrayRef myArray = CNCopySupportedInterfaces();
CFDictionaryRef myDict = CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(myArray, 0));
... и затем вы можете использовать kCNNetworkInfoKeySSID в словаре, который у вас есть (myDict), чтобы узнать SSID. Не забудьте освободить/управлять памятью соответствующим образом.
Ответ 2
ОБНОВЛЕНИЕ ДЛЯ iOS 12, быстрый 4.2
iOS 12
Вы должны включить Access WiFi Information из возможностей.
Важно. Чтобы использовать эту функцию в iOS 12 и более поздних версиях, включите возможность доступа к информации о WiFi для вашего приложения в Xcode. Когда вы включаете эту возможность, Xcode автоматически добавляет право доступа к информации о WiFi для вашего файла прав и идентификатора приложения. Ссылка на документацию
Swift4.2
public class SSID {
class func fetchSSIDInfo() -> String {
var currentSSID = ""
if let interfaces = CNCopySupportedInterfaces() {
for i in 0..<CFArrayGetCount(interfaces) {
let interfaceName: UnsafeRawPointer = CFArrayGetValueAtIndex(interfaces, i)
let rec = unsafeBitCast(interfaceName, to: AnyObject.self)
let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)" as CFString)
if let interfaceData = unsafeInterfaceData as? [String: AnyObject] {
currentSSID = interfaceData["SSID"] as! String
let BSSID = interfaceData["BSSID"] as! String
let SSIDDATA = interfaceData["SSIDDATA"]
debugPrint("ssid=\(currentSSID), BSSID=\(BSSID), SSIDDATA=\(SSIDDATA)")
}
}
}
return currentSSID
}
}
ОБНОВЛЕНИЕ ДЛЯ iOS 10
CNCopySupportedInterfaces больше не устарел в iOS 10. (Справочник по API)
Вам необходимо импортировать SystemConfiguration/CaptiveNetwork.h и добавить SystemConfiguration.framework в целевые связанные библиотеки (в фазах сборки).
Вот фрагмент кода в swift (RikiRiocma Answer):
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
}
}
(Важно: CNCopySupportedInterfaces возвращает nil на симуляторе.)
Для Objective-c см. Ответ Esad здесь и ниже
+ (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;
}
ОБНОВЛЕНИЕ ДЛЯ IOS 9
Начиная с iOS 9 Captive Network устарела *. (источник)
* Больше не рекомендуется использовать в iOS 10, см. Выше.
Он рекомендовал использовать NEHotspotHelper (источник)
Вам нужно будет отправить электронное письмо по адресу [email protected] и запросить разрешения. (источник)
Пример кода (не мой код. См. Ответ 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;
}
Замечание: Да, они отказались от CNCopySupportedInterfaces в iOS 9 и отменили свою позицию в iOS 10. Я поговорил с инженером по сети Apple, и разворот пришел после того, как так много людей подали Radars и высказались об этой проблеме на форумах разработчиков Apple.
Ответ 3
Простой в использовании фрагмент кода (метод):
-
Добавить SystemConfiguration.framework
-
import < SystemConfiguration/CaptiveNetwork.h >
-
используйте приведенный ниже метод
+ (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;
}
Ответ 4
Обратите внимание, что в Xcode 10 и iOS 12 вам нужно включить функцию "Доступ к Wifi-информации".
Источник: https://openradar.appspot.com/43280182