1

我正在 MAC 上的 Xamarin Studio 中使用 Xamarin 编写一个 iOS 应用程序。我正在使用开源 uPNP 实现。在其中,他们使用NetworkInterface.GetAllNetworkInterfaces().

我的问题是每个返回的接口都将其OperationalStatus属性设置为“未知”。

在 Windows 中,所有这些都设置为“向上”或“向下”。但是,当使用 Xamarin 并在 iOS 设备上运行相同的代码时,所有接口都有一个OperationalStatus“未知”。

这导致所有这些都被丢弃,因为它期望至少有一个是“向上”的。那么,是否有一些方法或一些我需要做的事情来获得OperationStatus这些接口的准确信息?

我正在尝试进行一些跨平台开发,如果可能的话,我不想对 uPNP 代码进行特殊处理。

感谢你的协助 !!!

4

1 回答 1

2

每个 Xamarin 支持:

看起来我有一些坏消息: http ://forums.xamarin.com/discussion/1706/system-net-networkinformation-getallnetworkinterfaces-fails 这是一个尚未解决的已知错误。您将不得不进行本地调用以找出 iOS 的网络接口:http:
//docs.xamarin.com/recipes/ios/network/reachability/detect_if_network_is_available 对于这种设备特定代码,您可以查看使用编译器指令# if / #endif 构建跨平台应用程序- 查看第 3 部分和第 5 部分以了解实际设置。您还可以查看我们的示例应用程序,了解如何配置您的项目。

所以这就是我最终做的事情:

    try
    {
        NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();

        foreach (var netInterface in interfaces)
        {
            if ((netInterface.OperationalStatus == OperationalStatus.Up ||
                 netInterface.OperationalStatus == OperationalStatus.Unknown) &&
                (netInterface.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 ||
             netInterface.NetworkInterfaceType == NetworkInterfaceType.Ethernet))
            {
                foreach (var addrInfo in netInterface.GetIPProperties().UnicastAddresses)
                {
                    if (addrInfo.Address.AddressFamily == AddressFamily.InterNetwork)
                    {
                        var ipAddress = addrInfo.Address;
                        CurrentAddressTable.Add(ipAddress);
                    }
                }
            }
        }
    }
    catch (Exception ex)
    {
        Helper.Debug(ex.ToString());
    }

由于 Xamarin 的实现未设置 NetworkInterface.OperationalStatus,因此我被迫允许接受“Up”或“Unknown”。尽管此方法适用于 Windows 和 iOS,但不适用于 Android 设备。令人沮丧的是,获取有效的本地 IP 地址这样简单的事情竟然如此困难。但我想这就是目前的情况。

于 2013-07-25T22:38:10.340 回答