web-dev-qa-db-fra.com

Comment obtenir le SSID Wifi dans iOS9 après que CaptiveNetwork soit déconseillé et que les appels pour le nom Wifi soient déjà bloqués

Jusqu'à aujourd'hui, j'utilisais l'interface CaptiveNetwork pour afficher le nom du Wifi actuellement connecté. La référence iOS 9 Prerelease indiquait déjà que les méthodes CaptiveNetwork étaient abandonnées maintenant, mais qu'elles fonctionnaient toujours au début.

Avec la dernière version Apple semble avoir déjà bloqué cet appel (peut-être pour des raisons de confidentialité?).

Existe-t-il un autre moyen d'obtenir le nom du Wifi actuel?

Voici comment j'ai obtenu le SSID jusqu'à aujourd'hui, mais vous obtenez maintenant rien:

#import <SystemConfiguration/CaptiveNetwork.h>

NSString *wifiName = nil;  
NSArray *interFaceNames = (__bridge_transfer id)CNCopySupportedInterfaces(); 

for (NSString *name in interFaceNames) { 
    NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)name); 

    if (info[@"SSID"]) { 
        wifiName = info[@"SSID"]; 
    } 
} 
35
Thyraz

Dans le GM pour iOS 9, il semble que cela soit à nouveau activé. En fait, il n'est même pas répertorié comme obsolète dans la documentation en ligne, mais le fichier d'en-tête CaptiveNetwork contient les éléments suivants:

CNCopySupportedInterfaces (void) __OSX_AVAILABLE_BUT_DEPRECATED_MSG(__MAC_10_8, __MAC_NA, __IPHONE_4_1, __IPHONE_9_0, CN_DEPRECATION_NOTICE);

Donc, cela fonctionne dans iOS 9 GM, mais je ne sais pas pour combien de temps :)

10
lewiguez

Enregistrez votre application en tant qu'assistant Hotspot.

#import <NetworkExtension/NetworkExtension.h>  

NSArray * networkInterfaces = [NEHotspotHelper supportedNetworkInterfaces];  
NSLog(@"Networks %@",networkInterfaces);  

MISE À JOUR (11 septembre 2015)

Les API de réseau captif suivantes ont été réactivées dans la dernière version d'iOS 9.

  • CNCopySupportedInterfaces
  • CNCopyCurrentNetworkInfo

MISE À JOUR (16 septembre 2015)

Si vous préférez toujours utiliser NetworkExtension et Apple vous a donné l'autorisation d'ajouter des droits, vous pouvez le faire pour obtenir les informations de connexion wifi:

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

NetworkExtension vous fournit des informations supplémentaires telles que la sécurité, la jointure automatique ou la force du signal. Et cela vous permet également de définir les informations d'identification sur wifis en mode arrière-plan, lorsque l'utilisateur numérise wifis.

31
Pablo A.

La réponse de abdullahselek est toujours correcte même pour Swift 4.1 et 4.2.

Une petite mise en garde est que maintenant dans iOS 12, vous devez accéder à la section des fonctionnalités de votre projet d'application et activer la fonctionnalité Accès aux informations WiFi . Cela ajoutera une entrée de droit à votre projet et permettra à l'appel de fonction CNCopyCurrentNetworkInfo de fonctionner correctement.

Si vous ne le faites pas, cette fonction renvoie simplement nil. Aucune erreur ni aucun avertissement au moment de l'exécution concernant le droit manquant ne sera affiché.

Pour plus d'informations, voir le lien ci-dessous vers la documentation d'Apple.

https://developer.Apple.com/documentation/systemconfiguration/1614126-cncopycurrentnetworkinfo

9
FerrousGuy

Confirmez le 27 avril 2017, Captive Network travaille toujours pour Swift 3.1, XCode 8.3

Pour Swift> 3.

func printCurrentWifiInfo() {
  if let interface = CNCopySupportedInterfaces() {
    for i in 0..<CFArrayGetCount(interface) {
      let interfaceName: UnsafeRawPointer = CFArrayGetValueAtIndex(interface, i)
      let rec = unsafeBitCast(interfaceName, to: AnyObject.self)
      if let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)" as CFString), let interfaceData = unsafeInterfaceData as? [String : AnyObject] {
        // connected wifi
        print("BSSID: \(interfaceData["BSSID"]), SSID: \(interfaceData["SSID"]), SSIDDATA: \(interfaceData["SSIDDATA"])")
      } else {
        // not connected wifi
      }
    }
  }
}

Pour Objective-C

NSArray *interFaceNames = (__bridge_transfer id)CNCopySupportedInterfaces();

for (NSString *name in interFaceNames) {
  NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)name);

  NSLog(@"wifi info: bssid: %@, ssid:%@, ssidData: %@", info[@"BSSID"], info[@"SSID"], info[@"SSIDDATA"]);
 }
8
nuynait

Comme mentionné précédemment, CaptiveNetwork fonctionne bien avec Xcode 8.3 et supérieur. Voici des extraits de code pour les deux Swift, Swift 4 et Objective-C.

Swift 3 & 4

import SystemConfiguration.CaptiveNetwork

internal class SSID {

    class func fetchSSIDInfo() -> [String: Any] {
        var interface = [String: Any]()
        if let interfaces = CNCopySupportedInterfaces() {
            for i in 0..<CFArrayGetCount(interfaces){
                let interfaceName = CFArrayGetValueAtIndex(interfaces, i)
                let rec = unsafeBitCast(interfaceName, to: AnyObject.self)
                guard let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)" as CFString) else {
                    return interface
                }
                guard let interfaceData = unsafeInterfaceData as? [String: Any] else {
                    return interface
                }
                interface = interfaceData
            }
        }
        return interface
    }

}

Objective-C

#import <SystemConfiguration/CaptiveNetwork.h>

+ (NSDictionary *)fetchSSIDInfo
{
    NSArray *interFaceNames = (__bridge_transfer id)CNCopySupportedInterfaces();
    for (NSString *name in interFaceNames)
    {
        NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)name);
        return info;
    }
    return nil;
}
4
abdullahselek

CaptiveNetwork fonctionne toujours. En raison de nombreuses demandes Apple peut avoir rétabli les API.

En utilisant CaptiveNetwork, nous pouvons obtenir le SSID du réseau WiFi. Cela fonctionne même dans iOS 10.

#import <SystemConfiguration/CaptiveNetwork.h>

NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)name);

Voici la sortie:

Printing description of info:
{
    BSSID = "5*:**:**:**:**:**";
    SSID = Cisco12814;
    SSIDDATA = <43697363 6f313238 3134>;
}
1
Ranjith

CaptiveNetwork fonctionne toujours. Mais vous devrez ajouter ceci:

com.Apple.developer.networking.wifi-info = true dans votre Entitlements.plist.

De plus, vous devez activer les informations d'accès WiFi dans la partie ID d'application de votre portail developer.Apple.com.

Assurez-vous que pour nettoyer votre environnement, générez un nouveau profil de provisioning après avoir activé l'option "Accéder aux informations WiFi" dans l'identifiant de l'application.

0
Tô Minh Tiến