2015-09-11 27 views
10

Im próbuje użyć tego kodu, aby uzyskać SSIDGet SSID w Swift 2

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

Ale otrzymuję błąd w tej linii let interfacesArray = interfaces.takeRetainedValue() as [String : AnyObject]

Błąd znajduje

Value of type 'CFArray?' has no member 'takeRetainedValue'

Dziękujemy za pomoc

+0

Mo prawdopodobnie, możesz po prostu usunąć wywołania 'take (Un) RetainedValue()', ponieważ funkcja ta nie zwraca już obiektów niezarządzanych w Swift 2. Zobacz http://stackoverflow.com/questions/30740000/withunsafepointer-in-swift -2 dla podobnych pytań i odpowiedzi. –

+0

Usunąłem .takeRetainedValue(), ale teraz otrzymuję EXC_BREAKPOINT (EXC_ARM_BREAKPOINT, subcode = 0xe7ffdefe), gdy próbuję przetestować kod –

+0

Niestety nie mogę ci w tym pomóc. Nie mam sieci przechwytującej, aby przetestować kod. –

Odpowiedz

1

W wersji 2 nie musisz dzwonić pod numer takeRetainedValue.

Wymień kod interfaces.takeRetainedValue() as [String : AnyObject] na Array(arrayLiteral: interfaces).

Pamiętaj również, aby zmienić kod interfacesArray[0] as String na String(interfacesArray[0]).

Pełny kod:

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 
} 

}

+0

Ten kod nie jest kompilowany w systemie iOS 9.2. Nadal używa wersji metody takeRetainedValue(), która nie jest już dostępna. – mbeaty

20

To może pomóc (testowane na 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 
    } 
} 

wziąłem i dostosować kod z witryny Ray Wenderlich jest (było kiedyś tutaj: Retrieve SSID in iOS9, ale teraz określony wątek został usunięty ze strony)

+0

Należy pamiętać, że 'CNCopySupportedInterfaces' zwraca zero na symulatorze. Dlatego powinieneś sprawdzić, czy 'interfejsy' nie są zerowe. – Fogh

+0

Tak, właściwie nie rozważałem tej możliwości. Może lepiej sprawdzić, czy aplikacja działa w symulatorze, i zwróć "fałszywy" identyfikator SSID w tym przypadku (zobacz makro #if TARGET_IPHONE_SIMULATOR) – RikiRiocma

+0

O wiele łatwiej jest po prostu powiedzieć: "jeśli pozwolisz interfejsom: CFArray! = CNCopySupportedInterfaces() ' – Fogh

0

Poniższa funkcja zwraca nazwę wifi i adres 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) 
} 

Ten kod działa poprawnie. Zauważysz pewne ostrzeżenie w swoim celu rozwoju> = iOS9

6

Wszystkie prezentowane obecnie rozwiązania wydają się dość złożone, z brzydkimi, niebezpiecznymi rzutami.

byłem w stanie spreparować taki zwięzły rozwiązanie (bez czarnej magii w ogóle):

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 
} 
+0

"Interfejsy CNCopySupportedInterfaces" nieaktualne w systemie iOS 9.0. – norbDEV

+1

Jednak nie mamy innych opcji (omówionych [tutaj] (https://forums.developer.apple.com/thread/11807) i wiele razy na SO). – werediver

11

To jest moje rozwiązanie Swift 3iOS 10 i to działa dobrze z 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 
    } 

} 

Aby go użyć:

let wifiName = network().getSSID() 

    guard wifiName != nil else { 

     //// TODO: Alert ----- 
     print("no wifi name") 

     return 
    } 


    print("my network name is: \(wifiName!)") 

PS: Uwaga to nie działa na symulatorze

+0

Uwaga, nie działa na symulatorze +1 – Umitk

+0

Działa to idealnie w iOS 10, używając Swift 3. Dzięki! – bey23

5

w Swift 3 (działa w prawdziwym urządzeniem i symulatora):

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

Zastosowanie:

SSID.fetchSSIDInfo() 

//will return "" if no connected wifi or running in simulator 
+0

Wydaje się nie działać na symulatorze. Dowolny pomysł? – user2695433

0

https://stackoverflow.com/users/3108877/rob „s odpowiedź - krótsza wersja:

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 
    }