Как использовать CaptiveNetwork для получения текущего имени точки доступа WiFi - PullRequest
25 голосов
/ 17 января 2011

Мне нужно получить имя подключенной в данный момент точки доступа 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);

Когда код работает на устройстве в точке доступа WiFi, captiveNtwrkDict равен nil.

Кому-нибудь удалось заставить его работать?Я не могу найти много документации или примеров примеров кода на CaptiveNetworks ... любая помощь будет высоко ценится.

Ответы [ 4 ]

27 голосов
/ 17 января 2011

Вам необходимо выяснить, какие сети доступны, а затем передать их в CNCopyCurrentNetworkInfo.Например:

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

... и вы можете использовать kCNNetworkInfoKeySSID в словаре, который вы вернули (myDict), чтобы узнать SSID.Не забудьте правильно освободить / управлять памятью.

23 голосов
/ 14 октября 2015

ОБНОВЛЕНИЕ для iOS 12, swift 4.2

iOS 12

Вы должны включить Access WiFi Information из возможностей.

Важно Чтобы использовать эту функцию в iOS 12 и позже, включите возможность Доступа к Информации WiFi для своего приложения в XCode. Когда вы включаете эту возможность, XCode автоматически добавляет право доступа к информации Wi-Fi в ваш файл разрешений и идентификатор приложения. Ссылка на документацию

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 в связанные библиотеки вашей цели (в стадии сборки).

Вот фрагмент кода в быстром (ответ RikiRiocma) :

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 возвращает ноль на симуляторе.)

Для Objective-c см. Ответ Эсада здесь и ниже

+ (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 ( источник )

Вам необходимо будет отправить электронное письмо по адресу networkextension@apple.com и запросить права. ( источник )

Пример кода ( Не мой код. См. Ответ Пабло А ):

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 Developer ,

8 голосов
/ 30 декабря 2013

Простой в использовании фрагмент кода (метод):

  • Добавить SystemConfiguration.framework

  • импорт

  • используйте метод ниже

    + (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;
    }
    
2 голосов
/ 04 октября 2018

Обратите внимание, что в Xcode 10 и iOS 12 теперь необходимо включить функцию «Доступ к информации Wi-Fi».

Источник: https://openradar.appspot.com/43280182

...