2015-10-19 6 views
2

Вызов «GetFlags» на NetworkReachability всегда возвращает «Reachable», даже если домен не существует. Я приложу полное тестовое решение, но следующий код должен привести к ошибке «Failed ...», но результат «Success = True».Ошибка Xalarin NetworkReachability недопустима.

Код базируется на образце достижимости.

public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 
     // Perform any additional setup after loading the view, typically from a nib. 

     string host = "http://nonsense.test12345679.com"; 

     using (var r = new SystemConfiguration.NetworkReachability (host)) { 
      NetworkReachabilityFlags flags; 

      if (r.TryGetFlags (out flags)) { 
       _label.Text = "Success = " + IsReachableWithoutRequiringConnection (flags); 
      } else { 
       _label.Text = "Failed to get flags "; 
      } 

     } 
    } 

    public bool IsReachableWithoutRequiringConnection(NetworkReachabilityFlags flags) 
    { 
     // Is it reachable with the current network configuration? 
     bool isReachable = (flags & NetworkReachabilityFlags.Reachable) != 0; 

     // Do we need a connection to reach it? 
     bool noConnectionRequired = (flags & NetworkReachabilityFlags.ConnectionRequired) == 0 
      || (flags & NetworkReachabilityFlags.IsWWAN) != 0; 

     return isReachable && noConnectionRequired; 
    } 

Если переключить устройство в режим полета, то достижимости правильно возвращается как ложное.

Я тестирую iPad iPad, iOS 9.0.2 и новейший стабильный Xamarin.

ответ

4

Я не использовал эту функцию напрямую; но вы попробовали пакет nuget для подключения? https://github.com/jamesmontemagno/Xamarin.Plugins/tree/master/Connectivity. Я пробовал это, и, похоже, он работает очень хорошо. У этого есть методы для проверки, достижима ли конкретная конечная точка.

bool canConnect = CrossConnectivity.Current.IsConnected 
    && await CrossConnectivity.Current.IsRemoteReachable(host, portInt)); 
+0

Похоже, он использует тот же класс достижимости с некоторыми дополнительными тестами сокетов в классе подключения по протоколу HTTPS: // GitHub .com/jamesmontemagno/Xamarin.Plugins/дерево/ведущий/Связь/Связь/Connectivity.Plugin.iOS. Можете ли вы использовать плагины без Xamarin.Forms? –

+0

Да. Некоторые плагины предназначены специально для Xamarin.Forms, а другие могут использоваться в любом приложении Xamarin. – valdetero

4

рамки конфигурации системы Иос Reachability делает не на самом деле проверить, если хост жив (т.е. это не пинг/ICMP/HTTP/... тест, основанный).

Удаленный хост считается достижимым , когда пакет данных, посланный приложением в сетевой стек, может оставить локальное устройство. Досягаемость не гарантирует, что пакет данных фактически будет , принимаемый хостом.

iOS SCNetworkReachability Reference

Также хороший SO A/Q на о достижимости флагов: How to interpret NetworkReachabilityFlags in Xamarin.iOS?

+0

Я не использую SCNetworkReachability. Я основываю свою реализацию на образце кода Xamarin, который правильно управляет флагами. https://github.com/xamarin/monotouch-samples/blob/master/ReachabilitySample/reachability.cs –

+0

? ... SystemConfiguration.NetworkReachability Class - это оболочка для родного класса iOS – SushiHangover

+0

А, моя ошибка. Я до сих пор не верю, что мой пример должен привести к появлению «Reachable», поскольку пакет данных не сможет покинуть устройство. –

Смежные вопросы