2015-09-11 20 views
10

Im Versuch, diesen Code zu verwenden SSID zu erhaltenSSID in 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 
    } 
} 

aber in einen Fehler in dieser Zeile immer let interfacesArray = interfaces.takeRetainedValue() as [String : AnyObject]

Der Fehler ist

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

Danke für Ihre Hilfe

+0

Mo Wahrscheinlich können Sie einfach die 'take (Un) RetainedValue()' Aufrufe entfernen, da die Funktion in Swift 2 keine unmanaged Objekte mehr zurückgibt. Siehe http://stackoverflow.com/questions/30740000/withunsafepointer-in-swift -2 für eine ähnliche Frage und Antwort. –

+0

Ich löschte die .takeRetainedValue(), aber jetzt bekomme ich einen EXC_BREAKPOINT (EXC_ARM_BREAKPOINT, subcode = 0xe7ffdefe), wenn ich versuche, den Code zu testen –

+0

Leider kann ich dir damit nicht helfen. Ich habe kein eigenes Netzwerk, um den Code zu testen. –

Antwort

1

In swift 2 müssen Sie nicht takeRetainedValue anrufen.

Den Code interfaces.takeRetainedValue() as [String : AnyObject] durch Array(arrayLiteral: interfaces) ersetzen.

Denken Sie auch daran, den Code interfacesArray[0] as String in String(interfacesArray[0]) zu ändern.

Voll Code:

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

Dieser Code wird nicht unter iOS 9.2 kompiliert. Es verwendet immer noch eine Version von takeRetainedValue(), die nicht mehr verfügbar ist. – mbeaty

20

Dies kann Ihnen helfen (auf Swift 2 getestet):

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

Ich nahm und den Code von Ray Wenderlich Website angepasst (einmal war hier: Retrieve SSID in iOS9 aber jetzt wurde der spezifische Thread von der Seite entfernt)

+0

Beachten Sie, dass 'CNCopySupportedInterfaces' im Simulator kein Nil zurückgibt. Sie sollten daher prüfen, ob 'interfaces' nicht gleich null ist. – Fogh

+0

Ja, eigentlich habe ich diese Möglichkeit nicht in Betracht gezogen. Vielleicht ist es besser zu überprüfen, ob die App innerhalb des Simulators läuft, und in diesem Fall eine "falsche" SSID zurückgibt (siehe Makro #if TARGET_IPHONE_SIMULATOR) – RikiRiocma

+0

Es ist viel einfacher zu sagen: 'wenn es Interfaces gibt: CFArray! = CNCopySupportedInterfaces() ' – Fogh

0

Die folgende Funktion der WLAN-Name und der Mac zurückkehren Dieser Code funktioniert

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

Adresse. Sie werden bemerken, einige Warnung in Ihrem Entwicklungsziel> = iOS9

6

Alle derzeit angebotenen Lösungen scheint ziemlich komplex, mit hässlichen unsicheren Güssen.

ich war in der Lage, eine solche prägnante Lösungen, die bis (ohne schwarze Magie überhaupt):

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

"CNCopySupportedInterfaces" Veraltet in iOS 9.0. – norbDEV

+1

Noch haben wir keine anderen Optionen (diskutiert [hier] (https://forums.developer.apple.com/thread/11807) und viele Male auf der SO). – werediver

11

Das ist meine Lösung Swift 3iOS 10 und es funktioniert mit Xcode 8 gut ist

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 
    } 

} 

es zu benutzen:

let wifiName = network().getSSID() 

    guard wifiName != nil else { 

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

     return 
    } 


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

PS: Achtung es nicht funktioniert auf Simulator

+0

Achtung funktioniert nicht am Simulator +1 – Umitk

+0

Dies funktioniert perfekt in iOS 10, mit Swift 3. Danke !! – bey23

5

In Swift 3 (arbeitet in Echtgerät und Simulator):

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

Verbrauch:

SSID.fetchSSIDInfo() 

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

Scheint nicht am Simulator zu funktionieren. Irgendeine Idee? – user2695433

0

https://stackoverflow.com/users/3108877/rob ‚s Antwort - kürzere Version

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 
    }