iOS获取当前无线局域网网络名称

18

我正在寻找一种方法来获取iOS5中Objective-C当前连接的无线局域网网络(至少是名称)的信息。

我们目前正在开发一个应用程序,该应用程序在特定网络上无法运行。在这个网络(我们大学的网络)上,我们需要连接到的端口是关闭的。但是还有另一个可用的网络,我们想告诉用户如果他连接了前面提到的网络,他必须切换到另一个网络。

我甚至不知道从哪里开始。有人有什么想法或任何提示吗?

谢谢和问候。


3
请看这里:https://dev59.com/fG435IYBdhLWcg3w0ThP - Rok Jarc
3个回答

17

2
谢谢。我从来没想过要搜索“SSID”……它完美地运行了! - Chris
1
这在iOS 9.0中已经过时了。有新的方法吗? - Freddy
我没有尝试过,但似乎是合法的:将您的应用程序注册为热点助手:https://dev59.com/XFwZ5IYBdhLWcg3wWfOl#31590787 - Rok Jarc
@OhadM:你链接的答案也使用了已弃用的框架。但是在同一个“线程”中还有另一个答案:https://dev59.com/fG435IYBdhLWcg3w0ThP#33132529 - Rok Jarc
@rokjarc 我已经测试过了,它不起作用。它需要苹果的授权。请测试代码片段,你会看到的。另外,你是正确的,它已经被弃用但仍然可以使用。 - OhadM

12

您可以从Captive Network获取当前的wifi信息。过去,苹果公司曾经禁用了此功能一段时间,但是由于用户强烈要求,他们似乎已经重新启用了该功能。未来也有可能会再次关闭。

我们可以获得的信息包括BSSIDSSIDSSIDDATABSSID是wifi的唯一地址,SSID是当前wifi的名称,SSIDDATASSID的十六进制表示。

对于Swift 3.1:

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

10

从iOS 12开始,您需要在能力中允许Wifi信息访问。

来自Apple

要在iOS 12及更高版本中使用此功能,请在Xcode中为您的应用启用“Access WiFi Information”功能。当您启用此功能时,Xcode会自动将“Access WiFi Information”特权添加到您的特权文件和应用程序ID中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接