NetworkInterface.GetAllNetworkInterfaces() возвращает интерфейсы с OperationalStatus "Неизвестно" в Xamarin.iOS

Я пишу приложение для iOS, используя Xamarin в Xamarin Studio на MAC. Я использую реализацию uPNP с открытым исходным кодом. В нем они используют NetworkInterface.GetAllNetworkInterfaces(),

Моя проблема в том, что каждый из возвращаемых интерфейсов имеет свои OperationalStatus свойство установлено на "Неизвестно".

В Windows все они установлены на "Вверх" или "Вниз". Однако при использовании Xamarin и выполнении этого же кода на устройстве iOS все интерфейсы имеют OperationalStatus "Неизвестный".

Это приводит к тому, что все они отбрасываются, поскольку ожидается, что хотя бы один из них будет "Вверх". Итак, есть какой-то метод или что-то, что мне нужно сделать, чтобы получить точный OperationStatus на этих интерфейсах?

Я пытаюсь сделать кое-какую кроссплатформенную разработку и не хочу, если это вообще возможно, использовать специальный код uPNP.

Спасибо за твою помощь!!!

1 ответ

Решение

Per 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, я вынужден разрешить принимать "Вверх" или "Неизвестно". Хотя этот подход работает в Windows и iOS, он не работает на устройствах Android. Вызывает разочарование, что такая простая вещь, как получение действительного локального IP-адреса, должна быть такой сложной. Но я думаю, что так обстоят дела на данный момент.

Другие вопросы по тегам