2015-07-31 16 views
8

वर्तमान डिवाइस का SSID प्राप्त करने का प्रयास कर रहा है। मुझे यह कैसे करना है, इस बारे में बहुत सारे उदाहरण मिल गए हैं, हालांकि मैं सीएनसीपी सपोर्टेड इंटरफेस को स्वत: पूर्ण करने के लिए संघर्ष कर रहा हूं। मेरे पास मेरी स्विफ्ट फ़ाइल के शीर्ष पर 'सिस्टम कॉन्फ़िगरेशन' आयात है लेकिन कोई सफलता नहीं है। यह पता लगाना प्रतीत नहीं होता कि मैं क्या गलत कर रहा हूं।स्विफ्ट CNCopySupportedInterfaces मान्य नहीं है

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

आप ऑब्जेक्टिव-सी पता है, यह है:

उत्तर

15

आप की जरूरत है import SystemConfiguration.CaptiveNetwork

कवर के नीचे, CaptiveNetwork एक सी हेडर फाइल (ज) कि SystemConfiguration ढांचे के भीतर है

iPhone get SSID without private library

इसके अलावा, स्वत: पूर्ण: अधिक गहराई में विरासत ग्लोबल्स से खुश नहीं है; यह केवल शीर्ष स्तर पर वर्ग चाहता है। शायद क्योंकि बहुत सारे @ # $ @ # ग्लोबल्स हैं।

ओह, और आप यह काम करने के लिए प्राप्त करने के लिए इस अद्भुत टुकड़ा लिखने के लिए है:

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]!)") 
     } 
    } 

परिशिष्ट स्विफ्ट 2.2 के लिए और 3,0

ब्रिजिंग अभी तक सरलीकृत किया गया है के लिए फिर से जटिल CFxxx डेटाटाइप और अब अनचाहे और बहुत सारे नौकायन की आवश्यकता है लेकिन कोई कॉल नहीं है। मुझे नहीं पता कि स्विफ्ट 2 ने चीजों को आसान बना दिया है, लेकिन यह स्पष्ट रूप से स्पष्ट है कि क्या हो रहा है, साथ ही nil सिम्युलेटर की पहचान करने में हमारी सहायता करता है। दूसरा जवाब गैर-स्विफ्टियन लगता है जो बहुत ही बिट-कास्टिंग और असुरक्षित संचालन का उपयोग करता है, इसलिए मैं इसे पेश करता हूं।

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 
    } 

[इसके अलावा, 10 मिनट के बाद, ऑटो-पूर्ण ने CNxxx के लिए काम करना शुरू कर दिया। जाहिर है एक पृष्ठभूमि धागा जलदी SourceKit में वैश्विक के हजारों पचाने है] सफलता पर

आउटपुट:।

SSIDDATA: < 57696c6d 79>

BSSID: 12: 34: 56: 78: 9a: बीसी

SSID: YourSSIDHere

+0

takeRetainedValue क्या है से लिया()? – Nilesh

+0

यह पुराने सी एपीआई के साथ संगतता के लिए है जो एआरसी द्वारा बनाए गए ऑब्जेक्ट्स का उपयोग नहीं करते हैं। यह ऑब्जेक्ट को एआरसी के तहत प्रबंधन में लाता है, इसलिए जब आपको इसकी आवश्यकता नहीं होती है तो इसे स्वचालित रूप से रिलीज़ किया जाएगा। http://stackoverflow.com/questions/29048826/when-to-use-takeunretainedvalue-or-takeretainedvalue-to-retrieve-unmanaged-o – BaseZen

+0

स्विफ्ट 2.2 – BaseZen

8

स्विफ्ट 2.0 में/iOS 9 एपीआई CaptiveNetwork (लगभग) चले गए या मूल्यह्रास हुआ है। मैंने इस समस्या के बारे में ऐप्पल से संपर्क किया और मैंने सोचा कि हम इसके बजाय NEHotspotHelper का उपयोग कर सकते हैं (या चाहिए)। मैं आज एप्पल से एक जवाब मिला:

CNCopySupportedInterfaces 
CNCopyCurrentNetworkInfo 

उपयोगकर्ता Braime इस समस्या के लिए एक अद्यतन कोड-टुकड़ा पोस्ट पर Ray Wenderlich forums:

एक CaptiveNetwork और दो प्रासंगिक एपीआई (यहां तक ​​कि कठिन वहाँ घिस चिह्नित) उपयोग जारी रखना चाहिए
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 
     } else { 
      currentSSID = "" 
     } 
    } 

मेरे लिए बिल्कुल सही काम करता है।

+0

स्विफ्ट 2 + एक्सकोड 7.2.1 लक्ष्यीकरण कॉन्फ़िगरेशन 'डीबग' के लिए संपादित 'ओएस एक्स 10.11' एसडीके का उपयोग करते हुए आर्किटेक्चर 'x86_64' शिकायत करता है "त्रुटि: 'CNCopyCurrentNetworkInfo' अनुपलब्ध है" भले ही SystemConfiguration.CaptiveNetwork को ढांचे के रूप में आयात किया जाता है। मौजूदा एसएसआईडी कैसे प्राप्त करें इस पर कोई सुझाव? –

+0

क्या हमें इन ढांचे तक पहुंचने के लिए सदस्य केंद्र से प्रावधान प्रोफ़ाइल की भी आवश्यकता है? क्या हम किसी डिवाइस को नेटवर्क से पुन: कनेक्ट करने के लिए इनका उपयोग करने में भी सक्षम हैं? –

0

स्विफ्ट:

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

फिर print(currentSSIDs()), नहीं सिम्युलेटर पर काम कर रहा है, केवल वास्तविक उपकरणों।

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

संबंधित मुद्दे