How do I use CaptiveNetwork to get the current WiFi Hotspot Name

后端 未结 4 2028
迷失自我
迷失自我 2020-11-28 04:17

I need to get the name of the currently connected Wi-Fi hotspot, e.g. \"BT OpenZone\"

I have been told it can be done with CaptiveNetwork specifically CNCopyCurrentN

相关标签:
4条回答
  • 2020-11-28 04:59

    Easy to use code snippet(method):

    • Add SystemConfiguration.framework

    • import < SystemConfiguration/CaptiveNetwork.h>

    • use the below method

      + (NSString *)GetCurrentWifiHotSpotName {
      
          NSString *wifiName = nil;
          NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
          for (NSString *ifnam in ifs) {
              NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
      
              NSLog(@"info:%@",info);
      
              if (info[@"SSID"]) {
                  wifiName = info[@"SSID"];
              }
          }
          return wifiName;
      }
      
    0 讨论(0)
  • 2020-11-28 05:07

    Note that in Xcode 10 and iOS 12 you now need to enable the "Access Wifi Information" capability.

    Source: https://openradar.appspot.com/43280182

    0 讨论(0)
  • 2020-11-28 05:10

    You need to find out which networks are available, and then pass them into CNCopyCurrentNetworkInfo. For example:

    CFArrayRef myArray = CNCopySupportedInterfaces();
    CFDictionaryRef myDict = CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(myArray, 0));
    

    ...and you can then use the kCNNetworkInfoKeySSID on the dictionary you've got back (myDict) to find out the SSID. Don't forget to release/manage memory appropriately.

    0 讨论(0)
  • 2020-11-28 05:15

    UPDATE FOR iOS 12, swift 4.2

    iOS 12

    You must enable Access WiFi Information from capabilities.

    Important To use this function in iOS 12 and later, enable the Access WiFi Information capability for your app in Xcode. When you enable this capability, Xcode automatically adds the Access WiFi Information entitlement to your entitlements file and App ID. Documentation link

    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"]
                        debugPrint("ssid=\(currentSSID), BSSID=\(BSSID), SSIDDATA=\(SSIDDATA)")
                    }
                }
            }
            return currentSSID
        }
    }
    

    UPDATE FOR iOS 10

    CNCopySupportedInterfaces is no longer deprecated in iOS 10. (API Reference)

    You need to import SystemConfiguration/CaptiveNetwork.h and add SystemConfiguration.framework to your target's Linked Libraries (under build phases).

    Here is a code snippet in swift (RikiRiocma's Answer):

    import Foundation
    import SystemConfiguration.CaptiveNetwork
    
    public class SSID {
        class func fetchSSIDInfo() ->  String {
            var currentSSID = ""
            if 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
                    }
                }
            }
        return currentSSID
        }
    }
    

    (Important: CNCopySupportedInterfaces returns nil on simulator.)

    For Objective-c, see Esad's answer here and below

    + (NSString *)GetCurrentWifiHotSpotName {    
        NSString *wifiName = nil;
        NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
        for (NSString *ifnam in ifs) {
            NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
            if (info[@"SSID"]) {
                wifiName = info[@"SSID"];
            }
        }
        return wifiName;
    }
    

    UPDATE FOR iOS 9

    As of iOS 9 Captive Network is deprecated*. (source)

    *No longer deprecated in iOS 10, see above.

    It's recommended you use NEHotspotHelper (source)

    You will need to email apple at networkextension@apple.com and request entitlements. (source)

    Sample Code (Not my code. See Pablo A's answer):

    for(NEHotspotNetwork *hotspotNetwork in [NEHotspotHelper supportedNetworkInterfaces]) {
        NSString *ssid = hotspotNetwork.SSID;
        NSString *bssid = hotspotNetwork.BSSID;
        BOOL secure = hotspotNetwork.secure;
        BOOL autoJoined = hotspotNetwork.autoJoined;
        double signalStrength = hotspotNetwork.signalStrength;
    }
    

    Side note: Yup, they deprecated CNCopySupportedInterfaces in iOS 9 and reversed their position in iOS 10. I spoke with an Apple networking engineer and the reversal came after so many people filed Radars and spoke out about the issue on the Apple Developer forums.

    0 讨论(0)
提交回复
热议问题