J'essaie d'utiliser ce code pour obtenir le SSID
import Foundation
import SystemConfiguration.CaptiveNetwork
public class SSID {
class func getSSID() -> String{
var currentSSID = ""
let interfaces = CNCopySupportedInterfaces()
if interfaces != nil {
let interfacesArray = interfaces.takeRetainedValue() as [String : AnyObject]
if interfacesArray.count > 0 {
let interfaceName = interfacesArray[0] as String
let unsafeInterfaceData = CNCopyCurrentNetworkInfo(interfaceName)
if unsafeInterfaceData != nil {
let interfaceData = unsafeInterfaceData.takeRetainedValue() as Dictionary!
currentSSID = interfaceData[kCNNetworkInfoKeySSID] as! String
let ssiddata = NSString(data:interfaceData[kCNNetworkInfoKeySSIDData]! as! NSData, encoding:NSUTF8StringEncoding) as! String
// ssid data from hex
print(ssiddata)
}
}
}
return currentSSID
}
}
Mais en obtenant une erreur dans cette ligne let interfacesArray = interfaces.takeRetainedValue() as [String : AnyObject]
L'erreur est
Value of type 'CFArray?' has no member 'takeRetainedValue'
Merci de votre aide
Cela peut vous aider (testé sur Swift 2):
import Foundation
import SystemConfiguration.CaptiveNetwork
public class SSID {
class func fetchSSIDInfo() -> String {
var currentSSID = ""
if let interfaces = 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
}
}
J'ai pris et adapté le code du site de Ray Wenderlich (une fois était ici: Récupérer le SSID dans iOS9 mais maintenant le fil spécifique a été supprimé du site)
iOS 12
Vous devez activer l'accès aux informations WiFi à partir des fonctionnalités.
Important Pour utiliser cette fonction dans iOS 12 et versions ultérieures, activez la fonctionnalité Accéder aux informations WiFi de votre application dans Xcode. Lorsque vous activez cette fonctionnalité, Xcode ajoute automatiquement le droit d'accès Informations WiFi à votre fichier de droits et à votre identifiant d'application. Lien vers la documentation
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"] as! String
debugPrint("ssid=\(currentSSID), BSSID=\(BSSID), SSIDDATA=\(SSIDDATA)")
}
}
}
return currentSSID
}
}
C’est ma solution Swift 3 iOS 10 et cela fonctionne bien avec Xcode 8
import Foundation
import SystemConfiguration.CaptiveNetwork
class network : NSObject {
func getSSID() -> String? {
let interfaces = CNCopySupportedInterfaces()
if interfaces == nil {
return nil
}
let interfacesArray = interfaces as! [String]
if interfacesArray.count <= 0 {
return nil
}
let interfaceName = interfacesArray[0] as String
let unsafeInterfaceData = CNCopyCurrentNetworkInfo(interfaceName as CFString)
if unsafeInterfaceData == nil {
return nil
}
let interfaceData = unsafeInterfaceData as! Dictionary <String,AnyObject>
return interfaceData["SSID"] as? String
}
}
Pour l'utiliser:
let wifiName = network().getSSID()
guard wifiName != nil else {
//// TODO: Alert -----
print("no wifi name")
return
}
print("my network name is: \(wifiName!)")
PS: Attention ça ne marche pas sur simulateur
Toutes les solutions présentées à l'heure actuelle semblent plutôt complexes, avec des moulages laids et dangereux.
J'ai pu élaborer une solution aussi concise (sans magie noire):
import Foundation
import SystemConfiguration.CaptiveNetwork
func getSSID() -> String? {
var ssid: String?
if let interfaces = CNCopySupportedInterfaces() as NSArray? {
for interface in interfaces {
if let interfaceInfo = CNCopyCurrentNetworkInfo(interface as! CFString) as NSDictionary? {
ssid = interfaceInfo[kCNNetworkInfoKeySSID as String] as? String
break
}
}
}
return ssid
}
Dans Swift 3 (fonctionne dans un appareil réel et un simulateur):
import SystemConfiguration.CaptiveNetwork
internal class SSID {
class func fetchSSIDInfo() -> String {
var currentSSID = ""
if let interfaces:CFArray = 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 unsafeInterfaceData != nil {
let interfaceData = unsafeInterfaceData! as Dictionary!
currentSSID = ((interfaceData as? [String : AnyObject])?["SSID"])! as! String
}
}
}
return currentSSID
}
}
Usage:
SSID.fetchSSIDInfo()
//will return "" if no connected wifi or running in simulator
Dans Swift 2, vous n'avez pas à appeler takeRetainedValue
.
Remplacez le code interfaces.takeRetainedValue() as [String : AnyObject]
par Array(arrayLiteral: interfaces)
.
Rappelez-vous également de changer le code interfacesArray[0] as String
en String(interfacesArray[0])
.
Code complet:
public class SSID {
class func getSSID() -> String{
var currentSSID = ""
let interfaces = CNCopySupportedInterfaces()
if interfaces != nil {
let interfacesArray = Array(arrayLiteral: interfaces)
if interfacesArray.count > 0 {
let interfaceName = String(interfacesArray[0])
let unsafeInterfaceData = CNCopyCurrentNetworkInfo(interfaceName)
if unsafeInterfaceData != nil {
let interfaceData = unsafeInterfaceData.takeRetainedValue() as Dictionary!
currentSSID = interfaceData[kCNNetworkInfoKeySSID] as! String
let ssiddata = NSString(data:interfaceData[kCNNetworkInfoKeySSIDData]! as! NSData, encoding:NSUTF8StringEncoding) as! String
// ssid data from hex
print(ssiddata)
}
}
}
return currentSSID
}
}
Version Swift 4
import SystemConfiguration.CaptiveNetwork
func getSSID() -> String? {
guard let interface = (CNCopySupportedInterfaces() as? [String])?.first,
let unsafeInterfaceData = CNCopyCurrentNetworkInfo(interface as CFString) as? [String: Any],
let ssid = unsafeInterfaceData["SSID"] as? String else{
return nil
}
return ssid
}
Vous pouvez trouver une autre réponse avec les normes Swift mises à jour pour la réponse @japes qui prend en charge Swift 3 et Swift 4 . Renvoie ""
vide sur les simulateurs.
import SystemConfiguration.CaptiveNetwork
internal class SSID {
class func fetchSSIDInfo() -> String {
var currentSSID = ""
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 currentSSID
}
guard let interfaceData = unsafeInterfaceData as? [String: Any] else {
return currentSSID
}
guard let SSID = interfaceData["SSID"] as? String else {
return currentSSID
}
currentSSID = SSID
}
}
return currentSSID
}
}
https://stackoverflow.com/users/3108877/rob réponse - version abrégée
func getSSID() -> String? {
if let interface = (CNCopySupportedInterfaces() as? [String])?.first,
let unsafeInterfaceData = CNCopyCurrentNetworkInfo(interface as CFString) as? [String: Any],
let ssid = unsafeInterfaceData["SSID"] as? String {
return ssid
}
return nil
}
La fonction suivante renvoie le nom wifi et l'adresse Mac
func getNetworkInfo()->(success:Bool,ssid:String,mac:String){
var currentSSID:String = ""
var macAdrees:String = ""
var succes:Bool = false
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
macAdrees = interfaceData["BSSID"] as! String
succes = true
} else {
currentSSID = ""
}
}
return (succes, currentSSID, macAdrees)
}
Ce code fonctionne bien. Vous remarquerez quelques avertissements dans votre cible de développement> = iOS9