en0永远是iOS设备上的Wi-Fi吗?

时间:2015-08-19 19:41:35

标签: ios network-programming ip

我正在尝试使用getifaddrs()在iOS设备上获取wifi接口的IP地址并搜索en0名称。这工作正常,但它假设en0始终是Wi-Fi。是否有某种方法可以确保我查询的界面是专门用于未来验证的Wi-Fi?

1 个答案:

答案 0 :(得分:1)

我通过查找具有用于wifi站的BSSID的设备来使用以下内容来查找wifi信息。它还有一个SSID。

以下类方法仅返回wifi信息字典。这是一个简单的扩展,也可以返回设备标签(ifname变量)。正如你所注意到的那样,它通常是en0,但这可以作为一种确保你拿起wifi的方法,如果它未来不是en0。

+ (NSDictionary *)getWifiInfo {
    NSDictionary *ret=nil;

    // Get the supported interfaces.
    NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();

    // Find one with a BSSID and return that. This should be the wifi.
    for (NSString *ifnam in ifs) {
        NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);

        NSLog(@"Network device found = %@", info.description);

        if (info[(__bridge NSString *)kCNNetworkInfoKeyBSSID]) {
            // Return this as it should be the right one given it has a MAC address for the station
            ret=info;
        }
    }

    NSLog(@"Exit: returning wifi info = %@", ret.description);

    return ret;
}

一旦你有了基于BSSID的设备标签,你就可以使用getifaddrs来获取它的IP,网关等,知道它是wifi设备。

NB 由于未检测到wifi,因此在iOS模拟器中返回nil,因此在测试时需要一些解决方法代码来满足您的需求。

hacky选项是找到关联MAC为02:00:00:00:00:00的IP地址。 iOS隐藏了编码器的MAC地址,它具有此值。