【问题标题】:How to get Wifi SSID in iOS9 after CaptiveNetwork is deprecated and calls for Wifi name are already blocked不推荐使用 CaptiveNetwork 并且已阻止对 Wifi 名称的调用后如何在 iOS9 中获取 Wifi SSID
【发布时间】:2015-10-11 21:16:12
【问题描述】:

直到今天我使用 CaptiveNetwork 接口来显示当前连接的 Wifi 的名称。 iOS 9 Prerelease 参考已经指出,CaptiveNetwork 方法现在已被弃用,但它们在开始时仍然有效。

使用最新版本,Apple 似乎已经阻止了此呼叫(可能是出于隐私考虑?)。

还有其他方法可以获取当前Wifi的名字吗?

这是我直到今天才获得 SSID 的方式,但你现在只得到 nil:

#import <SystemConfiguration/CaptiveNetwork.h>

NSString *wifiName = nil;  
NSArray *interFaceNames = (__bridge_transfer id)CNCopySupportedInterfaces(); 

for (NSString *name in interFaceNames) { 
    NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)name); 

    if (info[@"SSID"]) { 
        wifiName = info[@"SSID"]; 
    } 
} 

【问题讨论】:

    标签: ios objective-c cocoa-touch ios9


    【解决方案1】:

    现在应该可以在 iOS 13.3 上使用。我正在使用一个相关的 Pod 库,它使用 Objc 中的确切函数和一个 Swift 包装器。

    https://github.com/Feghal/FGRoute

    【讨论】:

    • 太棒了!但是我现在如何获取列表呢?
    • @ink 您无法从 iOS 获取 Wifi 列表。看到这个线程。 stackoverflow.com/questions/49525912/… 我正在使用的解决方案是一个硬件设备,它在板上有一个站立式 wifi 接入点和一个 REST 服务。它获取 wifi 列表并通过 REST 返回它。这是一个物联网用例,例如远程开门器应用程序。
    【解决方案2】:

    CaptiveNetwork 仍在运行。但是你需要添加这个:

    com.apple.developer.networking.wifi-info = true 在您的 Entitlements.plist 中。

    另外,您需要在 App ID 中启用访问 WiFi 信息 加入您的 developer.apple.com 门户。

    请务必在应用 ID 中启用“访问 WiFi 信息”选项后生成新的配置文件以清理您的环境。

    【讨论】:

      【解决方案3】:

      即使对于 Swift 4.1 和 4.2,abdullahselek 的回答仍然是正确的。

      需要注意的是,现在在 iOS 12 中,您必须转到应用项目的功能部分并启用 访问 WiFi 信息 功能。它将为您的项目添加一个权利条目,并允许函数调用CNCopyCurrentNetworkInfo 正常工作。

      如果您不这样做,该函数只会返回 nil。运行时不会显示有关缺少权利的错误或警告。

      有关详细信息,请参阅下面指向 Apple 文档的链接。

      https://developer.apple.com/documentation/systemconfiguration/1614126-cncopycurrentnetworkinfo

      【讨论】:

      • 谢谢!
      • 很高兴它帮助了你,布兰登。我第一次弄乱它时确实令人沮丧,因为它没有抛出任何错误或提供有关它最初无法正常工作的原因的信息。
      • 另外,应用程序应该向 CLLocationManager 请求权限,否则它也不会工作。
      【解决方案4】:

      如前所述,CaptiveNetwork 可以很好地与 Xcode 8.3 及更高版本配合使用。以下是 Swift 3Swift 4Objective-C 的代码 sn-ps。

      Swift 3 和 4

      import SystemConfiguration.CaptiveNetwork
      
      internal class SSID {
      
          class func fetchSSIDInfo() -> [String: Any] {
              var interface = [String: Any]()
              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 interface
                      }
                      guard let interfaceData = unsafeInterfaceData as? [String: Any] else {
                          return interface
                      }
                      interface = interfaceData
                  }
              }
              return interface
          }
      
      }
      

      Objective-C

      #import <SystemConfiguration/CaptiveNetwork.h>
      
      + (NSDictionary *)fetchSSIDInfo
      {
          NSArray *interFaceNames = (__bridge_transfer id)CNCopySupportedInterfaces();
          for (NSString *name in interFaceNames)
          {
              NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)name);
              return info;
          }
          return nil;
      }
      

      【讨论】:

      • 我可以使用CaptiveNetwork 获取来自 wifi 网络的接收信号强度指示器 (RSSI) 以及 SSID 吗?是否有任何示例代码?我在 Xcode 9.0.1 中使用 Objective-C。
      • 据我所知,在不使用 NEHotspotHelper 的应用程序中无法获取 wifi 信号强度。您可以从 NEHotspotNetworksignalStrength 属性中找到信号强度。
      • It 建议我需要获得 Apple 的许可才能使用NEHotspotHelper。这是真的吗?我编写我的 iOS 应用程序仅供研究使用(我不会在 App Store 中提交),因此我没有支付 iOS 证书。我还能用NEHotspotHelper吗?
      • 是的,这是真的。我认为你不能使用。
      • 从 iOS 13 开始,CNCopyCurrentNetworkInfo API 将不再返回有效的 Wi-Fi SSID 和 BSSID 信息。相反,默认返回的信息为: SSID:“Wi-Fi”或“WLAN”(中国 SKU 将返回“WLAN”) BSSID:“00:00:00:00:00:00”跨度>
      【解决方案5】:

      在 2017 年 4 月 27 日确认,Captive Network 仍在为 Swift 3.1XCode 8.3 工作

      对于 Swift > 3.0

      func printCurrentWifiInfo() {
        if let interface = CNCopySupportedInterfaces() {
          for i in 0..<CFArrayGetCount(interface) {
            let interfaceName: UnsafeRawPointer = CFArrayGetValueAtIndex(interface, i)
            let rec = unsafeBitCast(interfaceName, to: AnyObject.self)
            if let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)" as CFString), let interfaceData = unsafeInterfaceData as? [String : AnyObject] {
              // connected wifi
              print("BSSID: \(interfaceData["BSSID"]), SSID: \(interfaceData["SSID"]), SSIDDATA: \(interfaceData["SSIDDATA"])")
            } else {
              // not connected wifi
            }
          }
        }
      }
      

      对于Objective-C

      NSArray *interFaceNames = (__bridge_transfer id)CNCopySupportedInterfaces();
      
      for (NSString *name in interFaceNames) {
        NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)name);
      
        NSLog(@"wifi info: bssid: %@, ssid:%@, ssidData: %@", info[@"BSSID"], info[@"SSID"], info[@"SSIDDATA"]);
       }
      

      【讨论】:

        【解决方案6】:

        CaptiveNetwork 仍在运行。由于许多请求,Apple 可能已恢复 API。

        使用 CaptiveNetwork 我们可以获得 WiFi 网络的 SSID。 它甚至可以在 iOS 10 中使用。

        #import <SystemConfiguration/CaptiveNetwork.h>
        
        NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)name);
        

        这是输出:

        Printing description of info:
        {
            BSSID = "5*:**:**:**:**:**";
            SSID = Cisco12814;
            SSIDDATA = <43697363 6f313238 3134>;
        }
        

        【讨论】:

        • 你好,我想知道 SSIDDATA 是什么意思。谢谢^_^
        • SSIDDATA 是 SSID 的十六进制表示。
        • @Ranjith 我们可以使用CaptiveNetwork 获得接收信号强度指示 (RSSI) 和 SSID 吗?请提供任何示例代码。
        【解决方案7】:

        将您的应用注册为热点助手。

        #import <NetworkExtension/NetworkExtension.h>  
        
        NSArray * networkInterfaces = [NEHotspotHelper supportedNetworkInterfaces];  
        NSLog(@"Networks %@",networkInterfaces);  
        

        更新(2015 年 9 月 11 日)

        以下 Captive Network API 已在最新版本的 iOS 9 中重新启用。

        • CNCopySupportedInterfaces
        • CNCopyCurrentNetworkInfo

        更新(2015 年 9 月 16 日)

        如果您仍然喜欢使用NetworkExtension 并且Apple 允许您添加权利,那么您可以这样做来获取wifi 信息:

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

        NetworkExtension 为您提供一些额外的信息,例如安全、自动连接或信号强度。当用户扫描周围的 wifi 时,它还允许您在后台模式下将凭据设置为 wifi。

        【讨论】:

        • 好的,这似乎是一种可能的方式。但是,如果我们被允许使用热点帮助程序权利来显示当前的 WiFi SSID,这是值得怀疑的,因为需要通过电子邮件从苹果公司请求这些权利。你已经这样用过了吗?
        • 它不工作......它返回 NIL 就像 CNCopySupportedInterfaces() 一样
        • 您首先需要通过电子邮件forums.developer.apple.com/message/30657#30657将您的应用注册为热点助手
        • @Forke lewiguez 是第一个回答 Apple 已重新启用旧方法的人。如果您不是热点助手应用程序,Apple 会拒绝热点助手权利请求。因此,lewiguez 几乎在苹果给我写邮件的同时回答了这个问题,说我不会获得权利,但由于收到大量请求,他们重新激活了旧方法。
        • 我不确定,您能否通过分发配置文件使用内部应用程序中的权利?我还没有找到有关这方面的信息,似乎无法使其工作......
        【解决方案8】:

        在 iOS 9 的 GM 中,似乎再次启用了此功能。事实上,它甚至没有在在线文档中被列为已弃用,但是 CaptiveNetwork 头文件确实具有以下内容:

        CNCopySupportedInterfaces (void) __OSX_AVAILABLE_BUT_DEPRECATED_MSG(__MAC_10_8, __MAC_NA, __IPHONE_4_1, __IPHONE_9_0, CN_DEPRECATION_NOTICE);
        

        所以,它可以在 iOS 9 GM 中运行,但不确定能持续多久 :)

        【讨论】:

        • 是的,刚刚用我们的应用程序检查过。在测试版中,它被禁用了。唷。
        • 是的,甚至收到了 Apple 关于我的问题的邮件回复,他们在最新版本中重新启用了它。 :)
        • 在在线文档中列为已弃用:developer.apple.com/library/prerelease/ios/documentation/…
        • 现在没有启用!在最终版本中,它似乎被打破了。
        • @MatterGoal 在最终版本中运行良好。
        猜你喜欢
        • 2011-06-10
        • 2019-03-01
        • 1970-01-01
        • 2021-02-05
        • 2012-11-05
        • 2020-02-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多