使用CNCopyCurrentNetworkInfo的问题

时间:2012-11-06 03:58:04

标签: objective-c ios ios5 ios4 ios6

我使用以下代码检索iPod连接的WiFi网络的SSID。

NSArray *ifs = (id)CNCopySupportedInterfaces();
NSLog(@"%s: Supported interfaces: %@", __func__, ifs);
id info = nil;
for (NSString *ifnam in ifs) {
    info = (id)CNCopyCurrentNetworkInfo((CFStringRef)ifnam);
    NSLog(@"%s: %@ => %@", __func__, ifnam, info);
    if (info && [info count]) {
        break;
    }
    [info release];
}

有时这段代码没有返回我的设备连接的网络的正确SSID。有关为什么没有正确检索SSID的指针? CNCopyCurrentNetworkInfo包是否依赖于iOS版本的设备?

感谢。

3 个答案:

答案 0 :(得分:6)

  1. 将SystemConfiguration.framework添加到项目中。

  2. import < SystemConfiguration/CaptiveNetwork.h >

  3. CFArrayRef myArray = CNCopySupportedInterfaces();
    CFStringRef interfaceName = CFArrayGetValueAtIndex(myArray, 0);
    CFDictionaryRef captiveNtwrkDict = CNCopyCurrentNetworkInfo(interfaceName);
    NSDictionary *dict = ( NSDictionary*) captiveNtwrkDict;
    NSString* ssid = [dict objectForKey:@"SSID"];
    NSLog(@"%s ssid : %@",__FUNCTION__, [ssid description]);
    
  4. 对于 iOS 12 及更高版本,您必须从功能中启用它。

  5.   

    重要   要在iOS 12及更高版本中使用此功能,请在Xcode中为您的应用启用Access WiFi信息功能。启用此功能后,Xcode会自动将Access WiFi信息权利添加到您的权利文件和应用程序ID中。 Documentation link

答案 1 :(得分:0)

是。 CNCopyCurrentNetworkInfo 仅在 iOS 4.1 及更高版本中可用。

有关详细信息,请查看developer.apple SystemConfiguration Reference

您可以查看示例代码here

答案 2 :(得分:0)

从iOS 13开始,CNCopyCurrentNetworkInfo API将不再返回有效的Wi-Fi SSID和BSSID信息。相反,默认情况下返回的信息将是:

SSID:“ Wi-Fi”或“ WLAN”(对于中国SKU,将返回“ WLAN”) BSSID:“ 00:00:00:00:00:00”

如果您的应用使用的是此API,Apple现在建议您采用不需要Wi-Fi或网络信息的替代方法。来自CNCopyCurrentNetworkInfo的有效SSID和BSSID信息仍将提供给VPN应用程序,使用NEHotspotConfiguration配置当前Wi-Fi网络的应用程序以及已获得通过位置服务访问用户位置的权限的应用程序。

您可以在最新的iOS 13 Beta中测试您的应用,以确保其正常运行。如果您的应用需要有效的Wi-Fi SSID和BSSID信息才能运行,则可以执行以下操作: 对于附件设置应用程序,请使用NEHotSpotConfiguration API,该API现在可以选择传递您的应用程序希望连接的SSID热点的前缀。 对于其他类型的应用,请使用CoreLocation API征求用户的同意以访问位置信息。