このコードを使用して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
}
}
_
しかし、この行でエラーが発生する場合let interfacesArray = interfaces.takeRetainedValue() as [String : AnyObject]
エラーは
_Value of type 'CFArray?' has no member 'takeRetainedValue'
_
ご協力いただきありがとうございます
これは役立つかもしれません(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
}
}
Ray Wenderlichのサイトからコードを取得して変更しました(かつてここにいた: iOS9でSSIDを取得 が、特定のスレッドがサイトから削除された)
iOS 12
機能からWiFi情報にアクセスできるようにする必要があります。
重要iOS 12以降でこの機能を使用するには、XcodeでアプリのWiFi情報へのアクセス機能を有効にします。この機能を有効にすると、Xcodeは自動的にアクセスWiFi情報の資格を資格ファイルとアプリIDに追加します。 ドキュメントリンク
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
}
}
これは私のソリューションですSwiftiOS 1そして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
}
}
それを使用するには:
let wifiName = network().getSSID()
guard wifiName != nil else {
//// TODO: Alert -----
print("no wifi name")
return
}
print("my network name is: \(wifiName!)")
PS:シミュレータでは機能しないことに注意してください
現時点で提示されているすべての解決策は、醜い危険なキャストで、かなり複雑に見えます。
私はそのような簡潔な解決策を作成することができました(まったく黒魔術はありません)。
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
}
Swift 3(実際のデバイスとシミュレータで動作)):
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
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
}
Swift 2では、takeRetainedValue
を呼び出す必要はありません。
コードinterfaces.takeRetainedValue() as [String : AnyObject]
をArray(arrayLiteral: interfaces)
に置き換えます。
また、コード_interfacesArray[0] as String
_をString(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
}
_
}
更新されたSwift @japes回答の標準SwiftとSwift 4の両方をサポートする別の回答を見つけることができます。空の""
を返すシミュレータ。
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 の答え-短いバージョン
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
}
次の関数は、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