2015-09-11 11 views
10

をSSIDを取得イムSSIDスウィフト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 
    } 
} 

を取得するには、このコードを使用しようとしている。しかし、この行でエラーを取得 let interfacesArray = interfaces.takeRetainedValue() as [String : AnyObject]

にエラーが

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

ですあなたの助けをありがとう

+0

Moおそらく、関数はSwift 2で管理されていないオブジェクトを返さないので、 'take(Un)RetainedValue()'呼び出しを削除するだけです。http://stackoverflow.com/questions/30740000/withunsafepointerinfo -2同様の質疑応答のために。 –

+0

コードをテストしようとすると.takeRetainedValue()が削除されましたが、現在はEXC_BREAKPOINT(EXC_ARM_BREAKPOINT、サブコード= 0xe7ffdefe)を取得しています –

+0

残念ながら、私はそれを手伝うことはできません。コードをテストするためのキャプティブネットワークはありません。 –

答えて

1

速攻2では、takeRetainedValueに電話する必要はありません。

コードinterfaces.takeRetainedValue() as [String : AnyObject]Array(arrayLiteral: interfaces)に置き換えます。

コードinterfacesArray[0] as StringString(interfacesArray[0])に変更してください。

全コード:

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

このコードはiOS 9.2でコンパイルされません。それはもはや利用できないtakeRetainedValue()のバージョンを使用します。 – mbeaty

20

これはあなたを助けるかもしれない(スウィフト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 
    } 
} 

は私が撮ったとレイWenderlichのサイトからコードを適応(かつてここで: Retrieve SSID in iOS9しかし、特定のスレッドはサイトから削除されました)

+0

'CNCopySupportedInterfaces'はシミュレータでnilを返します。したがって、 'interfaces'がnilでないかどうかを確認する必要があります。 – Fogh

+0

はい、実際には私はこの可能性を考慮していません。おそらく、アプリケーションがシミュレータ内で実行されているかどうかを確認し、この場合は "偽の" SSIDを返します(マクロ#if TARGET_IPHONE_SIMULATORを参照してください) – RikiRiocma

+0

'if let interfaces:CFArray! = CNCopySupportedInterfaces() ' – Fogh

0

次の関数のwifi名および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) 
} 

に対処返します。あなたの開発目標> = iOS9で警告が表示されます

6

解決策は非常に複雑で、醜い安全でないキャストで表示されます。

私は(すべてではありません黒魔術と)、このような簡潔なソリューションを作ることができました:これは私の解決策であるスウィフト3

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" iOS 9.0では非推奨です。 – norbDEV

+1

しかし、私たちには他の選択肢はありません([here](https://forums.developer.apple.com/thread/11807)とその時代について何度も議論されています)。 – werediver

11

iOSの10とそれが8のXcodeでうまく動作します

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 
    } 

} 

それを使用するには、次の

let wifiName = network().getSSID() 

    guard wifiName != nil else { 

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

     return 
    } 


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

PS:注意スウィフト3ではシミュレータ

+0

これはシミュレータでは動作しません+1 – Umitk

+0

これは、Swift 3を使用してiOS 10で完璧に動作します。ありがとう!! – bey23

5

にそれがない作品(実デバイスとシミュレータで動作します):

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

使用法:

SSID.fetchSSIDInfo() 

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

シミュレータで動作しないようです。何か案が? – user2695433

0

https://stackoverflow.com/users/3108877/robの答え - 短いバージョン

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 
    } 
関連する問題