2015-07-31 23 views
8

Geçerli aygıtın SSID'sini almaya çalışıyorum. Bunun nasıl yapılacağına dair çok sayıda örnek buldum ancak CNCopySupportedInterfaces'i otomatik tamamlama konusunda zorlanıyorum. Hızlı dosyamın en üstünde 'Import SystemConfiguration' var ama başarı yok. Yanlış yaptığım şeyi anlayamıyorum. Eğer Objective-C biliyorsanızSwift CNCopySupportedInterfaces geçerli değil

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/SystemConfiguration.framework/Headers/CaptiveNetwork.h

, bu gider: Sen kapakları altında import SystemConfiguration.CaptiveNetwork

ihtiyaç

cevap

15

, CaptiveNetwork SystemConfiguration çerçevesinde bir C başlık dosyası (.h) 'dir

Ayrıca iPhone get SSID without private library

, otomatik tamamlama: ayrıntılı bilgileri daha Eski mirastan memnun değildir; Sadece üst seviyedeki dersleri istiyor. Muhtemelen sadece # @ $ @ # globals olduğu için.

Oh, ve işe almak için bu harika pasajı yazmak zorunda:

for interface in CNCopySupportedInterfaces().takeRetainedValue() as! [String] { 
     println("Looking up SSID info for \(interface)") // en0 
     let SSIDDict = CNCopyCurrentNetworkInfo(interface).takeRetainedValue() as! [String : AnyObject] 
     for d in SSIDDict.keys { 
      println("\(d): \(SSIDDict[d]!)") 
     } 
    } 

REVİZE EK SWIFT 2.2 İÇİN ve 3,0

Köprü henüz basitleştirilmiş için yeniden karmaşık olmuştur CFxxx datatypes ve şimdi unwrapping ve çok fazla feribot gerekiyor ama aramaları saklamıyor. Swift 2'nin işleri daha kolay hale getirdiğini bilmiyorum ama ne olduğu oldukça açık, artı nil simülatörü tanımamıza yardımcı oluyor. Diğer cevapta, Swiftian olmayan gibi görünen çok fazla bit döküm ve güvensiz operasyonlar kullanılıyor.

func getInterfaces() -> Bool { 
     guard let unwrappedCFArrayInterfaces = CNCopySupportedInterfaces() else { 
      print("this must be a simulator, no interfaces found") 
      return false 
     } 
     guard let swiftInterfaces = (unwrappedCFArrayInterfaces as NSArray) as? [String] else { 
      print("System error: did not come back as array of Strings") 
      return false 
     } 
     for interface in swiftInterfaces { 
      print("Looking up SSID info for \(interface)") // en0 
      guard let unwrappedCFDictionaryForInterface = CNCopyCurrentNetworkInfo(interface) else { 
       print("System error: \(interface) has no information") 
       return false 
      } 
      guard let SSIDDict = (unwrappedCFDictionaryForInterface as NSDictionary) as? [String: AnyObject] else { 
       print("System error: interface information is not a string-keyed dictionary") 
       return false 
      } 
      for d in SSIDDict.keys { 
       print("\(d): \(SSIDDict[d]!)") 
      } 
     } 
     return true 
    } 

[Ayrıca, 10 dakika sonra otomatik tamamlama CNxxx için çalışmaya başladı. Açıkça, bir arka plan iplik yoğun bir şekilde SourceKit globals binlerce sindirilerek] başarı

Çıkış.

SSIDDATA: < 57696c6d 79>

BSSID: 12: 34: 56: 78: 9a: bc

SSID: Swift 2.0 YourSSIDHere

+0

takeRetainedValue nedir Alındığı()? – Nilesh

+0

ARC tarafından tutulan nesneleri kullanmayan eski C API'leriyle uyumluluk içindir. Nesneyi ARC kapsamında yönetime taşır, böylece artık ihtiyacınız olmadığında otomatik olarak serbest bırakılır. http://stackoverflow.com/questions/29048826/when-to-use-takeunretainedvalue-or-takeretainedvalue-to-retrieve-unmanaged-o – BaseZen

+0

Swift 2.2 için Düzenlendi – BaseZen

8

/iOS 9 API CaptiveNetwork (hemen hemen) gitti ya da amorti edilir. Bu sorunla ilgili olarak Apple ile temasa geçtim ve bunun yerine NEHotspotHelper'ı kullanabileceğimizi düşündük. Bugün Apple bir cevap aldı:

kullanıcı Braime Bu sorunun güncelleştirilmiş kod parçacığını yayınlanmıştır
CNCopySupportedInterfaces 
CNCopyCurrentNetworkInfo 

Ray Wenderlich forums tarih::

Bir CaptiveNetwork ve iki ilgili API'ler (bile zor orada itfa işaretli) kullanmaya devam etmelidir

Benim için mükemmel çalışır.

+0

Swift 2 + Xcode 7.2.1 'Debug' yapılandırması hedefleniyor 'OS X 10.11' sdk 'mimarisi' x86_64 ', SystemConfiguration.CaptiveNetwork bir çerçeve olarak içe aktarılsa bile "Hata:' CNCopyCurrentNetworkInfo 'kullanılamıyor" konusunda şikayet ediyor. Geçerli SSID'yi nasıl alacağınıza dair herhangi bir öneriniz var mı? –

+0

Bu çerçevelere erişmek için üye merkezindeki temel hazırlık profiline de mi ihtiyacımız var? Bir cihazı ağa yeniden bağlamak için bunları da kullanabilir miyiz? –

0

Swift:

import SystemConfiguration.CaptiveNetwork 

func currentSSIDs() -> [String] { 
     guard let interfaceNames = CNCopySupportedInterfaces() as? [String] else { 
      return [] 
     } 
     return interfaceNames.flatMap { name in 
      guard let info = CNCopyCurrentNetworkInfo(name as CFString) as? [String:AnyObject] else { 
       return nil 
      } 
      guard let ssid = info[kCNNetworkInfoKeySSID as String] as? String else { 
       return nil 
      } 
      return ssid 
     } 
    } 

Sonra print(currentSSIDs()) değil simülatörü üzerinde çalışan tek gerçek cihazlar.

https://forums.developer.apple.com/thread/50302

İlgili konular