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-адреса, должна быть такой сложной. Но я думаю, что так обстоят дела на данный момент.